]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the CREATE INDEX statements output by schemalint.tcl, avoid declaring an explicit...
authordan <dan@noemail.net>
Mon, 23 Nov 2015 18:28:07 +0000 (18:28 +0000)
committerdan <dan@noemail.net>
Mon, 23 Nov 2015 18:28:07 +0000 (18:28 +0000)
FossilOrigin-Name: d3aa067c830e98f2074630c4613c557b0ce90a57

manifest
manifest.uuid
tool/schemalint.tcl

index cd40a978a6c1986e27e22c29535e5b7a02276df8..bff04194923de6df16f374aaba15b628c9702335 100644 (file)
--- 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
index b038ee0b5d1a512539f5cdbfa6a1bcc01d999d01..ed4290e83d28aaaae5e26ddcc16a8404adb515c4 100644 (file)
@@ -1 +1 @@
-8f1ef0904d055b5510ec9043810ebf22a8c5e253
\ No newline at end of file
+d3aa067c830e98f2074630c4613c557b0ce90a57
\ No newline at end of file
index 933b277ea2d0ab8537fb8959a8148aac2a2f4ef8..7ed74f90540d28d2cc6b6c54cfedef55513618c8 100644 (file)
@@ -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