summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-03-21 17:49:29 +0000
committerCarlos Garnacho <carlosg@gnome.org>2021-03-21 17:49:29 +0000
commitf625253801e29a6f8b9ef6046a06fb9cf71a9dbf (patch)
tree8b866697c8207f673d9ff05f2bff45833af0dc98
parent0f1e7056fc3b3b223a23dc182c0b97706ec3b764 (diff)
parent8a28feb1bff52bf518a4728cbebf2317ffc7b4bd (diff)
downloadtracker-f625253801e29a6f8b9ef6046a06fb9cf71a9dbf.tar.gz
Merge branch 'wip/carlosg/sqlite-3-35-workaround' into 'master'
libtracker-data: Workaround SQLite 3.35.x bug See merge request GNOME/tracker!382
-rw-r--r--src/libtracker-data/tracker-sparql.c22
-rw-r--r--tests/libtracker-data/graph/graph-7.out2
-rw-r--r--tests/libtracker-data/graph/graph-7.rq7
-rw-r--r--tests/libtracker-data/tracker-sparql-test.c1
4 files changed, 31 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index c4aaaaaa9..28c73bf6c 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5085,8 +5085,28 @@ translate_OptionalGraphPattern (TrackerSparql *sparql,
_call_rule (sparql, NAMED_RULE_GroupGraphPattern, error);
- if (do_join)
+ if (do_join) {
+ /* FIXME: This is a workaround for SQLite 3.35.x, where
+ * the optimization on UNION ALLs inside JOINs (Point 8c in
+ * the 3.35.0 release notes) break in this very specific
+ * case:
+ *
+ * SELECT * { GRAPH ?g { ?a ... OPTIONAL { ?a ... } } }
+ *
+ * This is a workaround to make this one case ineligible
+ * for query flattening optimizations, specifically make
+ * it fall through case 8 in the list at
+ * https://sqlite.org/optoverview.html#flattening,
+ * "The subquery does not use LIMIT or the outer query is not
+ * a join.", we will now meet both here.
+ *
+ * This should be evaluated again in future SQLite versions.
+ */
+ if (tracker_token_get_variable (&sparql->current_state->graph))
+ _append_string (sparql, "LIMIT -1 ");
+
_append_string (sparql, ") ");
+ }
return TRUE;
}
diff --git a/tests/libtracker-data/graph/graph-7.out b/tests/libtracker-data/graph/graph-7.out
new file mode 100644
index 000000000..b87869c39
--- /dev/null
+++ b/tests/libtracker-data/graph/graph-7.out
@@ -0,0 +1,2 @@
+"http://example/graphA" "http://example/resource" "73"
+"http://example/graphB" "http://example/resource" "42"
diff --git a/tests/libtracker-data/graph/graph-7.rq b/tests/libtracker-data/graph/graph-7.rq
new file mode 100644
index 000000000..a72b4366e
--- /dev/null
+++ b/tests/libtracker-data/graph/graph-7.rq
@@ -0,0 +1,7 @@
+SELECT ?g ?s ?v WHERE {
+ GRAPH ?g {
+ ?s a rdfs:Resource .
+ OPTIONAL { ?s example:p ?v } .
+ }
+}
+ORDER BY ?g ?s ?v \ No newline at end of file
diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c
index 9552d0aa4..60475720b 100644
--- a/tests/libtracker-data/tracker-sparql-test.c
+++ b/tests/libtracker-data/tracker-sparql-test.c
@@ -162,6 +162,7 @@ const TestInfo tests[] = {
{ "graph/graph-4", "graph/data-3", FALSE },
{ "graph/graph-5", "graph/data-4", FALSE },
{ "graph/graph-6", "graph/data-5", FALSE },
+ { "graph/graph-7", "graph/data-5", FALSE },
{ "graph/non-existent-1", "graph/data-1", FALSE },
{ "graph/non-existent-2", "graph/data-1", FALSE },
{ "graph/non-existent-3", "graph/data-1", FALSE },