From: drh Date: Wed, 23 Jun 2004 21:16:51 +0000 (+0000) Subject: The MIN() aggregate function returns NULL if any element in the result X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ca693234781a75ec6c5932e0c2bfd6182f651621;p=thirdparty%2Fsqlite.git The MIN() aggregate function returns NULL if any element in the result was NULL. This makes MIN() consistent with ORDER BY which sorts NULL first. Ticket #777. (CVS 1679) FossilOrigin-Name: 78ced6e3092d69e7cb77c5c2acff70f3c92e6523 --- diff --git a/manifest b/manifest index 7269a518f7..916e002628 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssource\scode\sto\sthe\ssqlite_analyzer\sutility.\s(CVS\s1637) -D 2004-06-19T11:57:40 +C The\sMIN()\saggregate\sfunction\sreturns\sNULL\sif\sany\selement\sin\sthe\sresult\nwas\sNULL.\s\sThis\smakes\sMIN()\sconsistent\swith\sORDER\sBY\swhich\ssorts\sNULL\sfirst.\nTicket\s#777.\s(CVS\s1679) +D 2004-06-23T21:16:52 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -32,7 +32,7 @@ F src/date.c f055419d602bde622c70f831350b6b52f2235de0 F src/delete.c 82001c74882319f94dab5f6b92a27311b31092ae F src/encode.c fc8c51f0b61bc803ccdec092e130bebe762b0a2f F src/expr.c 8c3f5603c3e98b1c146d18076ba3e82cdbb59c11 -F src/func.c 34fead7a33e82095f6412d3fafd379d47864b3be +F src/func.c 522d58abf2ec9f93fe3aa08b12611aede570d125 F src/hash.c 9b56ef3b291e25168f630d5643a4264ec011c70e F src/hash.h 3247573ab95b9dd90bcca0307a75d9a16da1ccc7 F src/insert.c c0485ee2d1b99322894e2d1e0b576fd05ed75616 @@ -88,7 +88,7 @@ F test/delete.test 92256384f1801760180ded129f7427884cf28886 F test/expr.test ad985242e140f87eeef329d98257b8369a2066dc F test/fkey1.test d65c824459916249bee501532d6154ddab0b5db7 F test/format3.test 149cc166c97923fa60def047e90dd3fb32bba916 -F test/func.test 000515779001ac6899eec4b54e65c6e2501279d4 +F test/func.test cf6434042bf14dcfa124ce2835b049018248e9f6 F test/hook.test 1a67ce0cd64a6455d016962542f2822458dccc49 F test/in.test 0de39b02ceeca90993b096822fb5a884661c5b47 F test/index.test 9295deefbdb6dedbe01be8905f0c448fe5bd4079 @@ -107,13 +107,13 @@ F test/main.test 6a851b5992c4881a725a3d9647e629199df8de9d F test/malloc.test 2cfcffb7c858640e01e6520ee1cd54ca57d98e80 F test/memdb.test 6ece25c7c0e6500199d3662607a3edca081abb2a F test/memleak.test 4d5d374c8ea1fc5ac634aed58cac1047848ce65e -F test/minmax.test 9dcf52f713b1b9e61d0a88a51eb8bb2e3c52d0ab +F test/minmax.test db8cd0e865682143dca77447d944fb25685e1cd3 F test/misc1.test 0b98d493b0cf55cb5f53e1f3df8107c166eecb5a F test/misc2.test 10c2ce26407d37411b96273e552d5095393732be F test/misc3.test 3b5e369514a3ba3f919fb7eafa7d027440b5079e F test/misuse.test 1095f26d1aed406c65e1d2eba651c4bb7c38cbff F test/notnull.test 7a08117a71e74b0321aaa937dbeb41a09d6eb1d0 -F test/null.test c14d0f4739f21e929b8115b72bf0c765b6bb1721 +F test/null.test b5c066aad5f6a948b9bf372b289c28faffe174dc F test/pager.test 331519008889d45f6df6697395e5bce6ee602fd9 F test/pragma.test 24a3f7a697b45cb90d664ebce5566bec7ac41571 F test/printf.test 46b3d07d59d871d0831b4a657f6dfcafe0574850 @@ -121,7 +121,7 @@ F test/progress.test 701b6115c2613128ececdfe1398a1bd0e1a4cfb3 x F test/quick.test 5a6bccf5c02f16841a79fbac7409a02138880c10 F test/quote.test 08f23385c685d3dc7914ec760d492cacea7f6e3d F test/rowid.test 77f7e8c7ca626a15ff91a536595b695cfce7c845 -F test/select1.test 0d708cec567104653ec9aa49fecf3444a2e7d150 +F test/select1.test e40a88c85f98fb87f60db1abefae0bab7264c9a3 F test/select2.test aceea74fd895b9d007512f72499db589735bd8e4 F test/select3.test 445a1a3dde4e2fd32541b311f55da5e2f8079d76 F test/select4.test e7e9a32fa745246cb99fadbeb63af4843a17925b @@ -189,7 +189,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 28b737b5a0e07a142396809f8a7dbd985d433c0d -R fb6b4bcc22cce49b0e4adc90b58e43f9 +P 06bf4c7e41839eb003f3df05a80789a1f2b21b8f +R dafb0c51f2a215a538fc0976e7da3c17 U drh -Z f092da110df516aacd5c626d43efe1ef +Z 693b4009cfcb767a325ed3f699f12e33 diff --git a/manifest.uuid b/manifest.uuid index d3b64433f6..eee7045f3f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -06bf4c7e41839eb003f3df05a80789a1f2b21b8f \ No newline at end of file +78ced6e3092d69e7cb77c5c2acff70f3c92e6523 \ No newline at end of file diff --git a/src/func.c b/src/func.c index e6613c5b1d..b43ce1f8ee 100644 --- a/src/func.c +++ b/src/func.c @@ -16,7 +16,7 @@ ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** -** $Id: func.c,v 1.43 2004/02/25 22:51:06 rdc Exp $ +** $Id: func.c,v 1.43.2.1 2004/06/23 21:16:52 drh Exp $ */ #include #include @@ -523,20 +523,29 @@ static void minmaxStep(sqlite_func *context, int argc, const char **argv){ xCompare = strcmp; } mask = (int)sqlite_user_data(context); + assert( mask==0 || mask==-1 ); p = sqlite_aggregate_context(context, sizeof(*p)); - if( p==0 || argc<1 || argv[0]==0 ) return; + if( p==0 || argc<1 ) return; + if( mask==0 && p->zBuf[0]>=2 ) return; + if( argv[0]==0 ){ + if( mask==0 ){ + p->zBuf[0] |= 2; + } + return; + } + assert( p->zBuf[0]<2 ); if( p->z==0 || (xCompare(argv[0],p->z)^mask)<0 ){ int len; - if( !p->zBuf[0] ){ + if( p->zBuf[0]!=0 ){ sqliteFree(p->z); } len = strlen(argv[0]); if( len < sizeof(p->zBuf)-1 ){ p->z = &p->zBuf[1]; - p->zBuf[0] = 1; + p->zBuf[0] = 0; }else{ p->z = sqliteMalloc( len+1 ); - p->zBuf[0] = 0; + p->zBuf[0] = 1; if( p->z==0 ) return; } strcpy(p->z, argv[0]); @@ -545,10 +554,10 @@ static void minmaxStep(sqlite_func *context, int argc, const char **argv){ static void minMaxFinalize(sqlite_func *context){ MinMaxCtx *p; p = sqlite_aggregate_context(context, sizeof(*p)); - if( p && p->z ){ + if( p && p->z && p->zBuf[0]<2 ){ sqlite_set_result_string(context, p->z, strlen(p->z)); } - if( p && !p->zBuf[0] ){ + if( p && (p->zBuf[0]&1)!=0 ){ sqliteFree(p->z); } } @@ -621,7 +630,12 @@ void sqliteRegisterBuiltinFunctions(sqlite *db){ int i; for(i=0; i