diff options
author | Jürg Billeter <j@bitron.ch> | 2010-10-05 16:00:22 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2010-10-05 18:27:03 +0200 |
commit | edc089a7b08739b7b2b02ab9f56aef6eacddd8e4 (patch) | |
tree | c3b2cecc7926a315d9b5fdbb495f49bc28bfc0b2 /src | |
parent | f6a79e6f1f7bff596b4c13b046c7a5fa89823f41 (diff) | |
download | tracker-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.vapi | 3 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql-expression.vala | 11 |
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: |