From: drh Date: Wed, 8 May 2002 11:54:14 +0000 (+0000) Subject: Fix for tickets #32 and #33: Generate the names of the result set early, before X-Git-Tag: version-3.6.10~5522 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0bb28106bedeef2f45161afa07705e20205717bb;p=thirdparty%2Fsqlite.git Fix for tickets #32 and #33: Generate the names of the result set early, before doing the flattening optimization or evaluating subqueries. Otherwise, the result set column names are generated incorrectly or after they are needed. (CVS 553) FossilOrigin-Name: 08f27cb36805d38648274b6fe91dec43a5910057 --- diff --git a/manifest b/manifest index 07120727c2..46318c9698 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Added\sdocumentation\sabout\sthe\snew\sCASE\sexpression.\s(CVS\s552) -D 2002-05-06T11:47:33 +C Fix\sfor\stickets\s#32\sand\s#33:\sGenerate\sthe\snames\sof\sthe\sresult\sset\searly,\sbefore\ndoing\sthe\sflattening\soptimization\sor\sevaluating\ssubqueries.\s\sOtherwise,\sthe\nresult\sset\scolumn\snames\sare\sgenerated\sincorrectly\sor\safter\sthey\sare\sneeded.\s(CVS\s553) +D 2002-05-08T11:54:15 F Makefile.in 50f1b3351df109b5774771350d8c1b8d3640130d F Makefile.template 89e373b2dad0321df00400fa968dc14b61a03296 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0 @@ -37,7 +37,7 @@ F src/pager.h 6fddfddd3b73aa8abc081b973886320e3c614f0e F src/parse.y 0ce56f1c751657f01e18a4b4ac1aa4d29525ac20 F src/printf.c 300a90554345751f26e1fc0c0333b90a66110a1d F src/random.c 19e8e00fe0df32a742f115773f57651be327cabe -F src/select.c 5e9fe2cdbb398be036c43bfa71b0686fcbbe5f96 +F src/select.c 1b623a7d826ec7c245bc542b665d61724da2a62d F src/shell.c 5acbe59e137d60d8efd975c683dbea74ab626530 F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e F src/sqlite.h.in ffcacf73b5ed1a4939205d29a704a185758fa6a6 @@ -100,7 +100,7 @@ F test/trans.test ae0b9a82d5d34122c3a3108781eb8d078091ccee F test/unique.test 07776624b82221a80c8b4138ce0dd8b0853bb3ea F test/update.test 3cf1ca0565f678063c2dfa9a7948d2d66ae1a778 F test/vacuum.test 059871b312eb910bbe49dafde1d01490cc2c6bbe -F test/view.test 4a8a9cf59b54409228c7b9b918ed8bf9bade1220 +F test/view.test 1536b58161e9cef544085d3928b53f17c9ed8424 F test/where.test 1d85a7eba93e7acc0a971c6d9daead0e49cb023a F tool/lemon.c 77d026f58d7715543786d457cf9432f9103e3f62 F tool/lempar.c ee508b94607f74d591d60eda5c8014db4e144de5 @@ -130,7 +130,7 @@ F www/speed.tcl da8afcc1d3ccc5696cfb388a68982bc3d9f7f00f F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279 F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218 -P 5772d31934ced7e35842d7c7689ff4878b7e80f5 -R b085b09618ae8814b296116bb7ca3dee +P cc541b10302774b9004babbfb3a11b1f65d4b863 +R 054a35fac576992802ba562437446471 U drh -Z cddb6e7b9d73903f2cd270dc5481d839 +Z 04c420bf6c4394719a156e66dc666487 diff --git a/manifest.uuid b/manifest.uuid index c1903872e0..5f41bfe897 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc541b10302774b9004babbfb3a11b1f65d4b863 \ No newline at end of file +08f27cb36805d38648274b6fe91dec43a5910057 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 530a7a3dda..7038809ce9 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.80 2002/04/30 19:20:29 drh Exp $ +** $Id: select.c,v 1.81 2002/05/08 11:54:15 drh Exp $ */ #include "sqliteInt.h" @@ -931,9 +931,10 @@ substExprList(ExprList *pList, int iTable, ExprList *pEList, int iSub){ ** the subquery before this routine runs. */ int flattenSubquery(Select *p, int iFrom, int isAgg, int subqueryIsAgg){ - Select *pSub; - IdList *pSrc, *pSubSrc; - ExprList *pList; + Select *pSub; /* The inner query or "subquery" */ + IdList *pSrc; /* The FROM clause of the outer query */ + IdList *pSubSrc; /* The FROM clause of the subquery */ + ExprList *pList; /* The result set of the outer query */ int i; int iParent, iSub; Expr *pWhere; @@ -954,7 +955,7 @@ int flattenSubquery(Select *p, int iFrom, int isAgg, int subqueryIsAgg){ if( pSub->isDistinct && isAgg ) return 0; if( p->isDistinct && subqueryIsAgg ) return 0; - /* If we reach this point, it means flatting is permitted for the + /* If we reach this point, it means flattening is permitted for the ** i-th entry of the FROM clause in the outer query. */ iParent = p->base + iFrom; @@ -1332,6 +1333,22 @@ int sqliteSelect( v = sqliteGetVdbe(pParse); if( v==0 ) goto select_end; + /* Identify column names if we will be using in the callback. This + ** step is skipped if the output is going to a table or a memory cell. + */ + if( eDest==SRT_Callback ){ + generateColumnNames(pParse, p->base, pTabList, pEList); + } + + /* Set the limiter + */ + if( p->nLimit<=0 ){ + p->nOffset = 0; + }else{ + if( p->nOffset<0 ) p->nOffset = 0; + sqliteVdbeAddOp(v, OP_Limit, p->nLimit, p->nOffset); + } + /* Generate code for all sub-queries in the FROM clause */ for(i=0; inId; i++){ @@ -1392,23 +1409,6 @@ int sqliteSelect( } } - /* Set the limiter - */ - if( p->nLimit<=0 ){ - p->nOffset = 0; - }else{ - if( p->nOffset<0 ) p->nOffset = 0; - sqliteVdbeAddOp(v, OP_Limit, p->nLimit, p->nOffset); - } - - - /* Identify column names if we will be using in the callback. This - ** step is skipped if the output is going to a table or a memory cell. - */ - if( eDest==SRT_Callback ){ - generateColumnNames(pParse, p->base, pTabList, pEList); - } - /* Reset the aggregator */ if( isAgg ){ diff --git a/test/view.test b/test/view.test index 859d9e95b1..f915384a85 100644 --- a/test/view.test +++ b/test/view.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing VIEW statements. # -# $Id: view.test,v 1.3 2002/03/03 23:06:02 drh Exp $ +# $Id: view.test,v 1.4 2002/05/08 11:54:16 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -121,6 +121,31 @@ do_test view-2.6 { } } {11} +# Test that column name of views are generated correctly. +# +do_test view-3.1 { + execsql2 { + SELECT * FROM v1 LIMIT 1 + } +} {a 2 b 3} +do_test view-3.2 { + execsql2 { + SELECT * FROM v2 LIMIT 1 + } +} {x 7 a 8 b 9 c 10} +do_test view-3.3 { + execsql2 { + DROP VIEW v1; + CREATE VIEW v1 AS SELECT a AS 'xyz', b+c AS 'pqr', c-b FROM t1; + SELECT * FROM v1 LIMIT 1 + } +} {xyz 2 pqr 7 c-b 1} +do_test view-3.4 { + execsql2 { + CREATE VIEW v3 AS SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY b; + SELECT * FROM v3 LIMIT 4; + } +} {b 2 b 3 b 5 b 6} finish_test