From ba68f8f3f58437deaea3d1bb26ca44a09faa837f Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 19 Nov 2015 16:46:46 +0000 Subject: [PATCH] Fix problems with INSERT INTO ... SELECT ... statements that write to tables with __hidden__ columns. FossilOrigin-Name: 59bd0ec7d4327852ee8c0206b2c59d0a12484db8 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/build.c | 6 ++++-- src/insert.c | 5 +++++ src/select.c | 2 +- src/sqliteInt.h | 2 +- test/hidden.test | 29 ++++++++++++++++++++++++++++- 7 files changed, 51 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e87f64889b..5beeb22a50 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Create\sthe\snew\sTK_ASTERISK\stoken\sto\srepresent\sthe\s"*"\sin\s"SELECT\s*".\s\sFormerly\nthat\soperator\swas\sTK_ALL,\swhich\swas\salso\sused\sfor\sUNION\sALL.\s\sLess\sconfusion\sif\nthey\soperator\ssymbols\sare\sdistinct. -D 2015-11-19T16:33:31.729 +C Fix\sproblems\swith\sINSERT\sINTO\s...\sSELECT\s...\sstatements\sthat\swrite\sto\stables\swith\s__hidden__\scolumns. +D 2015-11-19T16:46:46.075 F Makefile.in d828db6afa6c1fa060d01e33e4674408df1942a1 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e928e68168df69b353300ac87c10105206653a03 @@ -285,7 +285,7 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c d3bdd8462a86492e2ebc9aca4a0168429017de25 F src/btree.h 2d76dee44704c47eed323356a758662724b674a0 F src/btreeInt.h 3ab435ed27adea54d040584b0bcc488ee7db1e38 -F src/build.c c909d178ef900f56aaafa4a509fd1b12a7d52ea6 +F src/build.c 5a3b71786e2b96d2bb92d40f190eb1fe736f25ca F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 509ef9c64d1321f42448f111da86400b1799218a @@ -300,7 +300,7 @@ F src/global.c 508e4087f7b41d688e4762dcf4d4fe28cfbc87f9 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 7aa0846b25ab53e33a16fc3b9417ff87b3c60183 +F src/insert.c edb295a0b669e2dedba65cd546789770ae061277 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/loadext.c 18586e45a215325f15096821e9c082035d4fb810 @@ -339,12 +339,12 @@ F src/printf.c f8fc8f04e75b1e983ef2793c27ec7a43b287e94a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c e8eccb5b4482965f56fc46c69e75ce2da941b18e +F src/select.c 3492a2794b8ff04dce2a91a284492df5725045f5 F src/shell.c f0f59ea60ad297f671b7ae0fb957a736ad17c92c F src/sqlite.h.in fa62718f73553f06b2f2e362fd09ccb4e1cbb626 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 4b66e3e3435da4b4c8c83696d0349f0c503b3924 -F src/sqliteInt.h 339067553cebac9ba7ec0c616b135db7905c20c9 +F src/sqliteInt.h 921678cb43bb7f63364e56757c07f3e6e0eb45c6 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -762,7 +762,7 @@ F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/hexlit.test 1d312fa816dfd3650a3bb488093bc09a0c927f67 -F test/hidden.test 9de6b1631ac23b27801868abaccd1a7f3e96a6f2 +F test/hidden.test df1540ad1017b49a0681ba3b01e0cde051dbeb58 F test/hook.test 162d7cef7a2d2b04839fe14402934e6a1b79442f F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4 F test/ieee754.test 118b665a97a8df0e8f2fbdb07d113e596f4a6b53 @@ -1404,7 +1404,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 011904cad2be2ce34e2f37ffae8ff2f1044a2969 -R 40ad63765b750992e100464bfa82981f -U drh -Z 1545ad0787e026d6592cfaa98e731337 +P 201ac6d449431dadc6b29faecd68b559bd64bc9f +R 1ed430a49a13a08f14d4334a2efebccc +U dan +Z 390e482d41754a020737571e763bbfaa diff --git a/manifest.uuid b/manifest.uuid index 7707d8b725..44fcfa5cdd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -201ac6d449431dadc6b29faecd68b559bd64bc9f \ No newline at end of file +59bd0ec7d4327852ee8c0206b2c59d0a12484db8 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0e8d4cf0ea..f928ba3075 100644 --- a/src/build.c +++ b/src/build.c @@ -1052,10 +1052,12 @@ begin_table_error: /* Set properties of a table column based on the (magical) ** name of the column. */ -void sqlite3ColumnPropertiesFromName(Column *pCol){ +void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ #if SQLITE_ENABLE_HIDDEN_COLUMNS if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ pCol->colFlags |= COLFLAG_HIDDEN; + }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ + pTab->tabFlags |= TF_OOOHidden; } #endif } @@ -1103,7 +1105,7 @@ void sqlite3AddColumn(Parse *pParse, Token *pName){ pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; - sqlite3ColumnPropertiesFromName(pCol); + sqlite3ColumnPropertiesFromName(p, pCol); /* If there is no type specified, columns have the default affinity ** 'BLOB'. If there is a type specified, then sqlite3AddColumnType() will diff --git a/src/insert.c b/src/insert.c index 618b2dee7b..4b8ed22106 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1909,6 +1909,11 @@ static int xferOptimization( for(i=0; inCol; i++){ Column *pDestCol = &pDest->aCol[i]; Column *pSrcCol = &pSrc->aCol[i]; +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + if( (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN ){ + return 0; /* Neither table may have __hidden__ columns */ + } +#endif if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ } diff --git a/src/select.c b/src/select.c index 2cf190b34c..967023420c 100644 --- a/src/select.c +++ b/src/select.c @@ -1659,7 +1659,7 @@ int sqlite3ColumnsFromExprList( if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); } pCol->zName = zName; - sqlite3ColumnPropertiesFromName(pCol); + sqlite3ColumnPropertiesFromName(0, pCol); if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ db->mallocFailed = 1; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 788b348fbd..50a0c97eb0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3331,7 +3331,7 @@ void sqlite3OpenMasterTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3ColumnOfIndex(Index*, i16); void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); -void sqlite3ColumnPropertiesFromName(Column*); +void sqlite3ColumnPropertiesFromName(Table*, Column*); void sqlite3AddColumn(Parse*,Token*); void sqlite3AddNotNull(Parse*, int); void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); diff --git a/test/hidden.test b/test/hidden.test index 07a370c4a5..9914a6ed10 100644 --- a/test/hidden.test +++ b/test/hidden.test @@ -70,5 +70,32 @@ foreach {tn view} { SELECT * FROM x1; } {1 2 3 4 5 {} 7 8 9} } - + +#------------------------------------------------------------------------- +# Test INSERT INTO ... SELECT ... statements that write to tables with +# hidden columns. +# +do_execsql_test 3.1 { + CREATE TABLE t4(a, __hidden__b, c); + INSERT INTO t4 SELECT 1, 2; + SELECT a, __hidden__b, c FROM t4; +} {1 {} 2} + +do_execsql_test 3.2.1 { + CREATE TABLE t5(__hidden__a, b, c); + CREATE TABLE t6(__hidden__a, b, c); + INSERT INTO t6(__hidden__a, b, c) VALUES(1, 2, 3); + INSERT INTO t6(__hidden__a, b, c) VALUES(4, 5, 6); + INSERT INTO t6(__hidden__a, b, c) VALUES(7, 8, 9); +} + +do_execsql_test 3.2.2 { + INSERT INTO t5 SELECT * FROM t6; + SELECT * FROM t5; +} {2 3 5 6 8 9} + +do_execsql_test 3.2.3 { + SELECT __hidden__a FROM t5; +} {{} {} {}} + finish_test