From: dan Date: Mon, 23 Nov 2015 18:28:07 +0000 (+0000) Subject: In the CREATE INDEX statements output by schemalint.tcl, avoid declaring an explicit... X-Git-Tag: version-3.22.0~147^2~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=323f7d3fc6ca95c55eb0e5ae06e6bacb328a10a7;p=thirdparty%2Fsqlite.git In the CREATE INDEX statements output by schemalint.tcl, avoid declaring an explicit collation sequence that is the same as the column's default. FossilOrigin-Name: d3aa067c830e98f2074630c4613c557b0ce90a57 --- diff --git a/manifest b/manifest index cd40a978a6..bff0419492 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\swith\sthis\sbranch. -D 2015-11-23T17:14:03.947 +C In\sthe\sCREATE\sINDEX\sstatements\soutput\sby\sschemalint.tcl,\savoid\sdeclaring\san\sexplicit\scollation\ssequence\sthat\sis\sthe\ssame\sas\sthe\scolumn's\sdefault. +D 2015-11-23T18:28:07.584 F Makefile.in d828db6afa6c1fa060d01e33e4674408df1942a1 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e928e68168df69b353300ac87c10105206653a03 @@ -1381,7 +1381,7 @@ F tool/replace.tcl 7727c60a04299b65a92f5e1590896fea0f25b9e0 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh 0ae485af4fe9f826e2b494be8c81f8ca9e222a4a -F tool/schemalint.tcl e49c9b25c8c43f0531eca96edaf85ce8bd7f308b +F tool/schemalint.tcl ad61083d39cb40e848b9acc1273e4c487bb55cd7 F tool/showdb.c d4476e000a64eca9f5e2c2f68741e747b9778e8d F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 @@ -1406,7 +1406,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 b8f277c9b45c4b30e6690e838a30311aa8d84876 60de5f23424552c98aa760ac89149a3d51f895be -R 00875769a91e68d074e499acf18a7d59 +P 8f1ef0904d055b5510ec9043810ebf22a8c5e253 +R 4b9b445c1607ad5c9f9bdcf33b4eb416 U dan -Z 5eb820ab8a7550b698dcf8a7d000e044 +Z 6d9149db2c512107280c4e32c490b8cb diff --git a/manifest.uuid b/manifest.uuid index b038ee0b5d..ed4290e83d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8f1ef0904d055b5510ec9043810ebf22a8c5e253 \ No newline at end of file +d3aa067c830e98f2074630c4613c557b0ce90a57 \ No newline at end of file diff --git a/tool/schemalint.tcl b/tool/schemalint.tcl index 933b277ea2..7ed74f9054 100644 --- a/tool/schemalint.tcl +++ b/tool/schemalint.tcl @@ -124,32 +124,33 @@ proc expand_eq_list {L} { #-------------------------------------------------------------------------- # Formulate a CREATE INDEX statement that creates an index on table $tname. # -proc eqset_to_index {ctxvar tname eqset {range {}}} { +proc eqset_to_index {ctxvar aCollVar tname eqset {range {}}} { upvar $ctxvar G + upvar $aCollVar aColl + + set rangeset [list] + foreach e [lsort $eqset] { + lappend rangeset [lindex $e 0] [lindex $e 1] ASC + } + set rangeset [concat $rangeset $range] set lCols [list] set idxname $tname - foreach e [lsort $eqset] { - if {[llength $e]==0} continue - foreach {c collate} $e {} - lappend lCols "$c collate $collate" - append idxname "_$c" - if {[string compare -nocase binary $collate]!=0} { - append idxname [string tolower $collate] - } - } - foreach {c collate dir} $range { + foreach {c collate dir} $rangeset { append idxname "_$c" - if {[string compare -nocase binary $collate]!=0} { + set coldef $c + + if {[string compare -nocase $collate $aColl($c)]!=0} { append idxname [string tolower $collate] + append coldef " COLLATE $collate" } + if {$dir=="DESC"} { - lappend lCols "$c collate $collate DESC" + append coldef " DESC" append idxname "desc" - } else { - lappend lCols "$c collate $collate" } + lappend lCols $coldef } set create_index "CREATE INDEX $idxname ON ${tname}(" @@ -184,12 +185,30 @@ proc expand_or_cons {L} { return $lRet } +proc sqlidx_get_coll_map {tname arrayvar} { + upvar $arrayvar aColl + set colnames [list] + db eval "PRAGMA table_info = $tname" x { lappend colnames $x(name) } + db eval "CREATE INDEX schemalint_test ON ${tname}([join $colnames ,])" + + db eval "PRAGMA index_xinfo = schemalint_test" x { + set aColl($x(name)) $x(coll) + } + db eval "DROP INDEX schemalint_test" +} + proc find_trial_indexes {ctxvar} { upvar $ctxvar G foreach t $G(trace) { set tname [lindex $t 0] catch { array unset mask } + # Invoke "PRAGMA table_info" on the table. Use the results to create + # an array mapping from column name to collation sequence. Store the + # array in local variable aColl. + # + sqlidx_get_coll_map $tname aColl + set orderby [list] if {[lindex $t end 0]=="orderby"} { set orderby [lrange [lindex $t end] 1 end] @@ -258,7 +277,7 @@ proc find_trial_indexes {ctxvar} { foreach eqset [expand_eq_list [array get eq]] { if {$eqset != ""} { - eqset_to_index G $tname $eqset + eqset_to_index G aColl $tname $eqset } foreach r $ranges { @@ -274,7 +293,7 @@ proc find_trial_indexes {ctxvar} { if {$bSeen==0} { lappend tail {*}$r } } if {[llength $tail]} { - eqset_to_index G $tname $eqset $r + eqset_to_index G aColl $tname $eqset $r } } } @@ -361,8 +380,8 @@ proc sqlidx_internal_tests {} { } { SELECT a FROM t1, t2 WHERE a=? AND x=c } { - {CREATE INDEX t2_x ON t2(x collate BINARY);} - {CREATE INDEX t1_a_c ON t1(a collate BINARY, c collate BINARY);} + {CREATE INDEX t2_x ON t2(x);} + {CREATE INDEX t1_a_c ON t1(a, c);} } sqlidx_one_test 2 { @@ -370,7 +389,7 @@ proc sqlidx_internal_tests {} { } { SELECT * FROM t1 WHERE b>?; } { - {CREATE INDEX t1_b ON t1(b collate BINARY);} + {CREATE INDEX t1_b ON t1(b);} } sqlidx_one_test 3 { @@ -378,7 +397,7 @@ proc sqlidx_internal_tests {} { } { SELECT * FROM t1 WHERE b COLLATE nocase BETWEEN ? AND ? } { - {CREATE INDEX t1_bnocase ON t1(b collate NOCASE);} + {CREATE INDEX t1_bnocase ON t1(b COLLATE NOCASE);} } sqlidx_one_test 4 { @@ -386,7 +405,7 @@ proc sqlidx_internal_tests {} { } { SELECT a FROM t1 ORDER BY b; } { - {CREATE INDEX t1_b ON t1(b collate BINARY);} + {CREATE INDEX t1_b ON t1(b);} } sqlidx_one_test 5 { @@ -394,7 +413,7 @@ proc sqlidx_internal_tests {} { } { SELECT a FROM t1 WHERE a=? ORDER BY b; } { - {CREATE INDEX t1_a_b ON t1(a collate BINARY, b collate BINARY);} + {CREATE INDEX t1_a_b ON t1(a, b);} } sqlidx_one_test 5 { @@ -402,7 +421,7 @@ proc sqlidx_internal_tests {} { } { SELECT min(a) FROM t1 } { - {CREATE INDEX t1_a ON t1(a collate BINARY);} + {CREATE INDEX t1_a ON t1(a);} } sqlidx_one_test 6 { @@ -410,7 +429,15 @@ proc sqlidx_internal_tests {} { } { SELECT * FROM t1 ORDER BY a ASC, b COLLATE nocase DESC, c ASC; } { - {CREATE INDEX t1_a_bnocasedesc_c ON t1(a collate BINARY, b collate NOCASE DESC, c collate BINARY);} + {CREATE INDEX t1_a_bnocasedesc_c ON t1(a, b COLLATE NOCASE DESC, c);} + } + + sqlidx_one_test 7 { + CREATE TABLE t1(a COLLATE NOCase, b, c); + } { + SELECT * FROM t1 WHERE a=? + } { + {CREATE INDEX t1_a ON t1(a);} } exit