]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Test cases added derived from the enhancment ticket. covering-indexed-expr
authordrh <>
Mon, 28 Nov 2022 18:17:42 +0000 (18:17 +0000)
committerdrh <>
Mon, 28 Nov 2022 18:17:42 +0000 (18:17 +0000)
FossilOrigin-Name: c022c0152ad61a4f56e36f4062609073e2273fbf6f826c20652159be229c2d46

manifest
manifest.uuid
test/indexexpr1.test

index c83d4173b2c7af0c7d48f19f7bdd369a488d1742..c76ad7a3121548643b04b7c133416839de7999aa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\strunk\schanges\sinto\scovering-index-expr\sbranch.
-D 2022-11-28T16:11:10.036
+C Test\scases\sadded\sderived\sfrom\sthe\senhancment\sticket.
+D 2022-11-28T18:17:42.151
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -1213,7 +1213,7 @@ F test/index7.test b238344318e0b4e42126717f6554f0e7dfd0b39cecad4b736039b43e1e3b6
 F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a912a3
 F test/index9.test 2ac891806a4136ef3e91280477e23114e67575207dc331e6797fa0ed9379f997
 F test/indexedby.test f21eca4f7a6ffe14c8500a7ad6cd53166666c99e5ccd311842a28bc94a195fe0
-F test/indexexpr1.test 3360c2a29a8844e7c4b13293567025281257f9e13a31854cfff6959cede11502
+F test/indexexpr1.test 1cd460113e3999a1477754fd0e3ac0d7bcbbbc742b427b418945f28af708c695
 F test/indexexpr2.test 2c7abe3c48f8aaa5a448615ab4d13df3662185d28419c00999670834a3f0b484
 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811
 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7
@@ -2064,8 +2064,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b8eec4214363192e6f3e12b3faa5810d8269a5fdaecab3ec09b02e5002cf798a b44ab10c49bc2895483a9d40813be3798710ee713cc4bf04e449dce55a68452a
-R 5944640ae5b4a3237e1d8a4c46c48db4
+P 89d775ada39aed4dc532374ace02156d07dc06e8ae54a194608af0c5a582d20f
+R e73156e3b8e8d088eb2bbd902f358640
 U drh
-Z 9aa95e661b7edb77eed478b829e7796d
+Z b96271db8dd85961a10ccefd57c768e1
 # Remove this line to create a well-formed Fossil manifest.
index e7c719444ed711b774f34a8a2fda8f12a97f44f4..a270d0f31b4cd2f6a06dbab50c12e2bd17bfa4d7 100644 (file)
@@ -1 +1 @@
-89d775ada39aed4dc532374ace02156d07dc06e8ae54a194608af0c5a582d20f
\ No newline at end of file
+c022c0152ad61a4f56e36f4062609073e2273fbf6f826c20652159be229c2d46
\ No newline at end of file
index 042132b81d59db4a30fe7df00a8c948f40a15c33..a5d1514bcd56d88ae99d75520d53da1880f7326c 100644 (file)
@@ -420,7 +420,7 @@ do_execsql_test indexexpr1-1500 {
 # 2018-01-03 OSSFuzz discovers another test case for the same problem
 # above.
 #
-do_execsql_test indexexpr-1510 {
+do_execsql_test indexexpr1-1510 {
   DROP TABLE IF EXISTS t1;
   CREATE TABLE t1(a PRIMARY KEY,b UNIQUE);
   REPLACE INTO t1 VALUES(2, 1);
@@ -434,18 +434,18 @@ do_execsql_test indexexpr-1510 {
 # a numeric table column, trouble can arise since there are multiple
 # string that can map to the same numeric value.  (Ex: 123, 0123, 000123).
 #
-do_execsql_test indexexpr-1600 {
+do_execsql_test indexexpr1-1600 {
   DROP TABLE IF EXISTS t1;
   CREATE TABLE t1 (a INTEGER, b);
   CREATE INDEX idx1 ON t1 (lower(a));
   INSERT INTO t1 VALUES('0001234',3);
   PRAGMA integrity_check;
 } {ok}
-do_execsql_test indexexpr-1610 {
+do_execsql_test indexexpr1-1610 {
   INSERT INTO t1 VALUES('1234',0),('001234',2),('01234',1);
   SELECT b FROM t1 WHERE lower(a)='1234' ORDER BY +b;
 } {0 1 2 3}
-do_execsql_test indexexpr-1620 {
+do_execsql_test indexexpr1-1620 {
   SELECT b FROM t1 WHERE lower(a)='01234' ORDER BY +b;
 } {}
 
@@ -453,7 +453,7 @@ do_execsql_test indexexpr-1620 {
 # ExprImpliesExpr theorem prover bug:
 # "(NULL IS FALSE) IS FALSE" does not imply "NULL IS NULL"
 #
-do_execsql_test indexexpr-1700 {
+do_execsql_test indexexpr1-1700 {
   DROP TABLE IF EXISTS t0;
   CREATE TABLE t0(c0);
   INSERT INTO t0(c0) VALUES (0);
@@ -468,17 +468,17 @@ do_execsql_test indexexpr-1700 {
 # computing the expression.
 #
 ifcapable like_match_blobs {
-  do_execsql_test indexexpr-1800 {
+  do_execsql_test indexexpr1-1800 {
     DROP TABLE IF EXISTS t0;
     CREATE TABLE t0(c0 REAL, c1 TEXT);
     CREATE INDEX i0 ON t0(+c0, c0);
     INSERT INTO t0(c0) VALUES(0);
     SELECT CAST(+ t0.c0 AS BLOB) LIKE 0 FROM t0; 
   } {0}
-  do_execsql_test indexexpr-1810 {
+  do_execsql_test indexexpr1-1810 {
     SELECT CAST(+ t0.c0 AS BLOB) LIKE '0.0' FROM t0; 
   } {1}
-  do_execsql_test indexexpr-1820 {
+  do_execsql_test indexexpr1-1820 {
     DROP TABLE IF EXISTS t1;
     CREATE TABLE t1(x REAL);
     CREATE INDEX t1x ON t1(x, +x);
@@ -491,19 +491,80 @@ ifcapable like_match_blobs {
 # Assertion fault during a DELETE INDEXED BY.
 #
 reset_db
-do_execsql_test indexexpr-1900 {
+do_execsql_test indexexpr1-1900 {
   CREATE TABLE t1(x TEXT PRIMARY KEY, y TEXT, z INT);
   INSERT INTO t1(x,y,z) VALUES('alpha','ALPHA',1),('bravo','charlie',1);
   CREATE INDEX i1 ON t1(+y COLLATE NOCASE);
   SELECT * FROM t1;
 } {alpha ALPHA 1 bravo charlie 1}
-do_execsql_test indexexpr-1910 {
+do_execsql_test indexexpr1-1910 {
   DELETE FROM t1 INDEXED BY i1 
    WHERE x IS +y COLLATE NOCASE IN (SELECT z FROM t1)
   RETURNING *;
 } {alpha ALPHA 1}
-do_execsql_test indexexpr-1920 {
+do_execsql_test indexexpr1-1920 {
   SELECT * FROM t1;
 } {bravo charlie 1}
 
+# 2022-11-28 Ticket 695a1a53de
+# Improved ability to recognize that an index on an expression is a
+# covering index.
+#
+reset_db
+do_execsql_test indexexpr1-2000 {
+  CREATE TABLE t1(a INT, b TEXT);
+  INSERT INTO t1(a,b) VALUES
+    (10, '{"one":5,"two":6}'),
+    (10, '{"one":50,"two":60}'),
+    (10, '{"three":99}'),
+    (11, '{"one":100,"two":200}');
+  CREATE INDEX t1_one ON t1(a, b->>'one');
+  CREATE INDEX t1_two ON t1(a, b->>'two');
+}
+do_execsql_test indexexpr1-2010 {
+  EXPLAIN QUERY PLAN
+  SELECT sum(b->>'one') FROM t1 WHERE a=10; /* Query AA */
+} {/.* t1_one .*/}
+do_execsql_test indexexpr1-2011 {
+  SELECT sum(b->>'one') FROM t1 WHERE a=10; /* Query AA */
+} {55}
+do_execsql_test indexexpr1-2020 {
+  EXPLAIN QUERY PLAN
+  SELECT sum(b->>'two') FROM t1 WHERE a=10; /* Query BB */
+} {/.* t1_two .*/}
+do_execsql_test indexexpr1-2021 {
+  SELECT sum(b->>'two') FROM t1 WHERE a=10; /* Query BB */
+} {66}
+do_execsql_test indexexpr1-2030 {
+  DROP TABLE t1;
+  CREATE TABLE t1(a INT, b TEXT, c INT, d INT);
+  INSERT INTO t1(a,b,c,d) VALUES
+    (1, '{"x":1}', 12,  3),
+    (1, '{"x":2}',  4,  5),
+    (1, '{"x":1}',  6, 11),
+    (2, '{"x":1}', 22,  3),
+    (2, '{"x":2}',  4,  5),
+    (3, '{"x":1}',  6,  7);
+  CREATE INDEX t1x ON t1(d, a, b->>'x', c);
+}
+do_execsql_test indexexpr1-2030 {
+  SELECT a,
+       SUM(1)                              AS t1,
+       SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2,
+       SUM(c)                              AS t3,
+       SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4
+    FROM t1;
+} {1 6 4 54 46}
+do_execsql_test indexexpr1-2030 {
+  explain query plan
+  SELECT a,
+       SUM(1)                              AS t1,
+       SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2,
+       SUM(c)                              AS t3,
+       SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4
+    FROM t1;
+} {/.*SCAN t1 USING INDEX t1x.*/}
+
+
+
 finish_test