1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

The new function code passes regression tests. (CVS 403)

FossilOrigin-Name: b00cf110b1cc671b7200a5ce8b9e704f660763c9
This commit is contained in:
drh
2002-02-28 03:04:48 +00:00
parent f55f25f02f
commit 89425d5e02
7 changed files with 44 additions and 42 deletions

View File

@ -1,5 +1,5 @@
C Fix\sthe\scoredump.\s\sThere\sare\sstill\sproblems\sin\sthe\stest\ssuite\sthough.\s(CVS\s402) C The\snew\sfunction\scode\spasses\sregression\stests.\s(CVS\s403)
D 2002-02-28T01:46:12 D 2002-02-28T03:04:48
F Makefile.in 50f1b3351df109b5774771350d8c1b8d3640130d F Makefile.in 50f1b3351df109b5774771350d8c1b8d3640130d
F Makefile.template 89e373b2dad0321df00400fa968dc14b61a03296 F Makefile.template 89e373b2dad0321df00400fa968dc14b61a03296
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
@ -23,8 +23,8 @@ F src/btree.c 495275fe14f3b718cf2f691dce979d4c0e1f8e5d
F src/btree.h 8abeabfe6e0b1a990b64fa457592a6482f6674f3 F src/btree.h 8abeabfe6e0b1a990b64fa457592a6482f6674f3
F src/build.c 7ada2426caba70cb1072ba268bedb694b5018065 F src/build.c 7ada2426caba70cb1072ba268bedb694b5018065
F src/delete.c 950d8f9097361419f1963875f9943344b469cf02 F src/delete.c 950d8f9097361419f1963875f9943344b469cf02
F src/expr.c 173965f4d1ef4469ae3aa83b1240f7cb8d2a3846 F src/expr.c b70bedaffd27ea24c5c2a197a88b07e82dfa4967
F src/func.c 2a607655d2aa8f1cb2179964c9ded3bbeab6b683 F src/func.c 14ac2dfa1845a9b12bf71557ae3a179d32902abe
F src/hash.c cc259475e358baaf299b00a2c7370f2b03dda892 F src/hash.c cc259475e358baaf299b00a2c7370f2b03dda892
F src/hash.h dca065dda89d4575f3176e75e9a3dc0f4b4fb8b9 F src/hash.h dca065dda89d4575f3176e75e9a3dc0f4b4fb8b9
F src/insert.c 164d2d5e943268a8ff0594e1947599e04df0ce11 F src/insert.c 164d2d5e943268a8ff0594e1947599e04df0ce11
@ -51,7 +51,7 @@ F src/threadtest.c 81f0598e0f031c1bd506af337fdc1b7e8dff263f
F src/tokenize.c 4b5d30590a744b9bb5605a92d1f620ab2e7e75af F src/tokenize.c 4b5d30590a744b9bb5605a92d1f620ab2e7e75af
F src/update.c 18971d265b0341574b7e3f73116e7947ddab0997 F src/update.c 18971d265b0341574b7e3f73116e7947ddab0997
F src/util.c 1c01f0a54a77ae9fb638d026d18093ee1b61e3b3 F src/util.c 1c01f0a54a77ae9fb638d026d18093ee1b61e3b3
F src/vdbe.c b7dda08abdcdbdb4996fc58e702f2ac140c4433e F src/vdbe.c 26a2b62f1d5d0806bd301413327efc85944ae40c
F src/vdbe.h 8ab845e63e196e8eb5e51ce69f43b233e51db07e F src/vdbe.h 8ab845e63e196e8eb5e51ce69f43b233e51db07e
F src/where.c 664be01b0ce9ffaecbde609afbd4d8d3e5ed1585 F src/where.c 664be01b0ce9ffaecbde609afbd4d8d3e5ed1585
F test/all.test 7a8a8a7a579ed2bb4d8976d55402f21eacd58049 F test/all.test 7a8a8a7a579ed2bb4d8976d55402f21eacd58049
@ -63,7 +63,7 @@ F test/conflict.test c794c6c8f6e59918107dbab2d201ae454bb47db8
F test/copy.test b3cefcb520c64d7e7dfedbab06b4d4c31fa5b99a F test/copy.test b3cefcb520c64d7e7dfedbab06b4d4c31fa5b99a
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8 F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
F test/expr.test c8a495050dcec3f9e68538c3ef466726933302c1 F test/expr.test c8a495050dcec3f9e68538c3ef466726933302c1
F test/func.test 51dbe3f8a4c28972751697423e6acc5d6b551df1 F test/func.test 13572d84cb0f5d4dbd9a51bf767eac047e6f9779
F test/in.test c09312672e3f0709fa02c8e2e9cd8fb4bd6269aa F test/in.test c09312672e3f0709fa02c8e2e9cd8fb4bd6269aa
F test/index.test c8a471243bbf878974b99baf5badd59407237cf3 F test/index.test c8a471243bbf878974b99baf5badd59407237cf3
F test/insert.test c36d534a4ab58c2cd452a273e51b2b0dd1ede1f9 F test/insert.test c36d534a4ab58c2cd452a273e51b2b0dd1ede1f9
@ -82,7 +82,7 @@ F test/printf.test 3cb415073754cb8ff076f26173143c3cd293a9da
F test/quick.test 6f023c7a73fc413e6d65b7a1879c79764038dc05 F test/quick.test 6f023c7a73fc413e6d65b7a1879c79764038dc05
F test/quote.test 286db944717afa9a9bf829dd85e59185c65d5435 F test/quote.test 286db944717afa9a9bf829dd85e59185c65d5435
F test/rowid.test 4c55943300cddf73dd0f88d40a268cab14c83274 F test/rowid.test 4c55943300cddf73dd0f88d40a268cab14c83274
F test/select1.test 7d5ae792d6dbfa2c1b6345a32b154b7ba8d24bbc F test/select1.test 72328eb569399e2075a0ce0d84d67df93f27eef2
F test/select2.test ed2c1882857106b85478f54f67000e14966be4c4 F test/select2.test ed2c1882857106b85478f54f67000e14966be4c4
F test/select3.test 9469c332250a75a0ef1771fb5da62dc04ec77f18 F test/select3.test 9469c332250a75a0ef1771fb5da62dc04ec77f18
F test/select4.test 29a2ffb187f3d8b6ca42a0a6b619e9cabe12e228 F test/select4.test 29a2ffb187f3d8b6ca42a0a6b619e9cabe12e228
@ -127,7 +127,7 @@ F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279 F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49 F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
P c6a85c8ee3d653a294bcc033ac6cab2b6de06f96 P 6af10cc53acc1ffa60de3f0d5880a6b72815404c
R 04a7bbe2baff580acccc1436b54d7bc7 R a8e13733ee5e31e5e4261dfef2a4a7b4
U drh U drh
Z ca8712c82e6c361edcb455161975de2d Z 2f9159adbbc07ca082acf9822ba9ab2f

View File

@ -1 +1 @@
6af10cc53acc1ffa60de3f0d5880a6b72815404c b00cf110b1cc671b7200a5ce8b9e704f660763c9

View File

@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and ** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite. ** for generating VDBE code that evaluates expressions in SQLite.
** **
** $Id: expr.c,v 1.50 2002/02/28 01:46:12 drh Exp $ ** $Id: expr.c,v 1.51 2002/02/28 03:04:48 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@ -652,7 +652,8 @@ int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
int i; int i;
FuncDef *pDef; FuncDef *pDef;
pDef = sqliteFindFunction(pParse->db, pExpr->token.z, pExpr->token.n,n,0); pDef = sqliteFindFunction(pParse->db,
pExpr->token.z, pExpr->token.n, n, 0);
if( pDef==0 ){ if( pDef==0 ){
pDef = sqliteFindFunction(pParse->db, pDef = sqliteFindFunction(pParse->db,
pExpr->token.z, pExpr->token.n, -1, 0); pExpr->token.z, pExpr->token.n, -1, 0);
@ -854,14 +855,15 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
case TK_FUNCTION: { case TK_FUNCTION: {
int i; int i;
ExprList *pList = pExpr->pList; ExprList *pList = pExpr->pList;
int nExpr = pList ? pList->nExpr : 0;
FuncDef *pDef; FuncDef *pDef;
pDef = sqliteFindFunction(pParse->db, pDef = sqliteFindFunction(pParse->db,
pExpr->token.z, pExpr->token.n, pList->nExpr, 0); pExpr->token.z, pExpr->token.n, nExpr, 0);
assert( pDef!=0 ); assert( pDef!=0 );
for(i=0; i<pList->nExpr; i++){ for(i=0; i<nExpr; i++){
sqliteExprCode(pParse, pList->a[i].pExpr); sqliteExprCode(pParse, pList->a[i].pExpr);
} }
sqliteVdbeAddOp(v, OP_Function, pList->nExpr, 0); sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
break; break;
} }
@ -1246,8 +1248,7 @@ FuncDef *sqliteFindFunction(
assert( createFlag==0 ); assert( createFlag==0 );
return pMaybe; return pMaybe;
} }
if( p==0 && createFlag ){ if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
p = sqliteMalloc( sizeof(*p) );
p->nArg = nArg; p->nArg = nArg;
p->pNext = pFirst; p->pNext = pFirst;
sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);

View File

@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope. ** All other code has file scope.
** **
** $Id: func.c,v 1.8 2002/02/28 01:46:13 drh Exp $ ** $Id: func.c,v 1.9 2002/02/28 03:04:48 drh Exp $
*/ */
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>
@ -31,6 +31,7 @@ static void minFunc(sqlite_func *context, int argc, const char **argv){
const char *zBest; const char *zBest;
int i; int i;
if( argc==0 ) return;
zBest = argv[0]; zBest = argv[0];
for(i=1; i<argc; i++){ for(i=1; i<argc; i++){
if( sqliteCompare(argv[i], zBest)<0 ){ if( sqliteCompare(argv[i], zBest)<0 ){
@ -43,6 +44,7 @@ static void maxFunc(sqlite_func *context, int argc, const char **argv){
const char *zBest; const char *zBest;
int i; int i;
if( argc==0 ) return;
zBest = argv[0]; zBest = argv[0];
for(i=1; i<argc; i++){ for(i=1; i<argc; i++){
if( sqliteCompare(argv[i], zBest)>0 ){ if( sqliteCompare(argv[i], zBest)>0 ){
@ -105,7 +107,7 @@ static void substrFunc(sqlite_func *context, int argc, const char **argv){
len = strlen(z); len = strlen(z);
#endif #endif
if( p1<0 ){ if( p1<0 ){
p1 = len-p1; p1 += len;
}else if( p1>0 ){ }else if( p1>0 ){
p1--; p1--;
} }
@ -201,9 +203,7 @@ static void sumStep(sqlite_func *context, int argc, const char **argv){
static void sumFinalize(sqlite_func *context){ static void sumFinalize(sqlite_func *context){
SumCtx *p; SumCtx *p;
p = sqlite_aggregate_context(context, sizeof(*p)); p = sqlite_aggregate_context(context, sizeof(*p));
if( p ){ sqlite_set_result_double(context, p ? p->sum : 0.0);
sqlite_set_result_double(context, p->sum);
}
} }
static void avgFinalize(sqlite_func *context){ static void avgFinalize(sqlite_func *context){
SumCtx *p; SumCtx *p;

View File

@ -30,7 +30,7 @@
** But other routines are also provided to help in building up ** But other routines are also provided to help in building up
** a program instruction by instruction. ** a program instruction by instruction.
** **
** $Id: vdbe.c,v 1.127 2002/02/28 01:46:13 drh Exp $ ** $Id: vdbe.c,v 1.128 2002/02/28 03:04:48 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
#include <ctype.h> #include <ctype.h>
@ -552,6 +552,7 @@ char *sqlite_set_result_string(sqlite_func *p, const char *zResult, int n){
p->s.flags = STK_Null; p->s.flags = STK_Null;
n = 0; n = 0;
p->z = 0; p->z = 0;
p->s.n = 0;
}else{ }else{
if( n<0 ) n = strlen(zResult); if( n<0 ) n = strlen(zResult);
if( n<NBFS-1 ){ if( n<NBFS-1 ){
@ -567,8 +568,8 @@ char *sqlite_set_result_string(sqlite_func *p, const char *zResult, int n){
} }
p->s.flags = STK_Str | STK_Dyn; p->s.flags = STK_Str | STK_Dyn;
} }
p->s.n = n+1;
} }
p->s.n = n;
return p->z; return p->z;
} }
void sqlite_set_result_int(sqlite_func *p, int iResult){ void sqlite_set_result_int(sqlite_func *p, int iResult){
@ -1878,7 +1879,7 @@ case OP_Function: {
sqlite_func ctx; sqlite_func ctx;
n = pOp->p1; n = pOp->p1;
VERIFY( if( n<=0 ) goto bad_instruction; ) VERIFY( if( n<0 ) goto bad_instruction; )
VERIFY( if( p->tos+1<n ) goto not_enough_stack; ) VERIFY( if( p->tos+1<n ) goto not_enough_stack; )
for(i=p->tos-n+1; i<=p->tos; i++){ for(i=p->tos-n+1; i<=p->tos; i++){
if( (aStack[i].flags & STK_Null)==0 ){ if( (aStack[i].flags & STK_Null)==0 ){

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing built-in functions. # focus of this file is testing built-in functions.
# #
# $Id: func.test,v 1.7 2001/12/22 14:49:26 drh Exp $ # $Id: func.test,v 1.8 2002/02/28 03:04:48 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -34,11 +34,11 @@ do_test func-1.0 {
do_test func-1.1 { do_test func-1.1 {
set r [catch {execsql {SELECT length(*) FROM tbl1 ORDER BY t1}} msg] set r [catch {execsql {SELECT length(*) FROM tbl1 ORDER BY t1}} msg]
lappend r $msg lappend r $msg
} {1 {too few arguments to function length()}} } {1 {wrong number of arguments to function length()}}
do_test func-1.2 { do_test func-1.2 {
set r [catch {execsql {SELECT length(t1,5) FROM tbl1 ORDER BY t1}} msg] set r [catch {execsql {SELECT length(t1,5) FROM tbl1 ORDER BY t1}} msg]
lappend r $msg lappend r $msg
} {1 {too many arguments to function length()}} } {1 {wrong number of arguments to function length()}}
do_test func-1.3 { do_test func-1.3 {
execsql {SELECT length(t1), count(*) FROM tbl1 GROUP BY length(t1) execsql {SELECT length(t1), count(*) FROM tbl1 GROUP BY length(t1)
ORDER BY length(t1)} ORDER BY length(t1)}
@ -131,20 +131,20 @@ do_test func-4.1 {
INSERT INTO t1 VALUES(3,-2,-5); INSERT INTO t1 VALUES(3,-2,-5);
} }
catchsql {SELECT abs(a,b) FROM t1} catchsql {SELECT abs(a,b) FROM t1}
} {1 {too many arguments to function abs()}} } {1 {wrong number of arguments to function abs()}}
do_test func-4.2 { do_test func-4.2 {
catchsql {SELECT abs() FROM t1} catchsql {SELECT abs() FROM t1}
} {1 {too few arguments to function abs()}} } {1 {wrong number of arguments to function abs()}}
do_test func-4.3 { do_test func-4.3 {
catchsql {SELECT abs(b) FROM t1 ORDER BY a} catchsql {SELECT abs(b) FROM t1 ORDER BY a}
} {0 {2 1.2345678901234 2}} } {0 {2 1.2345678901234 2}}
do_test func-4.4 { do_test func-4.4 {
catchsql {SELECT abs(c) FROM t1 ORDER BY a} catchsql {SELECT abs(c) FROM t1 ORDER BY a}
} {0 {3 12345.6789 5}} } {0 {3 12345.67890 5}}
do_test func-4.5 { do_test func-4.5 {
catchsql {SELECT round(a,b,c) FROM t1} catchsql {SELECT round(a,b,c) FROM t1}
} {1 {too many arguments to function round()}} } {1 {wrong number of arguments to function round()}}
do_test func-4.6 { do_test func-4.6 {
catchsql {SELECT round(b,2) FROM t1 ORDER BY b} catchsql {SELECT round(b,2) FROM t1 ORDER BY b}
} {0 {-2.00 1.23 2.00}} } {0 {-2.00 1.23 2.00}}
@ -162,6 +162,6 @@ do_test func-4.10 {
} {0 {x3.0y x-12345.68y x-5.000y}} } {0 {x3.0y x-12345.68y x-5.000y}}
do_test func-4.11 { do_test func-4.11 {
catchsql {SELECT round() FROM t1 ORDER BY a} catchsql {SELECT round() FROM t1 ORDER BY a}
} {1 {too few arguments to function round()}} } {1 {wrong number of arguments to function round()}}
finish_test finish_test

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The # This file implements regression tests for SQLite library. The
# focus of this file is testing the SELECT statement. # focus of this file is testing the SELECT statement.
# #
# $Id: select1.test,v 1.19 2002/02/23 23:45:47 drh Exp $ # $Id: select1.test,v 1.20 2002/02/28 03:04:48 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@ -107,7 +107,7 @@ execsql {INSERT INTO test1 VALUES(33,44)}
do_test select1-2.1 { do_test select1-2.1 {
set v [catch {execsql {SELECT count(f1,f2) FROM test1}} msg] set v [catch {execsql {SELECT count(f1,f2) FROM test1}} msg]
lappend v $msg lappend v $msg
} {1 {too many arguments to function count()}} } {1 {wrong number of arguments to function count()}}
do_test select1-2.2 { do_test select1-2.2 {
set v [catch {execsql {SELECT count(f1) FROM test1}} msg] set v [catch {execsql {SELECT count(f1) FROM test1}} msg]
lappend v $msg lappend v $msg
@ -127,7 +127,7 @@ do_test select1-2.5 {
do_test select1-2.6 { do_test select1-2.6 {
set v [catch {execsql {SELECT min(*) FROM test1}} msg] set v [catch {execsql {SELECT min(*) FROM test1}} msg]
lappend v $msg lappend v $msg
} {1 {too few arguments to function min()}} } {0 {{} {}}}
do_test select1-2.7 { do_test select1-2.7 {
set v [catch {execsql {SELECT Min(f1) FROM test1}} msg] set v [catch {execsql {SELECT Min(f1) FROM test1}} msg]
lappend v $msg lappend v $msg
@ -139,7 +139,7 @@ do_test select1-2.8 {
do_test select1-2.9 { do_test select1-2.9 {
set v [catch {execsql {SELECT MAX(*) FROM test1}} msg] set v [catch {execsql {SELECT MAX(*) FROM test1}} msg]
lappend v $msg lappend v $msg
} {1 {too few arguments to function MAX()}} } {0 {{} {}}}
do_test select1-2.10 { do_test select1-2.10 {
set v [catch {execsql {SELECT Max(f1) FROM test1}} msg] set v [catch {execsql {SELECT Max(f1) FROM test1}} msg]
lappend v $msg lappend v $msg
@ -159,7 +159,7 @@ do_test select1-2.13 {
do_test select1-2.14 { do_test select1-2.14 {
set v [catch {execsql {SELECT SUM(*) FROM test1}} msg] set v [catch {execsql {SELECT SUM(*) FROM test1}} msg]
lappend v $msg lappend v $msg
} {1 {too few arguments to function SUM()}} } {1 {wrong number of arguments to function SUM()}}
do_test select1-2.15 { do_test select1-2.15 {
set v [catch {execsql {SELECT Sum(f1) FROM test1}} msg] set v [catch {execsql {SELECT Sum(f1) FROM test1}} msg]
lappend v $msg lappend v $msg
@ -167,7 +167,7 @@ do_test select1-2.15 {
do_test select1-2.16 { do_test select1-2.16 {
set v [catch {execsql {SELECT sum(f1,f2) FROM test1}} msg] set v [catch {execsql {SELECT sum(f1,f2) FROM test1}} msg]
lappend v $msg lappend v $msg
} {1 {too many arguments to function sum()}} } {1 {wrong number of arguments to function sum()}}
do_test select1-2.17 { do_test select1-2.17 {
set v [catch {execsql {SELECT SUM(f1)+1 FROM test1}} msg] set v [catch {execsql {SELECT SUM(f1)+1 FROM test1}} msg]
lappend v $msg lappend v $msg
@ -222,7 +222,7 @@ do_test select1-3.8 {
do_test select1-3.9 { do_test select1-3.9 {
set v [catch {execsql {SELECT f1 FROM test1 WHERE count(f1,f2)!=11}} msg] set v [catch {execsql {SELECT f1 FROM test1 WHERE count(f1,f2)!=11}} msg]
lappend v $msg lappend v $msg
} {1 {misuse of aggregate function count()}} } {1 {wrong number of arguments to function count()}}
# ORDER BY expressions # ORDER BY expressions
# #
@ -432,7 +432,7 @@ do_test select1-8.4 {
SELECT f1/(f1-11), min(f1/(f1-11),5), max(f1/(f1-33),6) SELECT f1/(f1-11), min(f1/(f1-11),5), max(f1/(f1-33),6)
FROM test1 ORDER BY f1 FROM test1 ORDER BY f1
} }
} {{} 5 6 1.5 1.5 6} } {{} {} 6 1.5 1.5 6}
do_test select1-8.5 { do_test select1-8.5 {
execsql { execsql {
SELECT min(1,2,3), -max(1,2,3) SELECT min(1,2,3), -max(1,2,3)