summaryrefslogtreecommitdiff
path: root/dev-db/sqlite/files/sqlite-3.41.2-perf-regression.patch
blob: 0bf5c41513afcdd632e374d45d5c1892576d1159 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
https://sqlite.org/forum/forumpost/3a180ba0d4 and https://sqlite.org/forum/forumpost/f9346b11a6
https://sqlite.org/src/info/aa6bd6dff751223e
(-> https://sqlite.org/src/vpatch?from=71215599cd8ebb97&to=aa6bd6dff751223e)

--- a/src/select.c
+++ b/src/select.c
@@ -4236,12 +4236,11 @@
 **        (17f) the subquery must not be the RHS of a LEFT JOIN.
 **        (17g) either the subquery is the first element of the outer
 **              query or there are no RIGHT or FULL JOINs in any arm
 **              of the subquery.  (This is a duplicate of condition (27b).)
 **        (17h) The corresponding result set expressions in all arms of the
-**              compound must have the same affinity. (See restriction (9)
-**              on the push-down optimization.)
+**              compound must have the same affinity.
 **
 **        The parent and sub-query may contain WHERE clauses. Subject to
 **        rules (11), (13) and (14), they may also contain ORDER BY,
 **        LIMIT and OFFSET clauses.  The subquery cannot use any compound
 **        operator other than UNION ALL because all the other compound
@@ -5105,14 +5104,10 @@
 **
 **   (8) If the subquery is a compound that uses UNION, INTERSECT,
 **       or EXCEPT, then all of the result set columns for all arms of
 **       the compound must use the BINARY collating sequence.
 **
-**   (9) If the subquery is a compound, then all arms of the compound must
-**       have the same affinity.  (This is the same as restriction (17h)
-**       for query flattening.)
-**       
 **
 ** Return 0 if no changes are made and non-zero if one or more WHERE clause
 ** terms are duplicated into the subquery.
 */
 static int pushDownWhereTerms(
@@ -5139,13 +5134,10 @@
       }
 #ifndef SQLITE_OMIT_WINDOWFUNC
       if( pSel->pWin ) return 0;    /* restriction (6b) */
 #endif
     }
-    if( compoundHasDifferentAffinities(pSubq) ){
-      return 0;  /* restriction (9) */
-    }
     if( notUnionAll ){
       /* If any of the compound arms are connected using UNION, INTERSECT,
       ** or EXCEPT, then we must ensure that none of the columns use a
       ** non-BINARY collating sequence. */
       for(pSel=pSubq; pSel; pSel=pSel->pPrior){

--- a/test/pushdown.test
+++ b/test/pushdown.test
@@ -120,7 +120,47 @@
     SELECT v1.a, v1.b, t0.c0 AS cd FROM t0 LEFT JOIN v0 ON v0.c0!=0, v1
   ) WHERE a=2 AND b=0 AND cd=0;
 } {
   2 0     0
 }
-  
+
+# 2023-02-22 https://sqlite.org/forum/forumpost/bcc4375032
+# Performance regression caused by check-in [1ad41840c5e0fa70] from 2022-11-25.
+# That check-in added a new restriction on push-down.  The new restriction is
+# no longer necessary after check-in [27655c9353620aa5] from 2022-12-14.
+#
+do_execsql_test 3.5 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(a INT, b INT, c TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID;
+  INSERT INTO t1(a,b,c) VALUES
+    (1,100,'abc'),
+    (2,200,'def'),
+    (3,300,'abc');
+  DROP TABLE IF EXISTS t2;
+  CREATE TABLE t2(a INT, b INT, c TEXT, PRIMARY KEY(a,b)) WITHOUT ROWID;
+  INSERT INTO t2(a,b,c) VALUES
+    (1,110,'efg'),
+    (2,200,'hij'),
+    (3,330,'klm');
+  CREATE VIEW v3 AS
+    SELECT a, b, c FROM t1
+    UNION ALL
+    SELECT a, b, 'xyz' FROM t2;
+  SELECT * FROM v3 WHERE a=2 AND b=200;
+} {2 200 def 2 200 xyz}
+do_eqp_test 3.6 {
+  SELECT * FROM v3 WHERE a=2 AND b=200;
+} {
+  QUERY PLAN
+  |--CO-ROUTINE v3
+  |  `--COMPOUND QUERY
+  |     |--LEFT-MOST SUBQUERY
+  |     |  `--SEARCH t1 USING PRIMARY KEY (a=? AND b=?)
+  |     `--UNION ALL
+  |        `--SEARCH t2 USING PRIMARY KEY (a=? AND b=?)
+  `--SCAN v3
+}
+#                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+# We want both arms of the compound subquery to use the
+# primary key.
+
 finish_test