-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
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
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
#--------------------------------------------------------------------------
# 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}("
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]
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 {
if {$bSeen==0} { lappend tail {*}$r }
}
if {[llength $tail]} {
- eqset_to_index G $tname $eqset $r
+ eqset_to_index G aColl $tname $eqset $r
}
}
}
} {
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 {
} {
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 {
} {
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 {
} {
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 {
} {
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 {
} {
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 {
} {
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