summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-10-05 16:00:22 +0200
committerJürg Billeter <j@bitron.ch>2010-10-05 18:27:03 +0200
commitedc089a7b08739b7b2b02ab9f56aef6eacddd8e4 (patch)
treec3b2cecc7926a315d9b5fdbb495f49bc28bfc0b2 /src
parentf6a79e6f1f7bff596b4c13b046c7a5fa89823f41 (diff)
downloadtracker-edc089a7b08739b7b2b02ab9f56aef6eacddd8e4.tar.gz
SPARQL: Use COLLATE in SQL for variables and property functions
This fixes collation when subselects are involved. Fixes NB#195394.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-data/libtracker-data.vapi3
-rw-r--r--src/libtracker-data/tracker-sparql-expression.vala11
2 files changed, 14 insertions, 0 deletions
diff --git a/src/libtracker-data/libtracker-data.vapi b/src/libtracker-data/libtracker-data.vapi
index 6902c541b..63c2f6b88 100644
--- a/src/libtracker-data/libtracker-data.vapi
+++ b/src/libtracker-data/libtracker-data.vapi
@@ -153,5 +153,8 @@ namespace Tracker {
public bool init (DBManagerFlags flags, [CCode (array_length = false)] string[]? test_schema, out bool first_time, bool journal_check, uint select_cache_size, uint update_cache_size, BusyCallback? busy_callback, string? busy_status);
public void shutdown ();
}
+
+ [CCode (cheader_filename = "libtracker-data/tracker-db-interface-sqlite.h")]
+ public const string COLLATION_NAME;
}
diff --git a/src/libtracker-data/tracker-sparql-expression.vala b/src/libtracker-data/tracker-sparql-expression.vala
index 1fa363046..ce4103bd0 100644
--- a/src/libtracker-data/tracker-sparql-expression.vala
+++ b/src/libtracker-data/tracker-sparql-expression.vala
@@ -73,6 +73,10 @@ class Tracker.Sparql.Expression : Object {
return (type == PropertyType.INTEGER || type == PropertyType.DOUBLE || type == PropertyType.DATETIME || type == PropertyType.UNKNOWN);
}
+ void append_collate (StringBuilder sql) {
+ sql.append_printf (" COLLATE %s", COLLATION_NAME);
+ }
+
void skip_bracketted_expression () throws Sparql.Error {
expect (SparqlTokenType.OPEN_PARENS);
while (true) {
@@ -668,6 +672,10 @@ class Tracker.Sparql.Expression : Object {
translate_expression (sql);
sql.append (")");
+ if (prop.data_type == PropertyType.STRING) {
+ append_collate (sql);
+ }
+
return prop.data_type;
}
}
@@ -888,6 +896,9 @@ class Tracker.Sparql.Expression : Object {
if (variable.binding == null) {
return PropertyType.UNKNOWN;
} else {
+ if (variable.binding.data_type == PropertyType.STRING) {
+ append_collate (sql);
+ }
return variable.binding.data_type;
}
case SparqlTokenType.STR: