From: danielk1977 Date: Wed, 12 Nov 2008 08:07:12 +0000 (+0000) Subject: Make sure affinities and implicit collation sequences are correctly used by compariso... X-Git-Tag: version-3.6.10~288 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=259a455f711dd279ef3eb52a0b678e084a0cf06f;p=thirdparty%2Fsqlite.git Make sure affinities and implicit collation sequences are correctly used by comparison expressions in the select-list or having clause of an aggregate query. Ticket #3493. (CVS 5889) FossilOrigin-Name: b8ceaa00500f29bbbd0cc5aec71a6ffa91ae6b43 --- diff --git a/manifest b/manifest index ba1303f3ae..dd8ca3fedf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixed\sa\sfew\smore\scrashes\swhen\sdealing\swith\scorrupt\sdb\sfiles.\s(CVS\s5888) -D 2008-11-12T04:55:34 +C Make\ssure\saffinities\sand\simplicit\scollation\ssequences\sare\scorrectly\sused\sby\scomparison\sexpressions\sin\sthe\sselect-list\sor\shaving\sclause\sof\san\saggregate\squery.\sTicket\s#3493.\s(CVS\s5889) +D 2008-11-12T08:07:12 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 48172b58e444a9725ec482e0c022a564749acab4 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -107,7 +107,7 @@ F src/callback.c e970e5beddbdb23f89a6d05cb1a6419d9f755624 F src/complete.c cb14e06dbe79dee031031f0d9e686ff306afe07c F src/date.c 6f4277fa56d8c1b8e70c0bde838c9e99609f5ec0 F src/delete.c 3b156e1d396942fe50664af4e45e14e7de08c312 -F src/expr.c d48ae32513ba5d34f6a409d0a42731b4987cad25 +F src/expr.c 0a23a7f58084a40c38e1fc3afcd8adbbc8950b45 F src/fault.c dc88c821842157460750d2d61a8a8b4197d047ff F src/func.c d8eb180e4f454d480894522d8ed11de771a14c7e F src/global.c 20a3fe46c8287a01ba3a7442558f0eb70c66b19a @@ -576,6 +576,7 @@ F test/tkt3442.test 33722a3fa4bdc0614448044eb5e28765aea28eb7 F test/tkt3457.test e9ca2b90f0eb1fb8be73a30d29aacb2e3abedeb9 F test/tkt3461.test 5a63e8d8ee5ce00f076b1e2f82aba5480a0f14ed F test/tkt3472.test cc1fa004edd040dbc4c5c03327f8f3d3bbcd9ccb +F test/tkt3493.test 8472b3464e49a27ff7271308eec46154209e667b F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 F test/trace.test 951cd0f5f571e7f36bf7bfe04be70f90fb16fb00 F test/trans.test 2fd24cd7aa0b879d49a224cbd647d698f1e7ac5c @@ -655,7 +656,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P ec18667e2d2826a27f2c052ba3790ab5b8cf0bc4 -R 3fd6e153359a94e15331a1a8034f2f9f -U shane -Z 22bcacde70b802d010600360fc6793f1 +P f8bb34e40917e55696376d2def932a41ad43d0ae +R 5a5ff0ae69bc01ef9e0f87b7c6714d10 +U danielk1977 +Z 5729ccf0535d84d7054da6cd16c75bb0 diff --git a/manifest.uuid b/manifest.uuid index fd051d607d..349288d7c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8bb34e40917e55696376d2def932a41ad43d0ae \ No newline at end of file +b8ceaa00500f29bbbd0cc5aec71a6ffa91ae6b43 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ed02f14bbd..d0f7f85ff3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -12,7 +12,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** -** $Id: expr.c,v 1.401 2008/11/06 15:33:04 drh Exp $ +** $Id: expr.c,v 1.402 2008/11/12 08:07:12 danielk1977 Exp $ */ #include "sqliteInt.h" #include @@ -43,7 +43,9 @@ char sqlite3ExprAffinity(Expr *pExpr){ return sqlite3AffinityType(&pExpr->token); } #endif - if( (op==TK_COLUMN || op==TK_REGISTER) && pExpr->pTab!=0 ){ + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER) + && pExpr->pTab!=0 + ){ /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally ** a TK_COLUMN but was previously evaluated and cached in a register */ int j = pExpr->iColumn; @@ -89,7 +91,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ pColl = p->pColl; if( pColl ) break; op = p->op; - if( (op==TK_COLUMN || op==TK_REGISTER) && p->pTab!=0 ){ + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER) && p->pTab!=0 ){ /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally ** a TK_COLUMN but was previously evaluated and cached in a register */ const char *zColl; diff --git a/test/tkt3493.test b/test/tkt3493.test new file mode 100644 index 0000000000..7e3014e8be --- /dev/null +++ b/test/tkt3493.test @@ -0,0 +1,154 @@ +# 2008 October 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. Specifically, +# it tests that affinities and collation sequences are correctly applied +# in aggregate queries. +# +# $Id: tkt3493.test,v 1.1 2008/11/12 08:07:12 danielk1977 Exp $ + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_test tkt3493-1.1 { + execsql { + BEGIN; + CREATE TABLE A (id INTEGER PRIMARY KEY AUTOINCREMENT, val TEXT); + INSERT INTO A VALUES(1,'123'); + INSERT INTO A VALUES(2,'456'); + CREATE TABLE B (id INTEGER PRIMARY KEY AUTOINCREMENT, val TEXT); + INSERT INTO B VALUES(1,1); + INSERT INTO B VALUES(2,2); + CREATE TABLE A_B (B_id INTEGER NOT NULL, A_id INTEGER); + INSERT INTO A_B VALUES(1,1); + INSERT INTO A_B VALUES(2,2); + COMMIT; + } +} {} +do_test tkt3493-1.2 { + execsql { + SELECT + CASE + WHEN B.val = 1 THEN 'XYZ' + ELSE A.val + END AS Col1 + FROM B + LEFT OUTER JOIN A_B ON B.id = A_B.B_id + LEFT OUTER JOIN A ON A.id = A_B.A_id + ORDER BY Col1 ASC; + } +} {456 XYZ} +do_test tkt3493-1.3 { + execsql { + SELECT DISTINCT + CASE + WHEN B.val = 1 THEN 'XYZ' + ELSE A.val + END AS Col1 + FROM B + LEFT OUTER JOIN A_B ON B.id = A_B.B_id + LEFT OUTER JOIN A ON A.id = A_B.A_id + ORDER BY Col1 ASC; + } +} {456 XYZ} +do_test tkt3493-1.4 { + execsql { + SELECT b.val, CASE WHEN b.val = 1 THEN 'xyz' ELSE b.val END AS col1 FROM b; + } +} {1 xyz 2 2} +do_test tkt3493-1.5 { + execsql { + SELECT DISTINCT + b.val, + CASE WHEN b.val = 1 THEN 'xyz' ELSE b.val END AS col1 + FROM b; + } +} {1 xyz 2 2} +do_test tkt3493-1.6 { + execsql { + SELECT DISTINCT + b.val, + CASE WHEN b.val = '1' THEN 'xyz' ELSE b.val END AS col1 + FROM b; + } +} {1 xyz 2 2} + + +do_test tkt3493-2.1 { + execsql { + CREATE TABLE t1(a TEXT, b INT); + INSERT INTO t1 VALUES(123, 456); + } +} {} +do_test tkt3493-2.2.1 { + execsql { SELECT a=123 FROM t1 GROUP BY a } +} {1} +do_test tkt3493-2.2.2 { + execsql { SELECT a=123 FROM t1 } +} {1} +do_test tkt3493-2.2.3 { + execsql { SELECT a='123' FROM t1 } +} {1} +do_test tkt3493-2.2.4 { + execsql { SELECT count(*), a=123 FROM t1 } +} {1 1} +do_test tkt3493-2.2.5 { + execsql { SELECT count(*), +a=123 FROM t1 } +} {1 0} +do_test tkt3493-2.3.3 { + execsql { SELECT b='456' FROM t1 GROUP BY a } +} {1} +do_test tkt3493-2.3.1 { + execsql { SELECT b='456' FROM t1 GROUP BY b } +} {1} +do_test tkt3493-2.3.2 { + execsql { SELECT b='456' FROM t1 } +} {1} +do_test tkt3493-2.4.1 { + execsql { SELECT typeof(a), a FROM t1 GROUP BY a HAVING a=123 } +} {text 123} +do_test tkt3493-2.4.2 { + execsql { SELECT typeof(a), a FROM t1 GROUP BY b HAVING a=123 } +} {text 123} +do_test tkt3493-2.5.1 { + execsql { SELECT typeof(b), b FROM t1 GROUP BY a HAVING b='456' } +} {integer 456} +do_test tkt3493-2.5.2 { + execsql { SELECT typeof(b), b FROM t1 GROUP BY b HAVING b='456' } +} {integer 456} + +do_test tkt3493-3.1 { + execsql { + CREATE TABLE t2(a COLLATE NOCASE, b COLLATE BINARY); + INSERT INTO t2 VALUES('aBc', 'DeF'); + } +} {} +do_test tkt3493-3.2.1 { + execsql { SELECT a='abc' FROM t2 GROUP BY a } +} {1} +do_test tkt3493-3.2.2 { + execsql { SELECT a='abc' FROM t2 } +} {1} + +do_test tkt3493-3.3.1 { + execsql { SELECT a>b FROM t2 GROUP BY a, b} +} {0} +do_test tkt3493-3.3.2 { + execsql { SELECT a>b COLLATE BINARY FROM t2 GROUP BY a, b} +} {1} +do_test tkt3493-3.3.3 { + execsql { SELECT b>a FROM t2 GROUP BY a, b} +} {0} +do_test tkt3493-3.3.4 { + execsql { SELECT b>a COLLATE NOCASE FROM t2 GROUP BY a, b} +} {1} + +finish_test +