-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
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
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
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
** 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 <ctype.h>
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;
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;
--- /dev/null
+# 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
+