Add tests and minor fixes to the xFindFunction method of virtual tables. (CVS 3323)

FossilOrigin-Name: 3c4233e074cb016e2422b2e8f867c99217e9b10e
diff --git a/manifest b/manifest
index a249723..0885e29 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Allow\svirtual\stable\simplementations\sto\soverload\sfunction\sthat\suse\na\scolumn\sof\sthe\svirtual\stable\sas\stheir\sfirst\sargument.\s\sUntested.\s(CVS\s3322)
-D 2006-07-08T17:06:44
+C Add\stests\sand\sminor\sfixes\sto\sthe\sxFindFunction\smethod\sof\svirtual\stables.\s(CVS\s3323)
+D 2006-07-08T18:09:15
 F Makefile.in 9c2a76055c305868cc5f5b73e29a252ff3632c0a
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -72,7 +72,7 @@
 F src/select.c 380fa06c99ae01050c0054c4b1db91e9f1d8322d
 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
 F src/shell.c 359551ab5cdd8f8fe5f3fe170fd330b108b08d7d
-F src/sqlite.h.in 6d96fe902d2311e007ead5d52c9f0b9f5bdc5ad9
+F src/sqlite.h.in 432848ac7f8d7e6fea727668acccec62bdd86cc4
 F src/sqlite3ext.h c611255287e9a11ce4f1fe6251c2a0b9d32a828b
 F src/sqliteInt.h ea16faa3efec989f82b8ef778aca2867440cb817
 F src/table.c d8817f43a6c6bf139487db161760b9e1e02da3f1
@@ -84,7 +84,7 @@
 F src/test5.c 7162f8526affb771c4ed256826eee7bb9eca265f
 F src/test6.c 60a02961ceb7b3edc25f5dc5c1ac2556622a76de
 F src/test7.c 03fa8d787f6aebc6d1f72504d52f33013ad2c8e3
-F src/test8.c 32b800e733fc80c5d847b6d2a17d4c60b1c4418c
+F src/test8.c 56d891ac9a37d1e1e941d9da7307e8d757a7b8e1
 F src/test_async.c e3deaedd4d86a56391b81808fde9e44fbd92f1d3
 F src/test_loadext.c 22065d601a18878e5542191001f0eaa5d77c0ed8
 F src/test_md5.c 6c42bc0a3c0b54be34623ff77a0eec32b2fa96e3
@@ -104,7 +104,7 @@
 F src/vdbeaux.c 51722bb3661f2d836c1a7a8e7eac242859ddbd07
 F src/vdbefifo.c 9efb94c8c3f4c979ebd0028219483f88e57584f5
 F src/vdbemem.c 5f0afe3b92bb2c037f8d5d697f7c151fa50783a3
-F src/vtab.c 3fe6879f4a41606814a4eb2b9c0623fb1d2ab522
+F src/vtab.c 34b20b011147ca6df6bda565f7c791760698279f
 F src/where.c 75a89957fcb8c068bec55caa4e9d2ed5fa0b0724
 F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -293,7 +293,7 @@
 F test/vacuum2.test 5aea8c88a65cb29f7d175296e7c819c6158d838c
 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102
 F test/view.test 16e2774fe35e47a07ac4471b7f0bcc948b1aa6d5
-F test/vtab1.test d78c94f5ebe6947f1509280a533ac1ffe7a84dba
+F test/vtab1.test 21df0e83d84833e3be632f9abcc21a841e9e2dd1
 F test/vtab2.test bd6d6f3dc0403f42a63a63e3319e0a689d27dd4f
 F test/vtab3.test f38d6d7d19f08bffdadce4d5b8cba078f8118587
 F test/vtab4.test 4b4293341443839ef6dc02f8d9e614702a6c67ff
@@ -375,7 +375,7 @@
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P ce96b890bbf2f2b9686e19bbb1111a70f6404cb5
-R e6cc629faa8ff4cdd0448656216aa349
+P 12cc7af4b6b8b4f1a43d962fbafde8cba683a907
+R 2fab828be3eb12f68e21ff1288415845
 U drh
-Z d47bc48adf9981452a2ffd38517818f3
+Z 993e9850eaafb9f5a52c01a397f141bb
diff --git a/manifest.uuid b/manifest.uuid
index e79290a..1a667b3 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-12cc7af4b6b8b4f1a43d962fbafde8cba683a907
\ No newline at end of file
+3c4233e074cb016e2422b2e8f867c99217e9b10e
\ No newline at end of file
diff --git a/src/sqlite.h.in b/src/sqlite.h.in
index b5fce85..70cb8dd 100644
--- a/src/sqlite.h.in
+++ b/src/sqlite.h.in
@@ -12,7 +12,7 @@
 ** This header file defines the interface that the SQLite library
 ** presents to client programs.
 **
-** @(#) $Id: sqlite.h.in,v 1.186 2006/07/08 17:06:44 drh Exp $
+** @(#) $Id: sqlite.h.in,v 1.187 2006/07/08 18:09:15 drh Exp $
 */
 #ifndef _SQLITE3_H_
 #define _SQLITE3_H_
@@ -1566,8 +1566,8 @@
   int (*xCommit)(sqlite3_vtab *pVTab);
   int (*xRollback)(sqlite3_vtab *pVTab);
   int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName,
-                       int (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
-                       void **ppArg, int *piPrefEnc);
+                       void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
+                       void **ppArg);
 };
 
 /*
diff --git a/src/test8.c b/src/test8.c
index bcacf98..3a639d9 100644
--- a/src/test8.c
+++ b/src/test8.c
@@ -13,7 +13,7 @@
 ** is not included in the SQLite library.  It is used for automated
 ** testing of the SQLite library.
 **
-** $Id: test8.c,v 1.39 2006/07/08 17:06:44 drh Exp $
+** $Id: test8.c,v 1.40 2006/07/08 18:09:15 drh Exp $
 */
 #include "sqliteInt.h"
 #include "tcl.h"
@@ -897,6 +897,65 @@
 }
 
 /*
+** Implementation of "GLOB" function on the echo module.  Pass
+** all arguments to the ::echo_glob_overload procedure of TCL
+** and return the result of that procedure as a string.
+*/
+static void overloadedGlobFunction(
+  sqlite3_context *pContext,
+  int nArg,
+  sqlite3_value **apArg
+){
+  Tcl_Interp *interp = sqlite3_user_data(pContext);
+  Tcl_DString str;
+  int i;
+  int rc;
+  Tcl_DStringInit(&str);
+  Tcl_DStringAppendElement(&str, "::echo_glob_overload");
+  for(i=0; i<nArg; i++){
+    Tcl_DStringAppendElement(&str, (char*)sqlite3_value_text(apArg[i]));
+  }
+  rc = Tcl_Eval(interp, Tcl_DStringValue(&str));
+  Tcl_DStringFree(&str);
+  if( rc ){
+    sqlite3_result_error(pContext, Tcl_GetStringResult(interp), -1);
+  }else{
+    sqlite3_result_text(pContext, Tcl_GetStringResult(interp),
+                        -1, SQLITE_TRANSIENT);
+  }
+  Tcl_ResetResult(interp);
+}
+
+/*
+** This is the xFindFunction implementation for the echo module.
+** SQLite calls this routine when the first argument of a function
+** is a column of an echo virtual table.  This routine can optionally
+** override the implementation of that function.  It will choose to
+** do so if the function is named "glob", and a TCL command named
+** ::echo_glob_overload exists.
+*/
+static int echoFindFunction(
+  sqlite3_vtab *vtab,
+  int nArg,
+  const char *zFuncName,
+  void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
+  void **ppArg
+){
+  echo_vtab *pVtab = (echo_vtab *)vtab;
+  Tcl_Interp *interp = pVtab->interp;
+  Tcl_CmdInfo info;
+  if( strcmp(zFuncName,"glob")!=0 ){
+    return 0;
+  }
+  if( Tcl_GetCommandInfo(interp, "::echo_glob_overload", &info)==0 ){
+    return 0;
+  }
+  *pxFunc = overloadedGlobFunction;
+  *ppArg = interp;
+  return 1;
+}
+
+/*
 ** A virtual table module that merely "echos" the contents of another
 ** table (like an SQL VIEW).
 */
@@ -919,7 +978,7 @@
   echoSync,                  /* xSync - sync transaction */
   echoCommit,                /* xCommit - commit transaction */
   echoRollback,              /* xRollback - rollback transaction */
-  0,                         /* xFindMethod - function overloading */
+  echoFindFunction,          /* xFindFunction - function overloading */
 };
 
 /*
diff --git a/src/vtab.c b/src/vtab.c
index 5a3a6d7..0f35af6 100644
--- a/src/vtab.c
+++ b/src/vtab.c
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains code used to help implement virtual tables.
 **
-** $Id: vtab.c,v 1.26 2006/07/08 17:06:44 drh Exp $
+** $Id: vtab.c,v 1.27 2006/07/08 18:09:15 drh Exp $
 */
 #ifndef SQLITE_OMIT_VIRTUALTABLE
 #include "sqliteInt.h"
@@ -594,9 +594,8 @@
   Table *pTab;
   sqlite3_vtab *pVtab;
   sqlite3_module *pMod;
-  int (*xFunc)(sqlite3_context*,int,sqlite3_value**);
+  void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
   void *pArg;
-  int iEnc;
   int rc;
   FuncDef *pNew;
 
@@ -614,7 +613,7 @@
  
   /* Call the xFuncFunction method on the virtual table implementation
   ** to see if the implementation wants to overload this function */
-  if( pMod->xFindFunction(pVtab, nArg, pDef->zName, &xFunc, &pArg, &iEnc)==0 ){
+  if( pMod->xFindFunction(pVtab, nArg, pDef->zName, &xFunc, &pArg)==0 ){
     return pDef;
   }
 
@@ -628,7 +627,6 @@
   strcpy(pNew->zName, pDef->zName);
   pNew->xFunc = xFunc;
   pNew->pUserData = pArg;
-  pNew->iPrefEnc = iEnc;
   pNew->flags |= SQLITE_FUNC_EPHEM;
   return pNew;
 }
diff --git a/test/vtab1.test b/test/vtab1.test
index 7dbaf64..dbc5e19 100644
--- a/test/vtab1.test
+++ b/test/vtab1.test
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is creating and dropping virtual tables.
 #
-# $Id: vtab1.test,v 1.33 2006/06/24 11:51:35 danielk1977 Exp $
+# $Id: vtab1.test,v 1.34 2006/07/08 18:09:15 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -833,5 +833,29 @@
   xFilter {SELECT rowid, * FROM 'r'}    \
 ]
 
-finish_test
 
+# Testing the xFindFunction interface
+#
+do_test vtab1.11-1 {
+  execsql {
+    INSERT INTO r(a,b,c) VALUES(1,'?',99);
+    INSERT INTO r(a,b,c) VALUES(2,3,99);
+    SELECT a GLOB b FROM e
+  }
+} {1 0}
+proc ::echo_glob_overload {a b} {
+ return [list $b $a]
+}
+do_test vtab1.11-2 {
+  execsql {
+    SELECT a like b FROM e
+  }
+} {0 0}
+do_test vtab1.11-3 {
+  execsql {
+    SELECT a glob b FROM e
+  }
+} {{1 ?} {2 3}}
+
+
+finish_test