1# 2005 August 13 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing the LIKE and GLOB operators and 13# in particular the optimizations that occur to help those operators 14# run faster. 15# 16# $Id: like.test,v 1.13 2009/06/07 23:45:11 drh Exp $ 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21# Create some sample data to work with. 22# 23do_test like-1.0 { 24 execsql { 25 CREATE TABLE t1(x TEXT); 26 } 27 foreach str { 28 a 29 ab 30 abc 31 abcd 32 33 acd 34 abd 35 bc 36 bcd 37 38 xyz 39 ABC 40 CDE 41 {ABC abc xyz} 42 } { 43 db eval {INSERT INTO t1 VALUES(:str)} 44 } 45 execsql { 46 SELECT count(*) FROM t1; 47 } 48} {12} 49 50# Test that both case sensitive and insensitive version of LIKE work. 51# 52do_test like-1.1 { 53 execsql { 54 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; 55 } 56} {ABC abc} 57do_test like-1.2 { 58 execsql { 59 SELECT x FROM t1 WHERE x GLOB 'abc' ORDER BY 1; 60 } 61} {abc} 62do_test like-1.3 { 63 execsql { 64 SELECT x FROM t1 WHERE x LIKE 'ABC' ORDER BY 1; 65 } 66} {ABC abc} 67do_test like-1.4 { 68 execsql { 69 SELECT x FROM t1 WHERE x LIKE 'aBc' ORDER BY 1; 70 } 71} {ABC abc} 72do_test like-1.5.1 { 73 execsql { 74 PRAGMA case_sensitive_like=on; 75 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; 76 } 77} {abc} 78do_test like-1.5.2 { 79 execsql { 80 PRAGMA case_sensitive_like; -- no argument; does not change setting 81 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; 82 } 83} {abc} 84do_test like-1.6 { 85 execsql { 86 SELECT x FROM t1 WHERE x GLOB 'abc' ORDER BY 1; 87 } 88} {abc} 89do_test like-1.7 { 90 execsql { 91 SELECT x FROM t1 WHERE x LIKE 'ABC' ORDER BY 1; 92 } 93} {ABC} 94do_test like-1.8 { 95 execsql { 96 SELECT x FROM t1 WHERE x LIKE 'aBc' ORDER BY 1; 97 } 98} {} 99do_test like-1.9 { 100 execsql { 101 PRAGMA case_sensitive_like=off; 102 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; 103 } 104} {ABC abc} 105do_test like-1.10 { 106 execsql { 107 PRAGMA case_sensitive_like; -- No argument, does not change setting. 108 SELECT x FROM t1 WHERE x LIKE 'abc' ORDER BY 1; 109 } 110} {ABC abc} 111 112# Tests of the REGEXP operator 113# 114do_test like-2.1 { 115 proc test_regexp {a b} { 116 return [regexp $a $b] 117 } 118 db function regexp test_regexp 119 execsql { 120 SELECT x FROM t1 WHERE x REGEXP 'abc' ORDER BY 1; 121 } 122} {{ABC abc xyz} abc abcd} 123do_test like-2.2 { 124 execsql { 125 SELECT x FROM t1 WHERE x REGEXP '^abc' ORDER BY 1; 126 } 127} {abc abcd} 128 129# Tests of the MATCH operator 130# 131do_test like-2.3 { 132 proc test_match {a b} { 133 return [string match $a $b] 134 } 135 db function match -argcount 2 test_match 136 execsql { 137 SELECT x FROM t1 WHERE x MATCH '*abc*' ORDER BY 1; 138 } 139} {{ABC abc xyz} abc abcd} 140do_test like-2.4 { 141 execsql { 142 SELECT x FROM t1 WHERE x MATCH 'abc*' ORDER BY 1; 143 } 144} {abc abcd} 145 146# For the remaining tests, we need to have the like optimizations 147# enabled. 148# 149ifcapable !like_opt { 150 finish_test 151 return 152} 153 154# This procedure executes the SQL. Then it appends to the result the 155# "sort" or "nosort" keyword (as in the cksort procedure above) then 156# it appends the ::sqlite_query_plan variable. 157# 158proc queryplan {sql} { 159 set ::sqlite_sort_count 0 160 set data [execsql $sql] 161 if {$::sqlite_sort_count} {set x sort} {set x nosort} 162 lappend data $x 163 return [concat $data $::sqlite_query_plan] 164} 165 166# Perform tests on the like optimization. 167# 168# With no index on t1.x and with case sensitivity turned off, no optimization 169# is performed. 170# 171do_test like-3.1 { 172 set sqlite_like_count 0 173 queryplan { 174 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; 175 } 176} {ABC {ABC abc xyz} abc abcd sort t1 {}} 177do_test like-3.2 { 178 set sqlite_like_count 179} {12} 180 181# With an index on t1.x and case sensitivity on, optimize completely. 182# 183do_test like-3.3 { 184 set sqlite_like_count 0 185 execsql { 186 PRAGMA case_sensitive_like=on; 187 CREATE INDEX i1 ON t1(x); 188 } 189 queryplan { 190 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; 191 } 192} {abc abcd nosort {} i1} 193do_test like-3.4 { 194 set sqlite_like_count 195} 0 196 197# Partial optimization when the pattern does not end in '%' 198# 199do_test like-3.5 { 200 set sqlite_like_count 0 201 queryplan { 202 SELECT x FROM t1 WHERE x LIKE 'a_c' ORDER BY 1; 203 } 204} {abc nosort {} i1} 205do_test like-3.6 { 206 set sqlite_like_count 207} 6 208do_test like-3.7 { 209 set sqlite_like_count 0 210 queryplan { 211 SELECT x FROM t1 WHERE x LIKE 'ab%d' ORDER BY 1; 212 } 213} {abcd abd nosort {} i1} 214do_test like-3.8 { 215 set sqlite_like_count 216} 4 217do_test like-3.9 { 218 set sqlite_like_count 0 219 queryplan { 220 SELECT x FROM t1 WHERE x LIKE 'a_c%' ORDER BY 1; 221 } 222} {abc abcd nosort {} i1} 223do_test like-3.10 { 224 set sqlite_like_count 225} 6 226 227# No optimization when the pattern begins with a wildcard. 228# Note that the index is still used but only for sorting. 229# 230do_test like-3.11 { 231 set sqlite_like_count 0 232 queryplan { 233 SELECT x FROM t1 WHERE x LIKE '%bcd' ORDER BY 1; 234 } 235} {abcd bcd nosort {} i1} 236do_test like-3.12 { 237 set sqlite_like_count 238} 12 239 240# No optimization for case insensitive LIKE 241# 242do_test like-3.13 { 243 set sqlite_like_count 0 244 queryplan { 245 PRAGMA case_sensitive_like=off; 246 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; 247 } 248} {ABC {ABC abc xyz} abc abcd nosort {} i1} 249do_test like-3.14 { 250 set sqlite_like_count 251} 12 252 253# No optimization without an index. 254# 255do_test like-3.15 { 256 set sqlite_like_count 0 257 queryplan { 258 PRAGMA case_sensitive_like=on; 259 DROP INDEX i1; 260 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1; 261 } 262} {abc abcd sort t1 {}} 263do_test like-3.16 { 264 set sqlite_like_count 265} 12 266 267# No GLOB optimization without an index. 268# 269do_test like-3.17 { 270 set sqlite_like_count 0 271 queryplan { 272 SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; 273 } 274} {abc abcd sort t1 {}} 275do_test like-3.18 { 276 set sqlite_like_count 277} 12 278 279# GLOB is optimized regardless of the case_sensitive_like setting. 280# 281do_test like-3.19 { 282 set sqlite_like_count 0 283 queryplan { 284 CREATE INDEX i1 ON t1(x); 285 SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; 286 } 287} {abc abcd nosort {} i1} 288do_test like-3.20 { 289 set sqlite_like_count 290} 0 291do_test like-3.21 { 292 set sqlite_like_count 0 293 queryplan { 294 PRAGMA case_sensitive_like=on; 295 SELECT x FROM t1 WHERE x GLOB 'abc*' ORDER BY 1; 296 } 297} {abc abcd nosort {} i1} 298do_test like-3.22 { 299 set sqlite_like_count 300} 0 301do_test like-3.23 { 302 set sqlite_like_count 0 303 queryplan { 304 PRAGMA case_sensitive_like=off; 305 SELECT x FROM t1 WHERE x GLOB 'a[bc]d' ORDER BY 1; 306 } 307} {abd acd nosort {} i1} 308do_test like-3.24 { 309 set sqlite_like_count 310} 6 311 312# No optimization if the LHS of the LIKE is not a column name or 313# if the RHS is not a string. 314# 315do_test like-4.1 { 316 execsql {PRAGMA case_sensitive_like=on} 317 set sqlite_like_count 0 318 queryplan { 319 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1 320 } 321} {abc abcd nosort {} i1} 322do_test like-4.2 { 323 set sqlite_like_count 324} 0 325do_test like-4.3 { 326 set sqlite_like_count 0 327 queryplan { 328 SELECT x FROM t1 WHERE +x LIKE 'abc%' ORDER BY 1 329 } 330} {abc abcd nosort {} i1} 331do_test like-4.4 { 332 set sqlite_like_count 333} 12 334do_test like-4.5 { 335 set sqlite_like_count 0 336 queryplan { 337 SELECT x FROM t1 WHERE x LIKE ('ab' || 'c%') ORDER BY 1 338 } 339} {abc abcd nosort {} i1} 340do_test like-4.6 { 341 set sqlite_like_count 342} 12 343 344# Collating sequences on the index disable the LIKE optimization. 345# Or if the NOCASE collating sequence is used, the LIKE optimization 346# is enabled when case_sensitive_like is OFF. 347# 348do_test like-5.1 { 349 execsql {PRAGMA case_sensitive_like=off} 350 set sqlite_like_count 0 351 queryplan { 352 SELECT x FROM t1 WHERE x LIKE 'abc%' ORDER BY 1 353 } 354} {ABC {ABC abc xyz} abc abcd nosort {} i1} 355do_test like-5.2 { 356 set sqlite_like_count 357} 12 358do_test like-5.3 { 359 execsql { 360 CREATE TABLE t2(x TEXT COLLATE NOCASE); 361 INSERT INTO t2 SELECT * FROM t1; 362 CREATE INDEX i2 ON t2(x COLLATE NOCASE); 363 } 364 set sqlite_like_count 0 365 queryplan { 366 SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1 367 } 368} {abc ABC {ABC abc xyz} abcd nosort {} i2} 369do_test like-5.4 { 370 set sqlite_like_count 371} 0 372do_test like-5.5 { 373 execsql { 374 PRAGMA case_sensitive_like=on; 375 } 376 set sqlite_like_count 0 377 queryplan { 378 SELECT x FROM t2 WHERE x LIKE 'abc%' ORDER BY 1 379 } 380} {abc abcd nosort {} i2} 381do_test like-5.6 { 382 set sqlite_like_count 383} 12 384do_test like-5.7 { 385 execsql { 386 PRAGMA case_sensitive_like=off; 387 } 388 set sqlite_like_count 0 389 queryplan { 390 SELECT x FROM t2 WHERE x GLOB 'abc*' ORDER BY 1 391 } 392} {abc abcd nosort {} i2} 393do_test like-5.8 { 394 set sqlite_like_count 395} 12 396do_test like-5.11 { 397 execsql {PRAGMA case_sensitive_like=off} 398 set sqlite_like_count 0 399 queryplan { 400 SELECT x FROM t1 WHERE x LIKE 'ABC%' ORDER BY 1 401 } 402} {ABC {ABC abc xyz} abc abcd nosort {} i1} 403do_test like-5.12 { 404 set sqlite_like_count 405} 12 406do_test like-5.13 { 407 set sqlite_like_count 0 408 queryplan { 409 SELECT x FROM t2 WHERE x LIKE 'ABC%' ORDER BY 1 410 } 411} {abc ABC {ABC abc xyz} abcd nosort {} i2} 412do_test like-5.14 { 413 set sqlite_like_count 414} 0 415do_test like-5.15 { 416 execsql { 417 PRAGMA case_sensitive_like=on; 418 } 419 set sqlite_like_count 0 420 queryplan { 421 SELECT x FROM t2 WHERE x LIKE 'ABC%' ORDER BY 1 422 } 423} {ABC {ABC abc xyz} nosort {} i2} 424do_test like-5.16 { 425 set sqlite_like_count 426} 12 427do_test like-5.17 { 428 execsql { 429 PRAGMA case_sensitive_like=off; 430 } 431 set sqlite_like_count 0 432 queryplan { 433 SELECT x FROM t2 WHERE x GLOB 'ABC*' ORDER BY 1 434 } 435} {ABC {ABC abc xyz} nosort {} i2} 436do_test like-5.18 { 437 set sqlite_like_count 438} 12 439 440# Boundary case. The prefix for a LIKE comparison is rounded up 441# when constructing the comparison. Example: "ab" becomes "ac". 442# In other words, the last character is increased by one. 443# 444# Make sure this happens correctly when the last character is a 445# "z" and we are doing case-insensitive comparisons. 446# 447# Ticket #2959 448# 449do_test like-5.21 { 450 execsql { 451 PRAGMA case_sensitive_like=off; 452 INSERT INTO t2 VALUES('ZZ-upper-upper'); 453 INSERT INTO t2 VALUES('zZ-lower-upper'); 454 INSERT INTO t2 VALUES('Zz-upper-lower'); 455 INSERT INTO t2 VALUES('zz-lower-lower'); 456 } 457 queryplan { 458 SELECT x FROM t2 WHERE x LIKE 'zz%'; 459 } 460} {zz-lower-lower zZ-lower-upper Zz-upper-lower ZZ-upper-upper nosort {} i2} 461do_test like-5.22 { 462 queryplan { 463 SELECT x FROM t2 WHERE x LIKE 'zZ%'; 464 } 465} {zz-lower-lower zZ-lower-upper Zz-upper-lower ZZ-upper-upper nosort {} i2} 466do_test like-5.23 { 467 queryplan { 468 SELECT x FROM t2 WHERE x LIKE 'Zz%'; 469 } 470} {zz-lower-lower zZ-lower-upper Zz-upper-lower ZZ-upper-upper nosort {} i2} 471do_test like-5.24 { 472 queryplan { 473 SELECT x FROM t2 WHERE x LIKE 'ZZ%'; 474 } 475} {zz-lower-lower zZ-lower-upper Zz-upper-lower ZZ-upper-upper nosort {} i2} 476do_test like-5.25 { 477 queryplan { 478 PRAGMA case_sensitive_like=on; 479 CREATE TABLE t3(x TEXT); 480 CREATE INDEX i3 ON t3(x); 481 INSERT INTO t3 VALUES('ZZ-upper-upper'); 482 INSERT INTO t3 VALUES('zZ-lower-upper'); 483 INSERT INTO t3 VALUES('Zz-upper-lower'); 484 INSERT INTO t3 VALUES('zz-lower-lower'); 485 SELECT x FROM t3 WHERE x LIKE 'zz%'; 486 } 487} {zz-lower-lower nosort {} i3} 488do_test like-5.26 { 489 queryplan { 490 SELECT x FROM t3 WHERE x LIKE 'zZ%'; 491 } 492} {zZ-lower-upper nosort {} i3} 493do_test like-5.27 { 494 queryplan { 495 SELECT x FROM t3 WHERE x LIKE 'Zz%'; 496 } 497} {Zz-upper-lower nosort {} i3} 498do_test like-5.28 { 499 queryplan { 500 SELECT x FROM t3 WHERE x LIKE 'ZZ%'; 501 } 502} {ZZ-upper-upper nosort {} i3} 503 504 505# ticket #2407 506# 507# Make sure the LIKE prefix optimization does not strip off leading 508# characters of the like pattern that happen to be quote characters. 509# 510do_test like-6.1 { 511 foreach x { 'abc 'bcd 'def 'ax } { 512 set x2 '[string map {' ''} $x]' 513 db eval "INSERT INTO t2 VALUES($x2)" 514 } 515 execsql { 516 SELECT * FROM t2 WHERE x LIKE '''a%' 517 } 518} {'abc 'ax} 519 520do_test like-7.1 { 521 execsql { 522 SELECT rowid, * FROM t1 WHERE rowid GLOB '1*' ORDER BY rowid; 523 } 524} {1 a 10 ABC 11 CDE 12 {ABC abc xyz}} 525 526# ticket #3345. 527# 528# Overloading the LIKE function with -1 for the number of arguments 529# will overload both the 2-argument and the 3-argument LIKE. 530# 531do_test like-8.1 { 532 db eval { 533 CREATE TABLE t8(x); 534 INSERT INTO t8 VALUES('abcdef'); 535 INSERT INTO t8 VALUES('ghijkl'); 536 INSERT INTO t8 VALUES('mnopqr'); 537 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; 538 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; 539 } 540} {1 ghijkl 2 ghijkl} 541do_test like-8.2 { 542 proc newlike {args} {return 1} ;# Alternative LIKE is always return TRUE 543 db function like newlike ;# Uses -1 for nArg in sqlite3_create_function 544 db cache flush 545 db eval { 546 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; 547 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; 548 } 549} {1 ghijkl 2 ghijkl} 550do_test like-8.3 { 551 db function like -argcount 2 newlike 552 db eval { 553 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; 554 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; 555 } 556} {1 abcdef 1 ghijkl 1 mnopqr 2 ghijkl} 557do_test like-8.4 { 558 db function like -argcount 3 newlike 559 db eval { 560 SELECT 1, x FROM t8 WHERE x LIKE '%h%'; 561 SELECT 2, x FROM t8 WHERE x LIKE '%h%' ESCAPE 'x'; 562 } 563} {1 abcdef 1 ghijkl 1 mnopqr 2 abcdef 2 ghijkl 2 mnopqr} 564 565 566ifcapable like_opt { 567 # Evaluate SQL. Return the result set followed by the 568 # and the number of full-scan steps. 569 # 570 db close 571 sqlite3 db test.db 572 proc count_steps {sql} { 573 set r [db eval $sql] 574 lappend r scan [db status step] sort [db status sort] 575 } 576 do_test like-9.1 { 577 count_steps { 578 SELECT x FROM t2 WHERE x LIKE 'x%' 579 } 580 } {xyz scan 0 sort 0} 581 do_test like-9.2 { 582 count_steps { 583 SELECT x FROM t2 WHERE x LIKE '_y%' 584 } 585 } {xyz scan 19 sort 0} 586 do_test like-9.3.1 { 587 set res [sqlite3_exec_hex db { 588 SELECT x FROM t2 WHERE x LIKE '%78%25' 589 }] 590 } {0 {x xyz}} 591 ifcapable explain { 592 do_test like-9.3.2 { 593 set res [sqlite3_exec_hex db { 594 EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%78%25' 595 }] 596 regexp {INDEX i2} $res 597 } {1} 598 } 599 do_test like-9.4.1 { 600 sqlite3_exec_hex db {INSERT INTO t2 VALUES('%ffhello')} 601 set res [sqlite3_exec_hex db { 602 SELECT substr(x,2) AS x FROM t2 WHERE +x LIKE '%ff%25' 603 }] 604 } {0 {x hello}} 605 do_test like-9.4.2 { 606 set res [sqlite3_exec_hex db { 607 SELECT substr(x,2) AS x FROM t2 WHERE x LIKE '%ff%25' 608 }] 609 } {0 {x hello}} 610 ifcapable explain { 611 do_test like-9.4.3 { 612 set res [sqlite3_exec_hex db { 613 EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%ff%25' 614 }] 615 regexp {INDEX i2} $res 616 } {0} 617 } 618 do_test like-9.5.1 { 619 set res [sqlite3_exec_hex db { 620 SELECT x FROM t2 WHERE x LIKE '%fe%25' 621 }] 622 } {0 {}} 623 ifcapable explain { 624 do_test like-9.5.2 { 625 set res [sqlite3_exec_hex db { 626 EXPLAIN QUERY PLAN SELECT x FROM t2 WHERE x LIKE '%fe%25' 627 }] 628 regexp {INDEX i2} $res 629 } {1} 630 } 631} 632 633# Do an SQL statement. Append the search count to the end of the result. 634# 635proc count sql { 636 set ::sqlite_search_count 0 637 set ::sqlite_like_count 0 638 return [concat [execsql $sql] scan $::sqlite_search_count \ 639 like $::sqlite_like_count] 640} 641 642# The LIKE and GLOB optimizations do not work on columns with 643# affinity other than TEXT. 644# Ticket #3901 645# 646do_test like-10.1 { 647 db close 648 sqlite3 db test.db 649 execsql { 650 CREATE TABLE t10( 651 a INTEGER PRIMARY KEY, 652 b INTEGER COLLATE nocase UNIQUE, 653 c NUMBER COLLATE nocase UNIQUE, 654 d BLOB COLLATE nocase UNIQUE, 655 e COLLATE nocase UNIQUE, 656 f TEXT COLLATE nocase UNIQUE 657 ); 658 INSERT INTO t10 VALUES(1,1,1,1,1,1); 659 INSERT INTO t10 VALUES(12,12,12,12,12,12); 660 INSERT INTO t10 VALUES(123,123,123,123,123,123); 661 INSERT INTO t10 VALUES(234,234,234,234,234,234); 662 INSERT INTO t10 VALUES(345,345,345,345,345,345); 663 INSERT INTO t10 VALUES(45,45,45,45,45,45); 664 } 665 count { 666 SELECT a FROM t10 WHERE b LIKE '12%' ORDER BY a; 667 } 668} {12 123 scan 5 like 6} 669do_test like-10.2 { 670 count { 671 SELECT a FROM t10 WHERE c LIKE '12%' ORDER BY a; 672 } 673} {12 123 scan 5 like 6} 674do_test like-10.3 { 675 count { 676 SELECT a FROM t10 WHERE d LIKE '12%' ORDER BY a; 677 } 678} {12 123 scan 5 like 6} 679do_test like-10.4 { 680 count { 681 SELECT a FROM t10 WHERE e LIKE '12%' ORDER BY a; 682 } 683} {12 123 scan 5 like 6} 684do_test like-10.5 { 685 count { 686 SELECT a FROM t10 WHERE f LIKE '12%' ORDER BY a; 687 } 688} {12 123 scan 3 like 0} 689do_test like-10.6 { 690 count { 691 SELECT a FROM t10 WHERE a LIKE '12%' ORDER BY a; 692 } 693} {12 123 scan 5 like 6} 694do_test like-10.10 { 695 execsql { 696 CREATE TABLE t10b( 697 a INTEGER PRIMARY KEY, 698 b INTEGER UNIQUE, 699 c NUMBER UNIQUE, 700 d BLOB UNIQUE, 701 e UNIQUE, 702 f TEXT UNIQUE 703 ); 704 INSERT INTO t10b SELECT * FROM t10; 705 } 706 count { 707 SELECT a FROM t10b WHERE b GLOB '12*' ORDER BY a; 708 } 709} {12 123 scan 5 like 6} 710do_test like-10.11 { 711 count { 712 SELECT a FROM t10b WHERE c GLOB '12*' ORDER BY a; 713 } 714} {12 123 scan 5 like 6} 715do_test like-10.12 { 716 count { 717 SELECT a FROM t10b WHERE d GLOB '12*' ORDER BY a; 718 } 719} {12 123 scan 5 like 6} 720do_test like-10.13 { 721 count { 722 SELECT a FROM t10b WHERE e GLOB '12*' ORDER BY a; 723 } 724} {12 123 scan 5 like 6} 725do_test like-10.14 { 726 count { 727 SELECT a FROM t10b WHERE f GLOB '12*' ORDER BY a; 728 } 729} {12 123 scan 3 like 0} 730do_test like-10.15 { 731 count { 732 SELECT a FROM t10b WHERE a GLOB '12*' ORDER BY a; 733 } 734} {12 123 scan 5 like 6} 735 736 737finish_test 738