From 976658734c1635d7d3e890d47f4248df523e9870 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 13 Feb 2002 23:22:53 +0000 Subject: [PATCH] Bug fix: if PRAGMA full_column_names=ON is set and you do a query like this: "SELECT rowid,* FROM ...", then an assertion failed. Bummer. (CVS 368) FossilOrigin-Name: df6bf627a51358e8b14297403feab7b888c38580 --- VERSION | 2 +- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/select.c | 11 ++++++----- src/where.c | 10 ++++++---- test/misc1.test | 15 ++++++++++++++- www/changes.tcl | 6 ++++++ 7 files changed, 44 insertions(+), 22 deletions(-) diff --git a/VERSION b/VERSION index 276cbf9e28..2bf1c1ccf3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.0 +2.3.1 diff --git a/manifest b/manifest index d067f29ce8..6505fbd87e 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Version\s2.3.0\s(CVS\s447) -D 2002-02-03T19:30:00 +C Bug\sfix:\sif\sPRAGMA\sfull_column_names=ON\sis\sset\sand\syou\sdo\sa\squery\slike\sthis:\n"SELECT\srowid,*\sFROM\s...",\sthen\san\sassertion\sfailed.\s\sBummer.\s(CVS\s368) +D 2002-02-13T23:22:53 F Makefile.in 9fa4277413bf1d9cf91365f07d4108d7d87ed2af F Makefile.template 3372d45f8853afdb70bd30cc6fb50a3cd9069834 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0 -F VERSION 34f7c904a063d2d3791c38521e40ae1648cd2e7e +F VERSION ed0510bca23ecd087a7c96ee72838b17e2b5d355 F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d F config.guess f38b1e93d1e0fa6f5a6913e9e7b12774b9232588 F config.log 6a73d03433669b10a3f0c221198c3f26b9413914 @@ -36,7 +36,7 @@ F src/pager.h b28f004e2f5541dc60cc32db01bf80cf4d056283 F src/parse.y 734ba1e0dce9882345e65de5a14d9fe02fb757c2 F src/printf.c 300a90554345751f26e1fc0c0333b90a66110a1d F src/random.c f6b36bec5ebd3edb3440224bf5bf811fe4ac9a1b -F src/select.c b32d3f38616f93f092b98c1c3e53c4dfe57dc359 +F src/select.c 4b4a25c57cc341565dad625c3100c71ce993f85f F src/shell.c c102dfe388c7618a668c944ff157c49cb48f28e3 F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e F src/sqlite.h.in f57074c84a2c112a5093ba7a9d9636aa9cacc87c @@ -51,7 +51,7 @@ F src/update.c 95459f94a061860bf8e5716b3426a5ba85c79103 F src/util.c 8f8973dd55a6ec63be9632fc5de86965c99d6327 F src/vdbe.c 94704a5733db95b78cc902208c5e8e26a784e7f8 F src/vdbe.h 3d49d22ba9ad14ea0e380bc582ff57347eaddb59 -F src/where.c 2dda39367f193194e4c7d2e0dcab31527d9d8aba +F src/where.c fd4d817dedd2a29e7f118cac3517c4c9d9ff199c F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578 F test/btree.test 6ab4dc5f595905a276ef588fad3c9236dc07a47b @@ -72,7 +72,7 @@ F test/limit.test a930f3eba2a7691c8397ccab33710b931589566a F test/lock.test 19593689260c419efe7ced55b1418653a4b7bcd1 F test/main.test 1626345b5f630c5398eede500d9354813b76b0fd F test/malloc.test 70fdd0812e2a57eb746aaf015350f58bb8eee0b1 -F test/misc1.test 50a5ca3481fc1f3cd6b978bcd6ed04c06f26a1e6 +F test/misc1.test 5ed0df7274912cbce56f1afa19c9510510b0a7f9 F test/notnull.test b1f3e42fc475b0b5827b27b2e9b562081995ff30 F test/pager.test b0c0d00cd5dce0ce21f16926956b195c0ab5044c F test/printf.test 3cb415073754cb8ff076f26173143c3cd293a9da @@ -107,7 +107,7 @@ F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4 F www/arch.tcl 72a0c80e9054cc7025a50928d28d9c75c02c2b8b F www/c_interface.tcl 82a026b1681757f13b3f62e035f3a31407c1d353 -F www/changes.tcl 445dd536ade7085f4ffe820805847451d01c87bb +F www/changes.tcl f8f4837a26f49cff1c65bfd69a47f04ec705c1de F www/conflict.tcl 81dd21f9a679e60aae049e9dd8ab53d59570cda2 F www/crosscompile.tcl 3622ebbe518927a3854a12de51344673eb2dd060 F www/download.tcl a6d75b8b117cd33dcb090bef7e80d7556d28ebe0 @@ -122,7 +122,7 @@ F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5 F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279 F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218 -P 0090c279d83ee355fbac8a484401d29bfa50b0dc -R fc7dddb7f2cee20f2fcdc9937b75f980 +P 4c7dfd93530a2a3e50e78235f4e691a5fec109fe +R 2dd44e4df5f1749abcfa5e153ebc4db9 U drh -Z b9766f8933c95b0873782841a8d26738 +Z 5a2ba11ead7f86f0ca4171fe5af6dcae diff --git a/manifest.uuid b/manifest.uuid index c957f2942c..2b77d69171 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c7dfd93530a2a3e50e78235f4e691a5fec109fe \ No newline at end of file +df6bf627a51358e8b14297403feab7b888c38580 \ No newline at end of file diff --git a/src/select.c b/src/select.c index b2cf364f6f..84eb2c35a0 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.57 2002/02/03 19:06:03 drh Exp $ +** $Id: select.c,v 1.58 2002/02/13 23:22:54 drh Exp $ */ #include "sqliteInt.h" @@ -256,23 +256,24 @@ void generateColumnNames(Parse *pParse, IdList *pTabList, ExprList *pEList){ sqliteVdbeCompressSpace(v, addr); }else if( p->op==TK_COLUMN && pTabList ){ Table *pTab = pTabList->a[p->iTable - pParse->nTab].pTab; + char *zCol; int iCol = p->iColumn; if( iCol<0 ) iCol = pTab->iPKey; - assert( iCol>=0 && iColnCol ); + assert( iCol==-1 || (iCol>=0 && iColnCol) ); + zCol = iCol<0 ? "_ROWID_" : pTab->aCol[iCol].zName; if( pTabList->nId>1 || showFullNames ){ char *zName = 0; char *zTab; zTab = pTabList->a[p->iTable - pParse->nTab].zAlias; if( showFullNames || zTab==0 ) zTab = pTab->zName; - sqliteSetString(&zName, zTab, ".", pTab->aCol[iCol].zName, 0); + sqliteSetString(&zName, zTab, ".", zCol, 0); sqliteVdbeAddOp(v, OP_ColumnName, i, 0); sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); sqliteFree(zName); }else{ - char *zName = pTab->aCol[iCol].zName; sqliteVdbeAddOp(v, OP_ColumnName, i, 0); - sqliteVdbeChangeP3(v, -1, zName, P3_STATIC); + sqliteVdbeChangeP3(v, -1, zCol, P3_STATIC); } }else if( p->span.z && p->span.z[0] ){ int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0); diff --git a/src/where.c b/src/where.c index 022cfbb7b5..dd11202391 100644 --- a/src/where.c +++ b/src/where.c @@ -13,7 +13,7 @@ ** the WHERE clause of SQL statements. Also found here are subroutines ** to generate VDBE code to evaluate expressions. ** -** $Id: where.c,v 1.33 2002/01/28 15:53:05 drh Exp $ +** $Id: where.c,v 1.34 2002/02/13 23:22:54 drh Exp $ */ #include "sqliteInt.h" @@ -439,12 +439,14 @@ WhereInfo *sqliteWhereBegin( cont = pLevel->cont = brk; sqliteVdbeAddOp(v, OP_MustBeInt, 0, brk); if( i==pTabList->nId-1 && pushKey ){ - /* Note: The OP_Dup below will cause the key to be left on the - ** stack if the key does not exists and the OP_NotExists jump is + /* Note: The OP_Dup below will cause the recno to be left on the + ** stack if the record does not exists and the OP_NotExists jump is ** taken. This violates a general rule of the VDBE that you should ** never leave values on the stack in order to avoid a stack overflow. ** But in this case, the OP_Dup will never happen inside of a loop, - ** so it is safe to leave it on the stack. + ** because the pushKey flag is only true for UPDATE and DELETE, not + ** for SELECT, and nested loops only occur on a SELECT. + ** So it is safe to leave the recno on the stack. */ haveKey = 1; sqliteVdbeAddOp(v, OP_Dup, 0, 0); diff --git a/test/misc1.test b/test/misc1.test index cc2ec97c08..a34e354d7a 100644 --- a/test/misc1.test +++ b/test/misc1.test @@ -13,7 +13,7 @@ # This file implements tests for miscellanous features that were # left out of other test files. # -# $Id: misc1.test,v 1.1 2001/09/18 22:17:45 drh Exp $ +# $Id: misc1.test,v 1.2 2002/02/13 23:22:54 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -101,4 +101,17 @@ do_test misc1-2.2 { GROUP BY two, four ORDER BY sum(one) desc} } {8 two no 6 one yes 4 two yes 3 thr yes} +# Here's a test for a bug found by Joel Lucsy. The code below +# was causing an assertion failure. +# +do_test misc1-3.1 { + set r [execsql { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES('hi'); + PRAGMA full_column_names=on; + SELECT rowid, * FROM t1; + }] + lindex $r 1 +} {hi} + finish_test diff --git a/www/changes.tcl b/www/changes.tcl index 732fe6cc78..68272e740c 100644 --- a/www/changes.tcl +++ b/www/changes.tcl @@ -17,6 +17,12 @@ proc chng {date desc} { puts "

    $desc

" } +chng {2002 Feb 13 (2.3.1)} { +
  • Bug fix: An assertion was failing if "PRAGMA full_column_names=ON;" was + set and you did a query that used a rowid, like this: + "SELECT rowid, * FROM ...".
  • +} + chng {2002 Jan 30 (2.3.0)} {
  • Fix a serious bug in the INSERT command which was causing data to go into the wrong columns if the data source was a SELECT and the INSERT