aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2007-05-14 11:34:46 +0000
committerdrh <drh@noemail.net>2007-05-14 11:34:46 +0000
commit4f07e5fbdf0fb0cde532ea39602bd1ba32d0c8ae (patch)
tree766db8d9ee1e4d0a9ebb8857102c28cbe85a9836
parent84f31128b2d09479663df3597f83251cba59ab39 (diff)
downloadsqlite-4f07e5fbdf0fb0cde532ea39602bd1ba32d0c8ae.tar.gz
sqlite-4f07e5fbdf0fb0cde532ea39602bd1ba32d0c8ae.zip
Remove terms with operator TK_AS from the expression tree. Ticket #2356. (CVS 3991)
FossilOrigin-Name: 5627ff74be9242418434a06fe5c104d1f9128cab
-rw-r--r--manifest18
-rw-r--r--manifest.uuid2
-rw-r--r--src/auth.c5
-rw-r--r--src/expr.c27
-rw-r--r--src/select.c8
-rw-r--r--test/where.test44
6 files changed, 57 insertions, 47 deletions
diff --git a/manifest b/manifest
index b2d0924d9..87afe3e15 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sREINDEX\srobust\sin\sthe\sface\sof\smalloc()\serrors.\s(CVS\s3990)
-D 2007-05-12T15:00:15
+C Remove\sterms\swith\soperator\sTK_AS\sfrom\sthe\sexpression\stree.\s\sTicket\s#2356.\s(CVS\s3991)
+D 2007-05-14T11:34:47
F Makefile.in 87b200ad9970907f76df734d29dff3d294c10935
F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -60,7 +60,7 @@ F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a
F src/alter.c ca8fc4a3c7359379598dc12589b65c32eb88defd
F src/analyze.c e8fcb1c35ace8418615eb18d9601f321ac86b2ec
F src/attach.c ba628db0c2b6a362f036d017bf1196cdfe4ebb37
-F src/auth.c 902f4722661c796b97f007d9606bd7529c02597f
+F src/auth.c 5ea90bc93dfea46e9fe4bf531e14c7cd98219ecb
F src/btree.c 0c2f9b06c90d7c59925c03153c9d47fd739c8ca5
F src/btree.h 1d527bf61ed176f980c34999d5793a0fd45dcf8c
F src/btreeInt.h cb3c0e9eb842d06079a62cdf3492c90c5db7ba75
@@ -70,7 +70,7 @@ F src/complete.c 7d1a44be8f37de125fcafd3d3a018690b3799675
F src/date.c 6049db7d5a8fdf2c677ff7d58fa31d4f6593c988
F src/delete.c 5c0d89b3ef7d48fe1f5124bfe8341f982747fe29
F src/experimental.c 1b2d1a6cd62ecc39610e97670332ca073c50792b
-F src/expr.c 2283be0ae4186fa9bb2a8a3f6b545a51ea7632bd
+F src/expr.c bad06f783d2daf1884a922859c8e7427323e7dc3
F src/func.c b6586f83c141859c103dd4954de66efc3fbd101b
F src/hash.c 67b23e14f0257b69a3e8aa663e4eeadc1a2b6fd5
F src/hash.h 1b3f7e2609141fd571f62199fc38687d262e9564
@@ -99,7 +99,7 @@ F src/pragma.c 6d5eb19feef9e84117b9b17a4c38b12b8c1c6897
F src/prepare.c 87c23644986b5e41a58bc76f05abebd899e00089
F src/printf.c 05b233c7a39aec4c54c79ef87af24f0a6591175d
F src/random.c 6119474a6f6917f708c1dee25b9a8e519a620e88
-F src/select.c d43bbdedb843a91b728531c831f3ed04846b920d
+F src/select.c 3f563bb096c5768ac99d4b762084e86d5b227230
F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
F src/shell.c d07ae326b3815d80f71c69b3c7584382e47f6447
F src/sqlite.h.in 664b8702c27dc742584788823c548491ac8935d6
@@ -410,7 +410,7 @@ F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583
F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b
F test/vtab_err.test 9eabf98b26838fed8bac4aea986580be0a2bd52e
F test/vtab_shared.test d631d1f820c38c18939d53aab1fc35db5f0a8094
-F test/where.test 1d020f50c77f37b2dbab9766ca959e6e3278ecdb
+F test/where.test 5c342d6ad0d777275d4740ea5cbeaf5173b6eda4
F test/where2.test 3249d426b3fc7a106713d784e1628307fc308d2e
F test/where3.test 0a30fe9808b0fa01c46d0fcf4fac0bf6cf75bb30
F test/where4.test b68496500bff496e83e76ae4ffb493b99064eac6
@@ -490,7 +490,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P c08658e1f8598941ebddddb98942b98cfcb86e7a
-R 72a1de25bc540615c732aa41aeba85b0
+P dbe417745d3d4ed875715ad7083d7345d1b6a56f
+R 6fe321bd341ad3acbb13e0750cc6f8e7
U drh
-Z 5ad3bb426ed54207061f91dbb90ceab1
+Z e5ed06d7f6549ae20b899f9b0e3f9c4d
diff --git a/manifest.uuid b/manifest.uuid
index 288f9db60..cb8a4a4fd 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-dbe417745d3d4ed875715ad7083d7345d1b6a56f \ No newline at end of file
+5627ff74be9242418434a06fe5c104d1f9128cab \ No newline at end of file
diff --git a/src/auth.c b/src/auth.c
index fe05a68af..79940c273 100644
--- a/src/auth.c
+++ b/src/auth.c
@@ -14,7 +14,7 @@
** systems that do not need this facility may omit it by recompiling
** the library with -DSQLITE_OMIT_AUTHORIZATION=1
**
-** $Id: auth.c,v 1.25 2006/06/16 08:01:03 danielk1977 Exp $
+** $Id: auth.c,v 1.26 2007/05/14 11:34:47 drh Exp $
*/
#include "sqliteInt.h"
@@ -115,8 +115,7 @@ void sqlite3AuthRead(
int iDb; /* The index of the database the expression refers to */
if( db->xAuth==0 ) return;
- if( pExpr->op==TK_AS ) return;
- assert( pExpr->op==TK_COLUMN );
+ if( pExpr->op!=TK_COLUMN ) return;
iDb = sqlite3SchemaToIndex(pParse->db, pExpr->pSchema);
if( iDb<0 ){
/* An attempt to read a column out of a subquery or other
diff --git a/src/expr.c b/src/expr.c
index 5ce30b475..cfc534660 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.292 2007/05/12 06:11:12 danielk1977 Exp $
+** $Id: expr.c,v 1.293 2007/05/14 11:34:47 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -35,9 +35,6 @@
*/
char sqlite3ExprAffinity(Expr *pExpr){
int op = pExpr->op;
- if( op==TK_AS ){
- return sqlite3ExprAffinity(pExpr->pLeft);
- }
if( op==TK_SELECT ){
return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
}
@@ -75,7 +72,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
CollSeq *pColl = 0;
if( pExpr ){
pColl = pExpr->pColl;
- if( (pExpr->op==TK_AS || pExpr->op==TK_CAST) && !pColl ){
+ if( pExpr->op==TK_CAST && !pColl ){
return sqlite3ExprCollSeq(pParse, pExpr->pLeft);
}
}
@@ -481,10 +478,6 @@ Expr *sqlite3ExprDup(Expr *p){
pNew->pRight = sqlite3ExprDup(p->pRight);
pNew->pList = sqlite3ExprListDup(p->pList);
pNew->pSelect = sqlite3SelectDup(p->pSelect);
- pNew->pTab = p->pTab;
-#if SQLITE_MAX_EXPR_DEPTH>0
- pNew->nHeight = p->nHeight;
-#endif
return pNew;
}
void sqlite3TokenCopy(Token *pTo, Token *pFrom){
@@ -1114,10 +1107,17 @@ static int lookupName(
for(j=0; j<pEList->nExpr; j++){
char *zAs = pEList->a[j].zName;
if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
+ Expr *pDup;
assert( pExpr->pLeft==0 && pExpr->pRight==0 );
- pExpr->op = TK_AS;
- pExpr->iColumn = j;
- pExpr->pLeft = sqlite3ExprDup(pEList->a[j].pExpr);
+ assert( pExpr->pList==0 );
+ assert( pExpr->pSelect==0 );
+ pDup = sqlite3ExprDup(pEList->a[j].pExpr);
+ if( pExpr->flags & EP_ExpCollate ){
+ pDup->pColl = pExpr->pColl;
+ pDup->flags |= EP_ExpCollate;
+ }
+ memcpy(pExpr, pDup, sizeof(*pExpr));
+ sqliteFree(pDup);
cnt = 1;
assert( zTab==0 && zDb==0 );
goto lookupname_end_2;
@@ -1960,8 +1960,7 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr){
sqlite3VdbeAddOp(v, OP_And, 0, 0);
break;
}
- case TK_UPLUS:
- case TK_AS: {
+ case TK_UPLUS: {
sqlite3ExprCode(pParse, pExpr->pLeft);
stackChng = 0;
break;
diff --git a/src/select.c b/src/select.c
index dd8b81d82..686ecb192 100644
--- a/src/select.c
+++ b/src/select.c
@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite.
**
-** $Id: select.c,v 1.344 2007/05/10 10:46:57 danielk1977 Exp $
+** $Id: select.c,v 1.345 2007/05/14 11:34:47 drh Exp $
*/
#include "sqliteInt.h"
@@ -822,12 +822,6 @@ static const char *columnType(
int j;
if( pExpr==0 || pNC->pSrcList==0 ) return 0;
- /* The TK_AS operator can only occur in ORDER BY, GROUP BY, HAVING,
- ** and LIMIT clauses. But pExpr originates in the result set of a
- ** SELECT. So pExpr can never contain an AS operator.
- */
- assert( pExpr->op!=TK_AS );
-
switch( pExpr->op ){
case TK_AGG_COLUMN:
case TK_COLUMN: {
diff --git a/test/where.test b/test/where.test
index 97f673ec9..680772d64 100644
--- a/test/where.test
+++ b/test/where.test
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing the use of indices in WHERE clases.
#
-# $Id: where.test,v 1.41 2007/02/06 23:41:34 drh Exp $
+# $Id: where.test,v 1.42 2007/05/14 11:34:47 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -62,24 +62,42 @@ proc count sql {
# and Next operators in the VDBE. By verifing that the search count is
# small we can be assured that indices are being used properly.
#
-do_test where-1.1 {
- count {SELECT x, y FROM t1 WHERE w=10}
-} {3 121 3}
+do_test where-1.1.1 {
+ count {SELECT x, y, w FROM t1 WHERE w=10}
+} {3 121 10 3}
do_test where-1.1.2 {
set sqlite_query_plan
} {t1 i1w}
-do_test where-1.2 {
- count {SELECT x, y FROM t1 WHERE w=11}
-} {3 144 3}
-do_test where-1.3 {
- count {SELECT x, y FROM t1 WHERE 11=w}
-} {3 144 3}
-do_test where-1.4 {
- count {SELECT x, y FROM t1 WHERE 11=w AND x>2}
-} {3 144 3}
+do_test where-1.1.3 {
+ count {SELECT x, y, w AS abc FROM t1 WHERE abc=10}
+} {3 121 10 3}
+do_test where-1.1.4 {
+ set sqlite_query_plan
+} {t1 i1w}
+do_test where-1.2.1 {
+ count {SELECT x, y, w FROM t1 WHERE w=11}
+} {3 144 11 3}
+do_test where-1.2.2 {
+ count {SELECT x, y, w AS abc FROM t1 WHERE abc=11}
+} {3 144 11 3}
+do_test where-1.3.1 {
+ count {SELECT x, y, w AS abc FROM t1 WHERE 11=w}
+} {3 144 11 3}
+do_test where-1.3.2 {
+ count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc}
+} {3 144 11 3}
+do_test where-1.4.1 {
+ count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2}
+} {11 3 144 3}
do_test where-1.4.2 {
set sqlite_query_plan
} {t1 i1w}
+do_test where-1.4.3 {
+ count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2}
+} {11 3 144 3}
+do_test where-1.4.4 {
+ set sqlite_query_plan
+} {t1 i1w}
do_test where-1.5 {
count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2}
} {3 144 3}