From dff6c173ddbea02bf2eca8c344cd0b15c8cbeedb Mon Sep 17 00:00:00 2001
From: drh <drh@noemail.net>
Date: Thu, 7 May 2009 13:43:49 +0000
Subject: [PATCH] Change the sqlite3_create_function() family of routines to
 return SQLITE_MISUSE instead of SQLITE_ERROR if their parameters are
 incorrect. (CVS 6617)

FossilOrigin-Name: 866f13e28c6fdb98947e1c7a89b7855bb5bbdb96
---
 manifest        | 14 +++++++-------
 manifest.uuid   |  2 +-
 src/main.c      |  5 ++---
 src/test_func.c | 34 +++++++++-------------------------
 4 files changed, 19 insertions(+), 36 deletions(-)

diff --git a/manifest b/manifest
index d6c5ad619c..8476d64229 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\ssure\sthe\siteration\scounter\son\saggregate\sfunctions\sis\sreset\seach\ntime\sthe\saggregate\sis\sused\sin\san\scorrelated\ssubquery.\s\sTicket\s#3841.\s(CVS\s6616)
-D 2009-05-07T12:17:34
+C Change\sthe\ssqlite3_create_function()\sfamily\sof\sroutines\sto\sreturn\nSQLITE_MISUSE\sinstead\sof\sSQLITE_ERROR\sif\stheir\sparameters\sare\sincorrect.\s(CVS\s6617)
+D 2009-05-07T13:43:49
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -125,7 +125,7 @@ F src/insert.c 050536ea91c6cf74d87a2386b5da241141943c94
 F src/journal.c e00df0c0da8413ab6e1bb7d7cab5665d4a9000d0
 F src/legacy.c 9a56cf126ceee332b56061bf16bd0fb4ff9e26c0
 F src/loadext.c 3f96631089fc4f3871a67f02f2e4fc7ea4d51edc
-F src/main.c 3f62ff8433aba8f46fc61ba4ae637633c5c5f26d
+F src/main.c c28ad5265f8f488f8e69e4ed67ce5ce3b7637d54
 F src/malloc.c 7b3b6423f5b355e5d649b91e16ef252d610bcf19
 F src/mem0.c f2f84062d1f35814d6535c9f9e33de3bfb3b132c
 F src/mem1.c e6d5c23941288df8191b8a98c28e3f57771e2270
@@ -182,7 +182,7 @@ F src/test_backup.c 1384a18985a5a2d275c2662e48473bf1542ebd08
 F src/test_btree.c d7b8716544611c323860370ee364e897c861f1b0
 F src/test_config.c a05378089b6773ba36b85727dedf9ec0a16424ce
 F src/test_devsym.c 9f4bc2551e267ce7aeda195f3897d0f30c5228f4
-F src/test_func.c dd7bcaafb4e149702b506ede125ef6a4d4f6c471
+F src/test_func.c b8140bc4ed0d290d5e22972eb2a3bfd40aa798dc
 F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f
 F src/test_journal.c 28673a22c9cf5d258c153b788340fa1e1ec40b8b
 F src/test_loadext.c 97dc8800e46a46ed002c2968572656f37e9c0dd9
@@ -729,7 +729,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 469ad1ded35f5ff8ab2f6e8f776d73a9cea73527
-R 14d435ec45cde23b6f0971f656f78d43
+P 4a86de35d57a0c8720772c29431c86cd9be1fb9b
+R b61ac87edee6b8ff3347fa8f0c7bf800
 U drh
-Z a7e2bcfe217f4defe8fe1346f0212cfb
+Z 2f0cc6606171479d0e8b1fae806b15ae
diff --git a/manifest.uuid b/manifest.uuid
index 83bb4d331b..5b1e3d8bdd 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-4a86de35d57a0c8720772c29431c86cd9be1fb9b
\ No newline at end of file
+866f13e28c6fdb98947e1c7a89b7855bb5bbdb96
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 6626d152a2..92fc864fad 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.548 2009/05/06 19:03:14 drh Exp $
+** $Id: main.c,v 1.549 2009/05/07 13:43:49 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -931,8 +931,7 @@ int sqlite3CreateFunc(
       (!xFunc && (!xFinal && xStep)) ||
       (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
       (255<(nName = sqlite3Strlen30( zFunctionName))) ){
-    sqlite3Error(db, SQLITE_ERROR, "bad parameters");
-    return SQLITE_ERROR;
+    return SQLITE_MISUSE;
   }
   
 #ifndef SQLITE_OMIT_UTF16
diff --git a/src/test_func.c b/src/test_func.c
index 275359e387..c8990cc836 100644
--- a/src/test_func.c
+++ b/src/test_func.c
@@ -12,7 +12,7 @@
 ** Code for testing all sorts of SQLite interfaces.  This code
 ** implements new SQL functions used by the test scripts.
 **
-** $Id: test_func.c,v 1.14 2009/03/19 18:51:07 danielk1977 Exp $
+** $Id: test_func.c,v 1.15 2009/05/07 13:43:49 drh Exp $
 */
 #include "sqlite3.h"
 #include "tcl.h"
@@ -393,39 +393,25 @@ static int abuse_create_function(
   if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
 
   rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep,tStep,tFinal);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep, tStep, 0);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep, 0, tFinal);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, 0, 0, tFinal);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, 0, tStep, 0);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", -2, SQLITE_UTF8, 0, tStep, 0, 0);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "tx", 128, SQLITE_UTF8, 0, tStep, 0, 0);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   rc = sqlite3_create_function(db, "funcxx"
        "_123456789_123456789_123456789_123456789_123456789"
@@ -434,9 +420,7 @@ static int abuse_create_function(
        "_123456789_123456789_123456789_123456789_123456789"
        "_123456789_123456789_123456789_123456789_123456789",
        1, SQLITE_UTF8, 0, tStep, 0, 0);
-  if( rc!=SQLITE_ERROR ) goto abuse_err;
-  if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err;
-  if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err;
+  if( rc!=SQLITE_MISUSE ) goto abuse_err;
 
   /* This last function registration should actually work.  Generate
   ** a no-op function (that always returns NULL) and which has the