From dd197832251aad2c19687e599aec895e5c142556 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 21 Oct 2013 23:17:23 +0000 Subject: [PATCH 1/8] Improve support for the SQLITE_OMIT_FLAG_PRAGMAS compile-time option. FossilOrigin-Name: f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pragma.c | 34 ++++++++++++++++++++++++++++++++++ tool/mkpragmatab.tcl | 43 +++++++++++++++++++++++++++++++++++++++---- 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9a49cfa35d..5450a8543e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sheader\scomment\swith\sbetter\sinstructions\son\sthe\svfslog.c\nextension. -D 2013-10-19T16:51:39.506 +C Improve\ssupport\sfor\sthe\sSQLITE_OMIT_FLAG_PRAGMAS\scompile-time\soption. +D 2013-10-21T23:17:23.344 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -212,7 +212,7 @@ F src/parse.y a97566d6da75075589a7c716d1bda14b586cf8da F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 -F src/pragma.c 64d3d1f8b4ed144ba85c061d00d96d6be8aa2fea +F src/pragma.c 6fb3125fff078cd81db0039ac778948df4e8cb6f F src/prepare.c fa6988589f39af8504a61731614cd4f6ae71554f F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 @@ -1093,7 +1093,7 @@ F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75 F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383 F tool/mkkeywordhash.c bb52064aa614e1426445e4b2b9b00eeecd23cc79 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e -F tool/mkpragmatab.tcl 3fc52e00a234750675e8a569d2919ff48558e9eb +F tool/mkpragmatab.tcl 17d40faae6c4b865633bfc5763821402a1cbefc3 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 8bce31074e4cbe631bb7676526a048335f4c9f02 F tool/mksqlite3c.tcl d8dc444d403019167260e5578f5c362741f03696 @@ -1126,7 +1126,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 56dca4a65c3b14123272fa0cc5c15530c06fda28 -R 1cee309be53ed4b90f763a6791fd81dc -U drh -Z 23f623447e2329bbecfcb9fee8496fa4 +P 4bd592c8f0e011e203443a6e88008a61d6926df5 +R 53b76eeb5375ab8ab4a6606d590d0d10 +U mistachkin +Z 54790c9a063cf1ed56ef1eaa1dcf530f diff --git a/manifest.uuid b/manifest.uuid index dd2fc69985..43f51523c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bd592c8f0e011e203443a6e88008a61d6926df5 \ No newline at end of file +f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index a1f32c36d3..b130ba461d 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -94,11 +94,13 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) { /* zName: */ "automatic_index", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_AutoIndex }, +#endif #endif { /* zName: */ "busy_timeout", /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, @@ -110,18 +112,22 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "cache_spill", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CacheSpill }, +#endif { /* zName: */ "case_sensitive_like", /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, /* ePragFlag: */ 0, /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "checkpoint_fullfsync", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CkptFullFSync }, +#endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) { /* zName: */ "collation_list", /* ePragTyp: */ PragTyp_COLLATION_LIST, @@ -134,10 +140,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "count_changes", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_CountRows }, +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN { /* zName: */ "data_store_directory", /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, @@ -156,16 +164,20 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) { /* zName: */ "defer_foreign_keys", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_DeferFKs }, #endif +#endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "empty_result_callbacks", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_NullCallback }, +#endif #if !defined(SQLITE_OMIT_UTF16) { /* zName: */ "encoding", /* ePragTyp: */ PragTyp_ENCODING, @@ -184,18 +196,21 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) { /* zName: */ "foreign_keys", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ForeignKeys }, #endif +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) { /* zName: */ "freelist_count", /* ePragTyp: */ PragTyp_HEADER_VALUE, /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "full_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, @@ -204,6 +219,7 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_FullFSync }, +#endif #if defined(SQLITE_HAS_CODEC) { /* zName: */ "hexkey", /* ePragTyp: */ PragTyp_HEXKEY, @@ -214,12 +230,14 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) { /* zName: */ "ignore_check_constraints", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_IgnoreChecks }, #endif +#endif #if !defined(SQLITE_OMIT_AUTOVACUUM) { /* zName: */ "incremental_vacuum", /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, @@ -258,10 +276,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "legacy_file_format", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_LegacyFileFmt }, +#endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE { /* zName: */ "lock_proxy_file", /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, @@ -302,16 +322,19 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "query_only", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_QueryOnly }, +#endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) { /* zName: */ "quick_check", /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "read_uncommitted", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, @@ -320,16 +343,19 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_RecTriggers }, +#endif #if defined(SQLITE_HAS_CODEC) { /* zName: */ "rekey", /* ePragTyp: */ PragTyp_REKEY, /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "reverse_unordered_selects", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ReverseOrder }, +#endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) { /* zName: */ "schema_version", /* ePragTyp: */ PragTyp_HEADER_VALUE, @@ -342,10 +368,12 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "short_column_names", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_ShortColNames }, +#endif { /* zName: */ "shrink_memory", /* ePragTyp: */ PragTyp_SHRINK_MEMORY, /* ePragFlag: */ 0, @@ -354,12 +382,14 @@ static const struct sPragmaNames { /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, /* ePragFlag: */ 0, /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) { /* zName: */ "sql_trace", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_SqlTrace }, #endif +#endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) { /* zName: */ "stats", /* ePragTyp: */ PragTyp_STATS, @@ -394,6 +424,7 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) { /* zName: */ "vdbe_addoptrace", /* ePragTyp: */ PragTyp_FLAG, @@ -412,6 +443,7 @@ static const struct sPragmaNames { /* ePragFlag: */ 0, /* iArg: */ SQLITE_VdbeTrace }, #endif +#endif #if !defined(SQLITE_OMIT_WAL) { /* zName: */ "wal_autocheckpoint", /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, @@ -422,10 +454,12 @@ static const struct sPragmaNames { /* ePragFlag: */ PragFlag_NeedSchema, /* iArg: */ 0 }, #endif +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) { /* zName: */ "writable_schema", /* ePragTyp: */ PragTyp_FLAG, /* ePragFlag: */ 0, /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, +#endif }; /* Number of pragmas: 56 on by default, 68 total. */ /* End of the automatically generated pragma table. diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 1ba0bd6be9..f5ca6d8867 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -14,98 +14,120 @@ set pragma_def { NAME: full_column_names TYPE: FLAG ARG: SQLITE_FullColNames + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: short_column_names TYPE: FLAG ARG: SQLITE_ShortColNames + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: count_changes TYPE: FLAG ARG: SQLITE_CountRows + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: empty_result_callbacks TYPE: FLAG ARG: SQLITE_NullCallback + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: legacy_file_format TYPE: FLAG ARG: SQLITE_LegacyFileFmt + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: fullfsync TYPE: FLAG ARG: SQLITE_FullFSync + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: checkpoint_fullfsync TYPE: FLAG ARG: SQLITE_CkptFullFSync + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: cache_spill TYPE: FLAG ARG: SQLITE_CacheSpill + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: reverse_unordered_selects TYPE: FLAG ARG: SQLITE_ReverseOrder + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: query_only TYPE: FLAG ARG: SQLITE_QueryOnly + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: automatic_index TYPE: FLAG ARG: SQLITE_AutoIndex + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_AUTOMATIC_INDEX) NAME: sql_trace TYPE: FLAG ARG: SQLITE_SqlTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_listing TYPE: FLAG ARG: SQLITE_VdbeListing + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_trace TYPE: FLAG ARG: SQLITE_VdbeTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_addoptrace TYPE: FLAG ARG: SQLITE_VdbeAddopTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: vdbe_debug TYPE: FLAG ARG: SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: defined(SQLITE_DEBUG) NAME: ignore_check_constraints TYPE: FLAG ARG: SQLITE_IgnoreChecks + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_CHECK) NAME: writable_schema TYPE: FLAG ARG: SQLITE_WriteSchema|SQLITE_RecoveryMode + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: read_uncommitted TYPE: FLAG ARG: SQLITE_ReadUncommitted + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: recursive_triggers TYPE: FLAG ARG: SQLITE_RecTriggers + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) NAME: foreign_keys TYPE: FLAG ARG: SQLITE_ForeignKeys + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: defer_foreign_keys TYPE: FLAG ARG: SQLITE_DeferFKs + IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) IF: !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) NAME: default_cache_size @@ -267,6 +289,7 @@ set pragma_def { NAME: soft_heap_limit } +fconfigure stdout -translation lf set name {} set type {} set if {} @@ -296,7 +319,7 @@ foreach line [split $pragma_def \n] { } elseif {$id=="ARG"} { set arg $val } elseif {$id=="IF"} { - set if $val + lappend if $val } elseif {$id=="FLAG"} { foreach term [split $val] { lappend flags $term @@ -362,9 +385,17 @@ set spacer [format { %26s } {}] foreach name $allnames { foreach {type arg if flag} $allbyname($name) break if {$if!=$current_if} { - if {$current_if!=""} {puts "#endif"} + if {$current_if!=""} { + foreach this_if $current_if { + puts "#endif" + } + } set current_if $if - if {$current_if!=""} {puts "#if $current_if"} + if {$current_if!=""} { + foreach this_if $current_if { + puts "#if $this_if" + } + } } set typex [format PragTyp_%-23s $type,] if {$flag==""} { @@ -377,7 +408,11 @@ foreach name $allnames { puts " /* ePragFlag: */ $flagx," puts " /* iArg: */ $arg \175," } -if {$current_if!=""} {puts "#endif"} +if {$current_if!=""} { + foreach this_if $current_if { + puts "#endif" + } +} puts "\175;" # count the number of pragmas, for information purposes From 0578248b082d605a86ac67cc7abdbd7d260f0aab Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2013 15:20:20 +0000 Subject: [PATCH 2/8] Add the ".open" command to the command-line shell. FossilOrigin-Name: 21eccb919441bd111ba414dde3f00862822e2c99 --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/shell.c | 58 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 5450a8543e..7e56b8018a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\ssupport\sfor\sthe\sSQLITE_OMIT_FLAG_PRAGMAS\scompile-time\soption. -D 2013-10-21T23:17:23.344 +C Add\sthe\s".open"\scommand\sto\sthe\scommand-line\sshell. +D 2013-10-24T15:20:20.917 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -219,7 +219,7 @@ F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 -F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb +F src/shell.c d5eebdc6034014103de2b9d58e1d3f6f7de0fb50 F src/sqlite.h.in 547a44dd4ff4d975e92a645ea2d609e543a83d0f F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc @@ -1126,7 +1126,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 4bd592c8f0e011e203443a6e88008a61d6926df5 -R 53b76eeb5375ab8ab4a6606d590d0d10 -U mistachkin -Z 54790c9a063cf1ed56ef1eaa1dcf530f +P f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 +R 669ddc5b90d3123c7996e141023f003e +U drh +Z eb67a516397c437f69feed70887b8d2e diff --git a/manifest.uuid b/manifest.uuid index 43f51523c1..7867b45ac4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 \ No newline at end of file +21eccb919441bd111ba414dde3f00862822e2c99 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 41ea56492e..26c38c59ea 100644 --- a/src/shell.c +++ b/src/shell.c @@ -436,6 +436,7 @@ struct callback_data { ** .explain ON */ char outfile[FILENAME_MAX]; /* Filename for *out */ const char *zDbFilename; /* name of the database file */ + char *zFreeOnClose; /* Filename to free when closing */ const char *zVfs; /* Name of VFS to use */ sqlite3_stmt *pStmt; /* Current statement if any. */ FILE *pLog; /* Write log output here */ @@ -1437,6 +1438,7 @@ static char zHelp[] = " tabs Tab-separated values\n" " tcl TCL list elements\n" ".nullvalue STRING Use STRING in place of NULL values\n" + ".open ?FILENAME? Close existing database and reopen FILENAME\n" ".output FILENAME Send output to FILENAME\n" ".output stdout Send output to the screen\n" ".print STRING... Print literal STRING\n" @@ -1470,7 +1472,7 @@ static int process_input(struct callback_data *p, FILE *in); ** Make sure the database is open. If it is not, then open it. If ** the database fails to open, print an error message and exit. */ -static void open_db(struct callback_data *p){ +static void open_db(struct callback_data *p, int keepAlive){ if( p->db==0 ){ sqlite3_initialize(); sqlite3_open(p->zDbFilename, &p->db); @@ -1482,6 +1484,7 @@ static void open_db(struct callback_data *p){ if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ fprintf(stderr,"Error: unable to open database \"%s\": %s\n", p->zDbFilename, sqlite3_errmsg(db)); + if( keepAlive ) return; exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION @@ -1834,7 +1837,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ sqlite3_close(pDest); return 1; } - open_db(p); + open_db(p, 0); pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); if( pBackup==0 ){ fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); @@ -1866,7 +1869,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 1; data.mode = MODE_Column; @@ -1883,7 +1886,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){ - open_db(p); + open_db(p, 0); /* When playing back a "dump", the content might appear in an order ** which causes immediate foreign key constraints to be violated. ** So disable foreign-key constraint enforcement to prevent problems. */ @@ -2002,7 +2005,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ seenInterrupt = 0; memset(&sCsv, 0, sizeof(sCsv)); - open_db(p); + open_db(p, 0); nSep = strlen30(p->separator); if( nSep==0 ){ fprintf(stderr, "Error: non-null separator required for import\n"); @@ -2140,7 +2143,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 0; data.mode = MODE_List; @@ -2206,7 +2209,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ char *zErrMsg = 0; zFile = azArg[1]; zProc = nArg>=3 ? azArg[2] : 0; - open_db(p); + open_db(p, 0); rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); if( rc!=SQLITE_OK ){ fprintf(stderr, "Error: %s\n", zErrMsg); @@ -2272,6 +2275,26 @@ static int do_meta_command(char *zLine, struct callback_data *p){ "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); }else + if( c=='o' && strncmp(azArg[0], "open", n)==0 && n>=2 ){ + sqlite3 *savedDb = p->db; + const char *zSavedFilename = p->zDbFilename; + char *zNewFilename = 0; + p->db = 0; + if( nArg>=2 ){ + p->zDbFilename = zNewFilename = sqlite3_mprintf("%s", azArg[1]); + } + open_db(p, 1); + if( p->db!=0 ){ + sqlite3_close(savedDb); + sqlite3_free(p->zFreeOnClose); + p->zFreeOnClose = zNewFilename; + }else{ + sqlite3_free(zNewFilename); + p->db = savedDb; + p->zDbFilename = zSavedFilename; + } + }else + if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ if( p->outfile[0]=='|' ){ pclose(p->out); @@ -2355,7 +2378,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ sqlite3_close(pSrc); return 1; } - open_db(p); + open_db(p, 0); pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); if( pBackup==0 ){ fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); @@ -2385,7 +2408,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){ struct callback_data data; char *zErrMsg = 0; - open_db(p); + open_db(p, 0); memcpy(&data, p, sizeof(data)); data.showHeader = 0; data.mode = MODE_Semi; @@ -2516,7 +2539,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ int nRow, nAlloc; char *zSql = 0; int ii; - open_db(p); + open_db(p, 0); rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); if( rc ) return rc; zSql = sqlite3_mprintf( @@ -2616,7 +2639,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ int testctrl = -1; int rc = 0; int i, n; - open_db(p); + open_db(p, 0); /* convert testctrl text option to value. allow any unique prefix ** of the option name, or a numerical value. */ @@ -2715,7 +2738,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){ - open_db(p); + open_db(p, 0); sqlite3_busy_timeout(p->db, (int)integerValue(azArg[1])); }else @@ -2726,7 +2749,7 @@ static int do_meta_command(char *zLine, struct callback_data *p){ }else if( c=='t' && strncmp(azArg[0], "trace", n)==0 && nArg>1 ){ - open_db(p); + open_db(p, 0); output_file_close(p->traceOut); p->traceOut = output_file_open(azArg[1]); #if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) @@ -2918,7 +2941,7 @@ static int process_input(struct callback_data *p, FILE *in){ if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) && sqlite3_complete(zSql) ){ p->cnt = 0; - open_db(p); + open_db(p, 0); BEGIN_TIMER; rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); END_TIMER; @@ -3245,7 +3268,7 @@ int main(int argc, char **argv){ ** to the sqlite command-line tool. */ if( access(data.zDbFilename, 0)==0 ){ - open_db(&data); + open_db(&data, 0); } /* Process the initialization file if there is one. If no -init option @@ -3325,7 +3348,7 @@ int main(int argc, char **argv){ rc = do_meta_command(z, &data); if( rc && bail_on_error ) return rc==2 ? 0 : rc; }else{ - open_db(&data); + open_db(&data, 0); rc = shell_exec(data.db, z, shell_callback, &data, &zErrMsg); if( zErrMsg!=0 ){ fprintf(stderr,"Error: %s\n", zErrMsg); @@ -3349,7 +3372,7 @@ int main(int argc, char **argv){ rc = do_meta_command(zFirstCmd, &data); if( rc==2 ) rc = 0; }else{ - open_db(&data); + open_db(&data, 0); rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg); if( zErrMsg!=0 ){ fprintf(stderr,"Error: %s\n", zErrMsg); @@ -3396,5 +3419,6 @@ int main(int argc, char **argv){ if( data.db ){ sqlite3_close(data.db); } + sqlite3_free(data.zFreeOnClose); return rc; } From 989578e1394179528362d0530e5119d6e0ebdf3f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 14:34:35 +0000 Subject: [PATCH 3/8] Improved "wheretrace" capabilities: Show the constraint expression if the wheretrace flag has the 0x100 bit set and if compiled with SQLITE_ENABLE_TREE_EXPLAIN. FossilOrigin-Name: 710a18ac7916cb688955505d7d461b461f563155 --- manifest | 12 +++++----- manifest.uuid | 2 +- src/where.c | 63 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 7e56b8018a..ca4f6895d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s".open"\scommand\sto\sthe\scommand-line\sshell. -D 2013-10-24T15:20:20.917 +C Improved\s"wheretrace"\scapabilities:\s\sShow\sthe\sconstraint\sexpression\sif\sthe\nwheretrace\sflag\shas\sthe\s0x100\sbit\sset\sand\sif\scompiled\swith\nSQLITE_ENABLE_TREE_EXPLAIN. +D 2013-10-28T14:34:35.937 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -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 dd2d0d69280d6653d8ef8cf3b6b4b848b9058197 +F src/where.c 8eaf13f3047d80841f6f1a38f4dfaf4409528a4b F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,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 f1d8c3b07e61c5a8b39675d0d62876ca15e207f3 -R 669ddc5b90d3123c7996e141023f003e +P 21eccb919441bd111ba414dde3f00862822e2c99 +R 5260b5cc40060f48c72b8d61c27b1dc0 U drh -Z eb67a516397c437f69feed70887b8d2e +Z d9787b9cfeec57eaa314263c770f7600 diff --git a/manifest.uuid b/manifest.uuid index 7867b45ac4..d7cffd19dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -21eccb919441bd111ba414dde3f00862822e2c99 \ No newline at end of file +710a18ac7916cb688955505d7d461b461f563155 \ No newline at end of file diff --git a/src/where.c b/src/where.c index d89ce65137..7a12e8dc76 100644 --- a/src/where.c +++ b/src/where.c @@ -2550,7 +2550,7 @@ static int whereRangeScanEst( nOut = nNew; } pLoop->nOut = (LogEst)nOut; - WHERETRACE(0x100, ("range scan regions: %u..%u est=%d\n", + WHERETRACE(0x10, ("range scan regions: %u..%u est=%d\n", (u32)iLower, (u32)iUpper, nOut)); return SQLITE_OK; } @@ -2636,7 +2636,7 @@ static int whereEqualScanEst( pBuilder->nRecValid = nEq; whereKeyStats(pParse, p, pRec, 0, a); - WHERETRACE(0x100,("equality scan regions: %d\n", (int)a[1])); + WHERETRACE(0x10,("equality scan regions: %d\n", (int)a[1])); *pnRow = a[1]; return rc; @@ -2684,7 +2684,7 @@ static int whereInScanEst( if( rc==SQLITE_OK ){ if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0]; *pnRow = nRowEst; - WHERETRACE(0x100,("IN row estimate: est=%g\n", nRowEst)); + WHERETRACE(0x10,("IN row estimate: est=%g\n", nRowEst)); } assert( pBuilder->nRecValid==nRecValid ); return rc; @@ -3893,9 +3893,9 @@ static Bitmask codeOneLoopStart( /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ - int nb = 1+(pTabList->nSrc+7)/8; - struct SrcList_item *pItem = pTabList->a + p->iTab; +static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ + int nb = 1+(pWInfo->pTabList->nSrc+7)/8; + struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pTab; sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, p->iTab, nb, p->maskSelf, nb, p->prereq); @@ -3927,6 +3927,25 @@ static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ } sqlite3DebugPrintf(" f %04x N %d", p->wsFlags, p->nLTerm); sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); +#ifdef SQLITE_ENABLE_TREE_EXPLAIN + /* If the 0x100 bit of wheretracing is set, then show all of the constraint + ** expressions in the WhereLoop.aLTerm[] array. + */ + if( p->nLTerm && (sqlite3WhereTrace & 0x100)!=0 ){ /* WHERETRACE 0x100 */ + int i; + Vdbe *v = pWInfo->pParse->pVdbe; + sqlite3ExplainBegin(v); + for(i=0; inLTerm; i++){ + sqlite3ExplainPrintf(v, " (%d) ", i+1); + sqlite3ExplainPush(v); + sqlite3ExplainExpr(v, p->aLTerm[i]->pExpr); + sqlite3ExplainPop(v); + sqlite3ExplainNL(v); + } + sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); + sqlite3ExplainFinish(v); + } +#endif } #endif @@ -4066,10 +4085,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #endif whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, pTemplate->nOut); -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif return SQLITE_OK; @@ -4139,14 +4158,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ ** with pTemplate[] if p[] exists, or if p==NULL then allocate a new ** WhereLoop and insert it. */ -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("ins-del: "); - whereLoopPrint(p, pWInfo->pTabList); + whereLoopPrint(p, pWInfo); } sqlite3DebugPrintf("ins-new: "); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif if( p==0 ){ @@ -4167,10 +4186,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ /* Jump here if the insert is a no-op */ whereLoopInsert_noop: -#if WHERETRACE_ENABLED +#if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf("ins-noop: "); - whereLoopPrint(pTemplate, pWInfo->pTabList); + whereLoopPrint(pTemplate, pWInfo); } #endif return SQLITE_OK; @@ -5328,7 +5347,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } if( jj>=nTo ){ if( nTo>=mxChoice && rCost>=mxCost ){ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n", wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, @@ -5346,7 +5365,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ jj = mxI; } pTo = &aTo[jj]; -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("New %s cost=%-3d,%3d order=%c\n", wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, @@ -5355,7 +5374,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #endif }else{ if( pTo->rCost<=rCost && pTo->nRow<=nOut ){ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Skip %s cost=%-3d,%3d order=%c", @@ -5371,7 +5390,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } testcase( pTo->rCost==rCost+1 ); /* A new and better score for a previously created equivalent path */ -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Update %s cost=%-3d,%3d order=%c", @@ -5407,7 +5426,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } } -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* >=2 */ if( sqlite3WhereTrace>=2 ){ sqlite3DebugPrintf("---- after round %d ----\n", iLoop); for(ii=0, pTo=aTo; iipLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%sizeof(zLabel)]; - whereLoopPrint(p, pTabList); + whereLoopPrint(p, pWInfo); } } #endif @@ -5847,7 +5866,7 @@ WhereInfo *sqlite3WhereBegin( if( pParse->nErr || NEVER(db->mallocFailed) ){ goto whereBeginError; } -#ifdef WHERETRACE_ENABLED +#ifdef WHERETRACE_ENABLED /* !=0 */ if( sqlite3WhereTrace ){ int ii; sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); @@ -5870,7 +5889,7 @@ WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, pTabList); + whereLoopPrint(pWInfo->a[ii].pWLoop, pWInfo); } } #endif From c1ba2e7a529dabe1d7670f9e8c9e03315fe769c3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 19:03:21 +0000 Subject: [PATCH 4/8] Bug fix and enhancements to the improved wheretrace logic that shows the constraint expressions. FossilOrigin-Name: 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 30 +++++++++++++++++------------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ca4f6895d2..cafa1e586a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\s"wheretrace"\scapabilities:\s\sShow\sthe\sconstraint\sexpression\sif\sthe\nwheretrace\sflag\shas\sthe\s0x100\sbit\sset\sand\sif\scompiled\swith\nSQLITE_ENABLE_TREE_EXPLAIN. -D 2013-10-28T14:34:35.937 +C Bug\sfix\sand\senhancements\sto\sthe\simproved\swheretrace\slogic\sthat\sshows\sthe\nconstraint\sexpressions. +D 2013-10-28T19:03:21.821 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -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 8eaf13f3047d80841f6f1a38f4dfaf4409528a4b +F src/where.c 65ff0a3241feaebda8c2996f1d56e13e13bfad11 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,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 21eccb919441bd111ba414dde3f00862822e2c99 -R 5260b5cc40060f48c72b8d61c27b1dc0 +P 710a18ac7916cb688955505d7d461b461f563155 +R 89498d16fc02d0b55681c504013a5543 U drh -Z d9787b9cfeec57eaa314263c770f7600 +Z a3f286e08ab862275ce77a1e64b61897 diff --git a/manifest.uuid b/manifest.uuid index d7cffd19dd..c55ac6df95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -710a18ac7916cb688955505d7d461b461f563155 \ No newline at end of file +10f125f5da55eca15e68c74d62ab7d37bbbbfb5f \ No newline at end of file diff --git a/src/where.c b/src/where.c index 7a12e8dc76..3d3989cedc 100644 --- a/src/where.c +++ b/src/where.c @@ -3893,7 +3893,8 @@ static Bitmask codeOneLoopStart( /* ** Print a WhereLoop object for debugging purposes */ -static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ +static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ + WhereInfo *pWInfo = pWC->pWInfo; int nb = 1+(pWInfo->pTabList->nSrc+7)/8; struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pTab; @@ -3902,9 +3903,8 @@ static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ sqlite3DebugPrintf(" %12s", pItem->zAlias ? pItem->zAlias : pTab->zName); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ - if( p->u.btree.pIndex ){ - const char *zName = p->u.btree.pIndex->zName; - if( zName==0 ) zName = "ipk"; + const char *zName; + if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){ int i = sqlite3Strlen30(zName) - 1; while( zName[i]!='_' ) i--; @@ -3936,14 +3936,18 @@ static void whereLoopPrint(WhereLoop *p, WhereInfo *pWInfo){ Vdbe *v = pWInfo->pParse->pVdbe; sqlite3ExplainBegin(v); for(i=0; inLTerm; i++){ - sqlite3ExplainPrintf(v, " (%d) ", i+1); + WhereTerm *pTerm = p->aLTerm[i]; + sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); + if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ + sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); + } sqlite3ExplainPush(v); - sqlite3ExplainExpr(v, p->aLTerm[i]->pExpr); + sqlite3ExplainExpr(v, pTerm->pExpr); sqlite3ExplainPop(v); sqlite3ExplainNL(v); } - sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); sqlite3ExplainFinish(v); + sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); } #endif } @@ -4088,7 +4092,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -4162,10 +4166,10 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ if( sqlite3WhereTrace & 0x8 ){ if( p!=0 ){ sqlite3DebugPrintf("ins-del: "); - whereLoopPrint(p, pWInfo); + whereLoopPrint(p, pBuilder->pWC); } sqlite3DebugPrintf("ins-new: "); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif if( p==0 ){ @@ -4189,7 +4193,7 @@ whereLoopInsert_noop: #if WHERETRACE_ENABLED /* 0x8 */ if( sqlite3WhereTrace & 0x8 ){ sqlite3DebugPrintf("ins-noop: "); - whereLoopPrint(pTemplate, pWInfo); + whereLoopPrint(pTemplate, pBuilder->pWC); } #endif return SQLITE_OK; @@ -5848,7 +5852,7 @@ WhereInfo *sqlite3WhereBegin( "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ p->cId = zLabel[i%sizeof(zLabel)]; - whereLoopPrint(p, pWInfo); + whereLoopPrint(p, sWLB.pWC); } } #endif @@ -5889,7 +5893,7 @@ WhereInfo *sqlite3WhereBegin( } sqlite3DebugPrintf("\n"); for(ii=0; iinLevel; ii++){ - whereLoopPrint(pWInfo->a[ii].pWLoop, pWInfo); + whereLoopPrint(pWInfo->a[ii].pWLoop, sWLB.pWC); } } #endif From f4e9cb065b2a8e80f2ba1523b8b98a809db00154 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 19:59:59 +0000 Subject: [PATCH 5/8] More wheretrace debugging support: Show a listing of all WHERE clause terms (on wheretrace bit 0x100) and include important flags such as TERM_VIRTUAL, WO_EQUIV, and EP_FromJoin. FossilOrigin-Name: 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 41 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index cafa1e586a..fa0bef5701 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bug\sfix\sand\senhancements\sto\sthe\simproved\swheretrace\slogic\sthat\sshows\sthe\nconstraint\sexpressions. -D 2013-10-28T19:03:21.821 +C More\swheretrace\sdebugging\ssupport:\s\sShow\sa\slisting\sof\sall\sWHERE\sclause\nterms\s(on\swheretrace\sbit\s0x100)\sand\sinclude\simportant\sflags\ssuch\sas\nTERM_VIRTUAL,\sWO_EQUIV,\sand\sEP_FromJoin. +D 2013-10-28T19:59:59.733 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -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 65ff0a3241feaebda8c2996f1d56e13e13bfad11 +F src/where.c 0490bd61f1327802e9d892a366b024dd7e39bb60 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,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 710a18ac7916cb688955505d7d461b461f563155 -R 89498d16fc02d0b55681c504013a5543 +P 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f +R 94f7d01ea5e366fe4a18fa71bac07ffd U drh -Z a3f286e08ab862275ce77a1e64b61897 +Z b420ce79c50b8599b09c4667291607ef diff --git a/manifest.uuid b/manifest.uuid index c55ac6df95..f71188cc81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10f125f5da55eca15e68c74d62ab7d37bbbbfb5f \ No newline at end of file +92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 3d3989cedc..266dc92f17 100644 --- a/src/where.c +++ b/src/where.c @@ -3889,6 +3889,25 @@ static Bitmask codeOneLoopStart( return pLevel->notReady; } +#if defined(WHERETRACE_ENABLED) && defined(SQLITE_ENABLE_TREE_EXPLAIN) +/* +** Generate "Explanation" text for a WhereTerm. +*/ +static void whereExplainTerm(Vdbe *v, WhereTerm *pTerm){ + char zType[4]; + memcpy(zType, "...", 4); + if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; + if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + sqlite3ExplainPrintf(v, "%s ", zType); + if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ + sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); + } + sqlite3ExplainExpr(v, pTerm->pExpr); +} +#endif /* WHERETRACE_ENABLED && SQLITE_ENABLE_TREE_EXPLAIN */ + + #ifdef WHERETRACE_ENABLED /* ** Print a WhereLoop object for debugging purposes @@ -3938,11 +3957,8 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ for(i=0; inLTerm; i++){ WhereTerm *pTerm = p->aLTerm[i]; sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); - if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ - sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); - } sqlite3ExplainPush(v); - sqlite3ExplainExpr(v, pTerm->pExpr); + whereExplainTerm(v, pTerm); sqlite3ExplainPop(v); sqlite3ExplainNL(v); } @@ -5839,6 +5855,23 @@ WhereInfo *sqlite3WhereBegin( /* Construct the WhereLoop objects */ WHERETRACE(0xffff,("*** Optimizer Start ***\n")); + /* Display all terms of the WHERE clause */ +#if defined(WHERETRACE_ENABLED) && defined(SQLITE_ENABLE_TREE_EXPLAIN) + if( sqlite3WhereTrace & 0x100 ){ + int i; + Vdbe *v = pParse->pVdbe; + sqlite3ExplainBegin(v); + for(i=0; inTerm; i++){ + sqlite3ExplainPrintf(v, "#%d ", i); + sqlite3ExplainPush(v); + whereExplainTerm(v, &sWLB.pWC->a[i]); + sqlite3ExplainPop(v); + sqlite3ExplainNL(v); + } + sqlite3ExplainFinish(v); + sqlite3DebugPrintf("%s", sqlite3VdbeExplanation(v)); + } +#endif if( nTabList!=1 || whereShortCut(&sWLB)==0 ){ rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; From e1a086e412e5db5dc333937811edde999ae12186 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 20:15:56 +0000 Subject: [PATCH 6/8] Do not use transitive WHERE-clause constraints on LEFT JOINs. Fix for ticket [c620261b5b5dc]. FossilOrigin-Name: 9aac4e588cbce55c1098321bcd042d5b04036893 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fa0bef5701..ea3ef5cc9b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\swheretrace\sdebugging\ssupport:\s\sShow\sa\slisting\sof\sall\sWHERE\sclause\nterms\s(on\swheretrace\sbit\s0x100)\sand\sinclude\simportant\sflags\ssuch\sas\nTERM_VIRTUAL,\sWO_EQUIV,\sand\sEP_FromJoin. -D 2013-10-28T19:59:59.733 +C Do\snot\suse\stransitive\sWHERE-clause\sconstraints\son\sLEFT\sJOINs.\nFix\sfor\sticket\s[c620261b5b5dc]. +D 2013-10-28T20:15:56.749 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -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 0490bd61f1327802e9d892a366b024dd7e39bb60 +F src/where.c 626e04bea7b0c62d8053f816e84da4ffe265599f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,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 10f125f5da55eca15e68c74d62ab7d37bbbbfb5f -R 94f7d01ea5e366fe4a18fa71bac07ffd +P 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 +R ef5741143665f2356ac8fbd9321919ca U drh -Z b420ce79c50b8599b09c4667291607ef +Z da3bdf30486b346ec4f687162cb9e5fe diff --git a/manifest.uuid b/manifest.uuid index f71188cc81..27c8a2d7a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 \ No newline at end of file +9aac4e588cbce55c1098321bcd042d5b04036893 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 266dc92f17..4868a7a0b0 100644 --- a/src/where.c +++ b/src/where.c @@ -878,7 +878,10 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ iColumn = pScan->aEquiv[pScan->iEquiv-1]; while( (pWC = pScan->pWC)!=0 ){ for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ - if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn ){ + if( pTerm->leftCursor==iCur + && pTerm->u.leftColumn==iColumn + && (pScan->iEquiv<=2 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaEquiv) ){ From 70a0222f0763e341c27bea13589d5db176f2df9a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 20:38:52 +0000 Subject: [PATCH 7/8] Add regression tests for ticket [c620261b5b5]. FossilOrigin-Name: 05a35b09b140fed0898afd36bc641e275545a35f --- manifest | 12 +-- manifest.uuid | 2 +- test/transitive1.test | 179 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ea3ef5cc9b..c0dd491e83 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\stransitive\sWHERE-clause\sconstraints\son\sLEFT\sJOINs.\nFix\sfor\sticket\s[c620261b5b5dc]. -D 2013-10-28T20:15:56.749 +C Add\sregression\stests\sfor\sticket\s[c620261b5b5]. +D 2013-10-28T20:38:52.030 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -979,7 +979,7 @@ F test/trace2.test e7a988fdd982cdec62f1f1f34b0360e6476d01a0 F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test d5337e61de45e66b1fcbf9db833fa8c82e624b22 F test/trans3.test 373ac5183cc56be69f48ae44090e7f672939f732 -F test/transitive1.test 0ee69546d6fa20e577a4a706d7daa01c7eba9239 +F test/transitive1.test 03f532954f46cdf5608f7766bff0b0c52bf2a7cd F test/trigger1.test dc47573ac79ffe0ee3eecaa517d70d8dacbccd03 F test/trigger2.test 834187beafd1db383af0c659cfa49b0576832816 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 @@ -1126,7 +1126,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 92ccd705411ce3f64720ab5f34c7efc9cb46d5c9 -R ef5741143665f2356ac8fbd9321919ca +P 9aac4e588cbce55c1098321bcd042d5b04036893 +R 755b6f8582cdf6a61e2dc488ee0ff755 U drh -Z da3bdf30486b346ec4f687162cb9e5fe +Z d41611593bf5e267c6a2f2cb626395da diff --git a/manifest.uuid b/manifest.uuid index 27c8a2d7a9..8c3bceda23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9aac4e588cbce55c1098321bcd042d5b04036893 \ No newline at end of file +05a35b09b140fed0898afd36bc641e275545a35f \ No newline at end of file diff --git a/test/transitive1.test b/test/transitive1.test index 4cf439bb45..200dc610fa 100644 --- a/test/transitive1.test +++ b/test/transitive1.test @@ -102,4 +102,183 @@ do_execsql_test transitive1-332 { ORDER BY w DESC; } {3 4 3 6 1 2 1 3} +# Ticket [c620261b5b5dc] circa 2013-10-28. +# Make sureconstraints are not used with LEFT JOINs. +# +# The next case is from the ticket report. It outputs no rows in 3.8.1 +# prior to the bug-fix. +# +do_execsql_test transitive1-400 { + CREATE TABLE t401(a); + CREATE TABLE t402(b); + CREATE TABLE t403(c INTEGER PRIMARY KEY); + INSERT INTO t401 VALUES(1); + INSERT INTO t403 VALUES(1); + SELECT '1-row' FROM t401 LEFT JOIN t402 ON b=a JOIN t403 ON c=a; +} {1-row} + +# The following is a script distilled from the XBMC project where the +# bug was originally encountered. The correct answer is a single row +# of output. Before the bug was fixed, zero rows were generated. +# +do_execsql_test transitive1-410 { + CREATE TABLE bookmark ( idBookmark integer primary key, idFile integer, timeInSeconds double, totalTimeInSeconds double, thumbNailImage text, player text, playerState text, type integer); + CREATE TABLE path ( idPath integer primary key, strPath text, strContent text, strScraper text, strHash text, scanRecursive integer, useFolderNames bool, strSettings text, noUpdate bool, exclude bool, dateAdded text); + INSERT INTO "path" VALUES(1,'/tmp/tvshows/','tvshows','metadata.tvdb.com','989B1CE5680A14F5F86123F751169B49',0,0,'',0,0,NULL); + INSERT INTO "path" VALUES(2,'/tmp/tvshows/The.Big.Bang.Theory/','','','85E1DAAB2F5FF6EAE8AEDF1B5C882D1E',NULL,NULL,NULL,NULL,NULL,'2013-10-23 18:58:43'); + CREATE TABLE files ( idFile integer primary key, idPath integer, strFilename text, playCount integer, lastPlayed text, dateAdded text); + INSERT INTO "files" VALUES(1,2,'The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv',NULL,NULL,'2013-10-23 18:57:36'); + CREATE TABLE tvshow ( idShow integer primary key,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 text,c13 text,c14 text,c15 text,c16 text,c17 text,c18 text,c19 text,c20 text,c21 text,c22 text,c23 text); + INSERT INTO "tvshow" VALUES(1,'The Big Bang Theory','Leonard Hofstadter and Sheldon Cooper are brilliant physicists, the kind of "beautiful minds" that understand how the universe works. But none of that genius helps them interact with people, especially women. All this begins to change when a free-spirited beauty named Penny moves in next door. Sheldon, Leonard''s roommate, is quite content spending his nights playing Klingon Boggle with their socially dysfunctional friends, fellow CalTech scientists Howard Wolowitz and Raj Koothrappali. However, Leonard sees in Penny a whole new universe of possibilities... including love.','','','9.200000','2007-09-24','http://thetvdb.com/banners/graphical/80379-g13.jpghttp://thetvdb.com/banners/graphical/80379-g23.jpghttp://thetvdb.com/banners/graphical/80379-g18.jpghttp://thetvdb.com/banners/graphical/80379-g17.jpghttp:// + thetvdb.com/banners/graphical/80379-g6.jpghttp://thetvdb.com/banners/graphical/80379-g5.jpghttp://thetvdb.com/banners/graphical/80379-g2.jpghttp://thetvdb.com/banners/graphical/80379-g11.jpghttp://thetvdb.com/banners/graphical/80379-g12.jpghttp://thetvdb.com/banners/graphical/80379-g19.jpghttp://thetvdb.com/banners/graphical/80379-g3.jpghttp://thetvdb.com/banners/graphical/80379-g4.jpghttp://thetvdb.com/banners/graphical/80379-g15.jpghttp://thetvdb.com/banners/graphical/80379-g.jpghttp://thetvdb.com/banners/graphical/80379-g22.jpghttp://thetvdb.com/banners/graphical/80379-g7.jpghttp://thetvdb.com/banners/graphical/80379-g10.jpghttp://thetvdb.com/banners/graphical/80379-g24.jpghttp://thetvdb.com/banners/graphical/80379-g8.jpghttp://thetvdb.com/banners/graphical/80379-g9.jpghttp://thetvdb.com/banners/graphical/80379-g14.jpghttp://thetvdb.com/banners/graphical/80379-g16.jpghttp://thetvdb.com/banners/graphical/80379-g21.jpghttp://thetvdb.com/banners/text/80379-4.jpghttp://thetvdb.com/banners/text/80379-2.jpghttp://thetvdb.com/banners/text/80379-3.jpghttp://thetvdb.com/banners/text/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-6-8.jpghttp://thetvdb.com/banners/seasons/80379-0-4.jpghttp://thetvdb.com/banners/seasons/80379-1-12.jpghttp://thetvdb.com/banners/seasons/80379-3-9.jpghttp://thetvdb.com/banners/seasons/80379-2-11.jpghttp://thetvdb.com/banners/seasons/80379-5-9.jpghttp://thetvdb.com/banners/seasons/80379-4-8.jpghttp://thetvdb.com/banners/seasons/80379-7-3.jpghttp://thetvdb.com/banners/seasons/80379-3-4.jpghttp://thetvdb.com/banners/seasons/80379-4-5.jpghttp://thetvdb.com/banners/seasons/80379-2-9.jpghttp://thetvdb.com/banners/seasons/80379-0-2.jpghttp://thetvdb.com/banners/seasons/80379-6-6.jpghttp://thetvdb.com/banners/seasons/80379-4-4.jpghttp://thetvdb.com/banners/seasons/80379-6-2.jpghttp://thetvdb.com/banners/seasons/80379-1-9.jpghttp://thetvdb.com/banners/seasons/80379-6-4.jpghttp://thetvdb.com/banners/seasons/80379-1.jpghttp://thetvdb.com/banners/seasons/80379-3.jpghttp://thetvdb.com/banners/seasons/80379-4-2.jpghttp://thetvdb.com/banners/seasons/80379-5-7.jpghttp://thetvdb.com/banners/seasons/80379-2-10.jpghttp://thetvdb.com/banners/seasons/80379-6-5.jpghttp://thetvdb.com/banners/seasons/80379-1-5.jpghttp://thetvdb.com/banners/seasons/80379-5-4.jpghttp://thetvdb.com/banners/seasons/80379-4.jpghttp://thetvdb.com/banners/seasons/80379-6-3.jpghttp://thetvdb.com/banners/seasons/80379-5.jpghttp://thetvdb.com/banners/seasons/80379-3-6.jpghttp://thetvdb.com/banners/seasons/80379-2.jpghttp://thetvdb.com/banners/seasons/80379-7.jpghttp://thetvdb.com/banners/seasons/80379- + 1-7.jpghttp://thetvdb.com/banners/seasons/80379-5-2.jpghttp://thetvdb.com/banners/seasons/80379-5-3.jpghttp://thetvdb.com/banners/seasons/80379-7-2.jpghttp://thetvdb.com/banners/seasons/80379-1-2.jpghttp://thetvdb.com/banners/seasons/80379-2-5.jpghttp://thetvdb.com/banners/seasons/80379-4-3.jpghttp://thetvdb.com/banners/seasons/80379-5-5.jpghttp://thetvdb.com/banners/seasons/80379-0.jpghttp://thetvdb.com/banners/seasons/80379-3-5.jpghttp://thetvdb.com/banners/ + seasons/80379-1-6.jpghttp://thetvdb.com/banners/seasons/80379-2-3.jpghttp://thetvdb.com/banners/seasons/80379-2-8.jpghttp://thetvdb.com/banners/seasons/80379-6-7.jpghttp://thetvdb.com/banners/seasons/80379-5-8.jpghttp://thetvdb.com/banners/seasons/80379-4-7.jpghttp://thetvdb.com/banners/seasons/80379-2-6.jpghttp://thetvdb.com/banners/seasons/80379-3-8.jpghttp://thetvdb.com/banners/seasons/80379-1-11.jpghttp://thetvdb.com/banners/seasons/80379-1-10.jpghttp:// + thetvdb.com/banners/seasons/80379-1-8.jpghttp://thetvdb.com/banners/seasons/80379-3-7.jpghttp://thetvdb.com/banners/seasons/80379-2-4.jpghttp://thetvdb.com/banners/seasons/80379-1-3.jpghttp://thetvdb.com/banners/seasons/80379-1-4.jpghttp://thetvdb.com/banners/seasons/80379-3-3.jpghttp://thetvdb.com/banners/seasons/80379-2-7.jpghttp://thetvdb.com/banners/seasons/80379-6.jpghttp://thetvdb.com/banners/seasons/80379-2-2.jpghttp://thetvdb.com/banners/seasons/80379-5-6.jpghttp://thetvdb.com/banners/seasons/80379-3-2.jpghttp://thetvdb.com/banners/seasons/80379-4-6.jpghttp://thetvdb.com/banners/seasonswide/80379-5.jpghttp://thetvdb.com/banners/seasonswide/80379-3-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1-2.jpghttp://thetvdb.com/banners/seasonswide/80379-2-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4-2.jpghttp://thetvdb.com/banners/seasonswide/80379-0.jpghttp://thetvdb.com/banners/seasonswide/80379-0-2.jpghttp://thetvdb.com/banners/seasonswide/80379-1.jpghttp://thetvdb.com/banners/seasonswide/80379-2.jpghttp://thetvdb.com/banners/seasonswide/80379-4.jpghttp://thetvdb.com/banners/seasonswide/80379-3.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpghttp://thetvdb.com/banners/posters/80379-22.jpghttp://thetvdb.com/banners/posters/80379-18.jpghttp://thetvdb.com/banners/posters/80379-13.jpghttp://thetvdb.com/banners/posters/80379-10.jpghttp://thetvdb.com/banners/posters/80379-16.jpghttp://thetvdb.com/banners/posters/80379-1.jpghttp://thetvdb.com/banners/posters/80379-9.jpghttp://thetvdb.com/banners/posters/80379-2.jpghttp://thetvdb.com/banners/posters/80379-19.jpghttp://thetvdb.com/banners/posters/80379-8.jpghttp://thetvdb.com/banners/posters/80379-4.jpghttp://thetvdb.com/banners/posters/80379-20.jpghttp://thetvdb.com/banners/posters/80379-23.jpghttp://thetvdb.com/banners/posters/80379-7.jpghttp://thetvdb.com/banners/posters/80379-3.jpghttp://thetvdb.com/banners/posters/80379-12.jpghttp://thetvdb.com/banners/posters/80379-11.jpghttp://thetvdb.com/banners/posters/80379-15.jpghttp://thetvdb.com/banners/posters/80379-21.jpghttp://thetvdb.com/banners/posters/80379-14.jpghttp://thetvdb.com/banners/posters/80379-17.jpghttp://thetvdb.com/banners/posters/80379-6.jpghttp://thetvdb.com/banners/posters/80379-5.jpg','','Comedy','','http://thetvdb.com/api/1D62F2F90030C444/series/80379/all/en.zip','fanart/original/80379-2.jpgfanart/original/80379-34.jpgfanart/original/80379- + 4.jpgfanart/original/80379-42.jpgfanart/original/80379-37.jpgfanart/original/80379-14.jpgfanart/original/80379-16.jpgfanart/original/80379-1.jpgfanart/original/80379-35.jpgfanart/original/80379-40.jpgfanart/original/80379-31.jpgfanart/original/80379-29.jpgfanart/original/80379-11.jpgfanart/original/80379-24.jpgfanart/original/80379-30.jpgfanart/original/80379-19.jpgfanart/original/80379-9.jpgfanart/original/80379-13.jpgfanart/original/80379-45.jpgfanart/original/80379-33.jpgfanart/original/80379-10.jpgfanart/original/80379-23.jpgfanart/original/80379-12.jpgfanart/original/80379-5.jpgfanart/original/80379-26.jpgfanart/original/80379-27.jpgfanart/original/80379-32.jpgfanart/original/80379-3.jpgfanart/original/80379-25.jpgfanart/original/80379-7.jpgfanart/original/80379-21.jpgfanart/original/80379-28.jpgfanart/original/80379-36.jpgfanart/original/80379-38.jpgfanart/original/80379-20.jpgfanart/original/80379-17.jpgfanart/original/80379-43.jpgfanart/original/80379-22.jpgfanart/original/80379-15.jpgfanart/original/80379-18.jpgfanart/original/80379-6.jpgfanart/original/80379-8.jpgfanart/original/80379-41.jpgfanart/original/80379-44.jpgfanart/original/80379-39.jpg','80379','TV-PG','CBS','','/tmp/tvshows/The.Big.Bang.Theory/','1',NULL,NULL,NULL,NULL,NULL,NULL); + CREATE TABLE episode ( idEpisode integer primary key, idFile integer,c00 text,c01 text,c02 text,c03 text,c04 text,c05 text,c06 text,c07 text,c08 text,c09 text,c10 text,c11 text,c12 varchar(24),c13 varchar(24),c14 text,c15 text,c16 text,c17 varchar(24),c18 text,c19 text,c20 text,c21 text,c22 text,c23 text, idShow integer); + INSERT INTO "episode" VALUES(1,1,'Pilot','Brilliant physicist roommates Leonard and Sheldon meet their new neighbor Penny, who begins showing them that as much as they know about science, they know little about actual living.','','7.700000','Chuck Lorre / Bill Prady','2007-09-24','http://thetvdb.com/banners/episodes/80379/332484.jpg','',NULL,'1800','James Burrows','','1','1','','-1','-1','-1','/tmp/tvshows/The.Big.Bang.Theory/The.Big.Bang.Theory.S01E01.WEB-DL.AAC2.0.H264.mkv','2','332484',NULL,NULL,NULL,1); + CREATE TABLE tvshowlinkpath (idShow integer, idPath integer); + INSERT INTO "tvshowlinkpath" VALUES(1,2); + CREATE TABLE seasons ( idSeason integer primary key, idShow integer, season integer); + INSERT INTO "seasons" VALUES(1,1,-1); + INSERT INTO "seasons" VALUES(2,1,0); + INSERT INTO "seasons" VALUES(3,1,1); + INSERT INTO "seasons" VALUES(4,1,2); + INSERT INTO "seasons" VALUES(5,1,3); + INSERT INTO "seasons" VALUES(6,1,4); + INSERT INTO "seasons" VALUES(7,1,5); + INSERT INTO "seasons" VALUES(8,1,6); + INSERT INTO "seasons" VALUES(9,1,7); + CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT); + INSERT INTO "art" VALUES(1,1,'actor','thumb','http://thetvdb.com/banners/actors/73597.jpg'); + INSERT INTO "art" VALUES(2,2,'actor','thumb','http://thetvdb.com/banners/actors/73596.jpg'); + INSERT INTO "art" VALUES(3,3,'actor','thumb','http://thetvdb.com/banners/actors/73595.jpg'); + INSERT INTO "art" VALUES(4,4,'actor','thumb','http://thetvdb.com/banners/actors/73599.jpg'); + INSERT INTO "art" VALUES(5,5,'actor','thumb','http://thetvdb.com/banners/actors/73598.jpg'); + INSERT INTO "art" VALUES(6,6,'actor','thumb','http://thetvdb.com/banners/actors/283158.jpg'); + INSERT INTO "art" VALUES(7,7,'actor','thumb','http://thetvdb.com/banners/actors/283157.jpg'); + INSERT INTO "art" VALUES(8,8,'actor','thumb','http://thetvdb.com/banners/actors/91271.jpg'); + INSERT INTO "art" VALUES(9,9,'actor','thumb','http://thetvdb.com/banners/actors/294178.jpg'); + INSERT INTO "art" VALUES(10,10,'actor','thumb','http://thetvdb.com/banners/actors/283159.jpg'); + INSERT INTO "art" VALUES(11,1,'tvshow','banner','http://thetvdb.com/banners/graphical/80379-g13.jpg'); + INSERT INTO "art" VALUES(12,1,'tvshow','fanart','http://thetvdb.com/banners/fanart/original/80379-2.jpg'); + INSERT INTO "art" VALUES(13,1,'tvshow','poster','http://thetvdb.com/banners/posters/80379-22.jpg'); + INSERT INTO "art" VALUES(14,1,'season','poster','http://thetvdb.com/banners/posters/80379-22.jpg'); + INSERT INTO "art" VALUES(15,2,'season','banner','http://thetvdb.com/banners/seasonswide/80379-0.jpg'); + INSERT INTO "art" VALUES(16,2,'season','poster','http://thetvdb.com/banners/seasons/80379-0-4.jpg'); + INSERT INTO "art" VALUES(17,3,'season','banner','http://thetvdb.com/banners/seasonswide/80379-1-2.jpg'); + INSERT INTO "art" VALUES(18,3,'season','poster','http://thetvdb.com/banners/seasons/80379-1-12.jpg'); + INSERT INTO "art" VALUES(19,4,'season','banner','http://thetvdb.com/banners/seasonswide/80379-2-2.jpg'); + INSERT INTO "art" VALUES(20,4,'season','poster','http://thetvdb.com/banners/seasons/80379-2-11.jpg'); + INSERT INTO "art" VALUES(21,5,'season','banner','http://thetvdb.com/banners/seasonswide/80379-3-2.jpg'); + INSERT INTO "art" VALUES(22,5,'season','poster','http://thetvdb.com/banners/seasons/80379-3-9.jpg'); + INSERT INTO "art" VALUES(23,6,'season','banner','http://thetvdb.com/banners/seasonswide/80379-4-2.jpg'); + INSERT INTO "art" VALUES(24,6,'season','poster','http://thetvdb.com/banners/seasons/80379-4-8.jpg'); + INSERT INTO "art" VALUES(25,7,'season','banner','http://thetvdb.com/banners/seasonswide/80379-5.jpg'); + INSERT INTO "art" VALUES(26,7,'season','poster','http://thetvdb.com/banners/seasons/80379-5-9.jpg'); + INSERT INTO "art" VALUES(27,8,'season','poster','http://thetvdb.com/banners/seasons/80379-6-8.jpg'); + INSERT INTO "art" VALUES(28,9,'season','poster','http://thetvdb.com/banners/seasons/80379-7-3.jpg'); + INSERT INTO "art" VALUES(29,1,'episode','thumb','http://thetvdb.com/banners/episodes/80379/332484.jpg'); + CREATE INDEX ix_bookmark ON bookmark (idFile, type); + CREATE INDEX ix_path ON path ( strPath ); + CREATE INDEX ix_files ON files ( idPath, strFilename ); + CREATE UNIQUE INDEX ix_episode_file_1 on episode (idEpisode, idFile); + CREATE UNIQUE INDEX id_episode_file_2 on episode (idFile, idEpisode); + CREATE INDEX ix_episode_season_episode on episode (c12, c13); + CREATE INDEX ix_episode_bookmark on episode (c17); + CREATE INDEX ix_episode_show1 on episode(idEpisode,idShow); + CREATE INDEX ix_episode_show2 on episode(idShow,idEpisode); + CREATE UNIQUE INDEX ix_tvshowlinkpath_1 ON tvshowlinkpath ( idShow, idPath ); + CREATE UNIQUE INDEX ix_tvshowlinkpath_2 ON tvshowlinkpath ( idPath, idShow ); + CREATE INDEX ixEpisodeBasePath ON episode ( c19 ); + CREATE INDEX ixTVShowBasePath on tvshow ( c17 ); + CREATE INDEX ix_seasons ON seasons (idShow, season); + CREATE INDEX ix_art ON art(media_id, media_type, type); + CREATE VIEW episodeview + AS + SELECT episode.*, + files.strfilename AS strFileName, + path.strpath AS strPath, + files.playcount AS playCount, + files.lastplayed AS lastPlayed, + files.dateadded AS dateAdded, + tvshow.c00 AS strTitle, + tvshow.c14 AS strStudio, + tvshow.c05 AS premiered, + tvshow.c13 AS mpaa, + tvshow.c16 AS strShowPath, + bookmark.timeinseconds AS resumeTimeInSeconds, + bookmark.totaltimeinseconds AS totalTimeInSeconds, + seasons.idseason AS idSeason + FROM episode + JOIN files + ON files.idfile = episode.idfile + JOIN tvshow + ON tvshow.idshow = episode.idshow + LEFT JOIN seasons + ON seasons.idshow = episode.idshow + AND seasons.season = episode.c12 + JOIN path + ON files.idpath = path.idpath + LEFT JOIN bookmark + ON bookmark.idfile = episode.idfile + AND bookmark.type = 1; + CREATE VIEW tvshowview + AS + SELECT tvshow.*, + path.strpath AS strPath, + path.dateadded AS dateAdded, + Max(files.lastplayed) AS lastPlayed, + NULLIF(Count(episode.c12), 0) AS totalCount, + Count(files.playcount) AS watchedcount, + NULLIF(Count(DISTINCT( episode.c12 )), 0) AS totalSeasons + FROM tvshow + LEFT JOIN tvshowlinkpath + ON tvshowlinkpath.idshow = tvshow.idshow + LEFT JOIN path + ON path.idpath = tvshowlinkpath.idpath + LEFT JOIN episode + ON episode.idshow = tvshow.idshow + LEFT JOIN files + ON files.idfile = episode.idfile + GROUP BY tvshow.idshow; + SELECT + episodeview.c12, + path.strPath, + tvshowview.c00, + tvshowview.c01, + tvshowview.c05, + tvshowview.c08, + tvshowview.c14, + tvshowview.c13, + seasons.idSeason, + count(1), + count(files.playCount) + FROM episodeview + JOIN tvshowview ON tvshowview.idShow = episodeview.idShow + JOIN seasons ON (seasons.idShow = tvshowview.idShow + AND seasons.season = episodeview.c12) + JOIN files ON files.idFile = episodeview.idFile + JOIN tvshowlinkpath ON tvshowlinkpath.idShow = tvshowview.idShow + JOIN path ON path.idPath = tvshowlinkpath.idPath + WHERE tvshowview.idShow = 1 + GROUP BY episodeview.c12; +} {1 /tmp/tvshows/The.Big.Bang.Theory/ {The Big Bang Theory} {Leonard Hofstadter and Sheldon Cooper are brilliant physicists, the kind of "beautiful minds" that understand how the universe works. But none of that genius helps them interact with people, especially women. All this begins to change when a free-spirited beauty named Penny moves in next door. Sheldon, Leonard's roommate, is quite content spending his nights playing Klingon Boggle with their socially dysfunctional friends, fellow CalTech scientists Howard Wolowitz and Raj Koothrappali. However, Leonard sees in Penny a whole new universe of possibilities... including love.} 2007-09-24 Comedy CBS TV-PG 3 1 0} + + finish_test From 7afc8b0c3f374e5b8f60a15dcc9bf9945f81cb78 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2013 22:33:36 +0000 Subject: [PATCH 8/8] Formatting improvements to the WHERE-clause constraint display in the wheretrace debugging logic. FossilOrigin-Name: 3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 7 ++----- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index c0dd491e83..f66ec4132d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sregression\stests\sfor\sticket\s[c620261b5b5]. -D 2013-10-28T20:38:52.030 +C Formatting\simprovements\sto\sthe\sWHERE-clause\sconstraint\sdisplay\sin\sthe\nwheretrace\sdebugging\slogic. +D 2013-10-28T22:33:36.558 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -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 626e04bea7b0c62d8053f816e84da4ffe265599f +F src/where.c f18400f121fd27385f41cdff7aa8a811feca842e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1126,7 +1126,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 9aac4e588cbce55c1098321bcd042d5b04036893 -R 755b6f8582cdf6a61e2dc488ee0ff755 +P 05a35b09b140fed0898afd36bc641e275545a35f +R ff7bb3f8071649882bf49e664fcf0a45 U drh -Z d41611593bf5e267c6a2f2cb626395da +Z 9d63edd4f24f764673ec22cc76454487 diff --git a/manifest.uuid b/manifest.uuid index 8c3bceda23..9f87ae481e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05a35b09b140fed0898afd36bc641e275545a35f \ No newline at end of file +3a9e3ed94bf617f00c48009b1a6d348a8f23a3cf \ No newline at end of file diff --git a/src/where.c b/src/where.c index 4868a7a0b0..304732db67 100644 --- a/src/where.c +++ b/src/where.c @@ -3903,9 +3903,6 @@ static void whereExplainTerm(Vdbe *v, WhereTerm *pTerm){ if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; sqlite3ExplainPrintf(v, "%s ", zType); - if( (pTerm->wtFlags & (TERM_ORINFO|TERM_ANDINFO))==0 ){ - sqlite3ExplainPrintf(v, "lhs=%-2d ", pTerm->u.leftColumn); - } sqlite3ExplainExpr(v, pTerm->pExpr); } #endif /* WHERETRACE_ENABLED && SQLITE_ENABLE_TREE_EXPLAIN */ @@ -3959,7 +3956,7 @@ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ sqlite3ExplainBegin(v); for(i=0; inLTerm; i++){ WhereTerm *pTerm = p->aLTerm[i]; - sqlite3ExplainPrintf(v, " (%d) #%d ", i+1, (int)(pTerm-pWC->a)); + sqlite3ExplainPrintf(v, " (%d) #%-2d ", i+1, (int)(pTerm-pWC->a)); sqlite3ExplainPush(v); whereExplainTerm(v, pTerm); sqlite3ExplainPop(v); @@ -5865,7 +5862,7 @@ WhereInfo *sqlite3WhereBegin( Vdbe *v = pParse->pVdbe; sqlite3ExplainBegin(v); for(i=0; inTerm; i++){ - sqlite3ExplainPrintf(v, "#%d ", i); + sqlite3ExplainPrintf(v, "#%-2d ", i); sqlite3ExplainPush(v); whereExplainTerm(v, &sWLB.pWC->a[i]); sqlite3ExplainPop(v);