From dd9930ef20da779d9046af1ce28745c21668095f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2013 23:37:02 +0000 Subject: [PATCH] Change the sqlite3OpenTable() utility to open the PRIMARY KEY index when reading a WITHOUT ROWID table. FossilOrigin-Name: 247f389930aededaa54ecb792748aa8d0ad6d57b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 11 +---------- src/insert.c | 19 ++++++++++++++++--- src/where.c | 2 +- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index e5466cac3a..17e84b0df0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Construct\ssecondary\sindices\son\sWITHOUT\sROWID\stables. -D 2013-10-23T22:23:03.281 +C Change\sthe\ssqlite3OpenTable()\sutility\sto\sopen\sthe\sPRIMARY\sKEY\sindex\swhen\nreading\sa\sWITHOUT\sROWID\stable. +D 2013-10-23T23:37:02.093 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -168,7 +168,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 509722ce305471b626d3401c0631a808fd33237b F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 -F src/build.c 6970691b8d22c6eb2c1ab0078e4d25c939acfdad +F src/build.c 2dccf54c05a0102fce82a3147c39a4b582a7eb60 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c @@ -182,7 +182,7 @@ F src/global.c 5caf4deab621abb45b4c607aad1bd21c20aac759 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 288b90185e7c01777e14b117f85414a658ee7cdb +F src/insert.c c028df48f0564b43831ce8a14d1e14ac07b6729c F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b @@ -292,7 +292,7 @@ F src/vtab.c 5a423b042eb1402ef77697d03d6a67378d97bc8d F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c 13add0a866a75adb345abfa2ad25585322d472f3 +F src/where.c 3dcdb0912101571b8821d564b90964bb34ea7ad1 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1127,7 +1127,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 36bcc9cb885523fba2f3b0d152de9e08073668c1 -R 5319af9bbb603de112b9787a2a60f8ed +P 2c028ddc85cb45746cad6ab0cefd99134fbd50d7 +R 09a1279eaef47a31655fe176c982c7ce U drh -Z 289de8cc66e2b52514de0b537df4236c +Z faf48e5960db188516b7851e14254c4b diff --git a/manifest.uuid b/manifest.uuid index aa82b4848c..a0b77dfbae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c028ddc85cb45746cad6ab0cefd99134fbd50d7 \ No newline at end of file +247f389930aededaa54ecb792748aa8d0ad6d57b \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0062dd5370..1612a4fb60 100644 --- a/src/build.c +++ b/src/build.c @@ -2631,16 +2631,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ /* Open the table. Loop through all rows of the table, inserting index ** records into the sorter. */ - if( HasRowid(pTab) ){ - sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk!=0 ); - assert( pPk->tnum=pTab->tnum ); - sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pPk->tnum, iDb, - (char*)sqlite3IndexKeyinfo(pParse, pPk), - P4_KEYINFO_HANDOFF); - } + sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); regRecord = sqlite3GetTempReg(pParse); diff --git a/src/insert.c b/src/insert.c index 01156fc5d8..11da609bff 100644 --- a/src/insert.c +++ b/src/insert.c @@ -15,7 +15,13 @@ #include "sqliteInt.h" /* -** Generate code that will open a table for reading. +** Generate code that will open table pTab for reading or writing +** on cursor iCur. +** +** Always acquire a table lock. Always do the open for rowid tables. +** For WITHOUT ROWID tables, only do read opens, and then open the +** PRIMARY KEY index, not the main table, since the main table doesn't +** exist. */ void sqlite3OpenTable( Parse *p, /* Generate code into this VDBE */ @@ -30,8 +36,15 @@ void sqlite3OpenTable( assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb); - sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(pTab->nCol), P4_INT32); + sqlite3VdbeAddOp4(v, opcode, iCur, pTab->tnum, iDb, + SQLITE_INT_TO_PTR(pTab->nCol), P4_INT32); + VdbeComment((v, "%s", pTab->zName)); + }else if( opcode==OP_OpenRead ){ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->tnum=pTab->tnum ); + sqlite3VdbeAddOp4(v, opcode, iCur, pPk->tnum, iDb, + (char*)sqlite3IndexKeyinfo(p, pPk), P4_KEYINFO_HANDOFF); VdbeComment((v, "%s", pTab->zName)); } } diff --git a/src/where.c b/src/where.c index b293de4790..5859f83242 100644 --- a/src/where.c +++ b/src/where.c @@ -5955,7 +5955,7 @@ WhereInfo *sqlite3WhereBegin( sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op); testcase( !pWInfo->okOnePass && pTab->nCol==BMS-1 ); testcase( !pWInfo->okOnePass && pTab->nCol==BMS ); - if( !pWInfo->okOnePass && pTab->nColokOnePass && pTab->nColcolUsed; int n = 0; for(; b; b=b>>1, n++){}