summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-09-23 12:39:07 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-11-13 11:17:31 +0100
commit3a82afdf607a992a91bc741cfe65d93653977cd7 (patch)
treea3ac6bacb74127a657af21e826efe62fadf88a81
parent39daf8e7b2729237be0045f122868e2a9e7835dc (diff)
downloadtracker-3a82afdf607a992a91bc741cfe65d93653977cd7.tar.gz
libtracker-data: Add back 'NULL' literal handling for INSERT OR REPLACE
This is a tracker extension that allows INSERT OR REPLACE to also delete values.
-rw-r--r--src/libtracker-data/tracker-sparql-grammar.h8
-rw-r--r--src/libtracker-data/tracker-sparql.c8
2 files changed, 15 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-sparql-grammar.h b/src/libtracker-data/tracker-sparql-grammar.h
index d6baf45f9..fc03a0d1e 100644
--- a/src/libtracker-data/tracker-sparql-grammar.h
+++ b/src/libtracker-data/tracker-sparql-grammar.h
@@ -243,6 +243,7 @@ typedef enum {
LITERAL_NAMED,
LITERAL_NOT,
LITERAL_NOW,
+ LITERAL_NULL, /* TRACKER EXTENSION */
LITERAL_OFFSET,
LITERAL_OP_AND,
LITERAL_OP_EQ,
@@ -392,6 +393,7 @@ static const gchar literals[][N_LITERALS] = {
"named", /* LITERAL_NAMED */
"not", /* LITERAL_NOT */
"now", /* LITERAL_NOW */
+ "null", /* LITERAL_NULL (TRACKER EXTENSION) */
"offset", /* LITERAL_OFFSET */
"&&", /* LITERAL_OP_AND */
"=", /* LITERAL_OP_EQ */
@@ -891,8 +893,12 @@ static const TrackerGrammarRule helper_GraphNodePath_or[] = { R(VarOrTerm), R(Tr
static const TrackerGrammarRule rule_GraphNodePath[] = { OR(helper_GraphNodePath_or), NIL };
/* GraphNode ::= VarOrTerm | TriplesNode
+ *
+ * TRACKER EXTENSION:
+ * Literal 'NULL' is also accepted, rule is effectively:
+ * VarOrTerm | TriplesNode | 'NULL'
*/
-static const TrackerGrammarRule helper_GraphNode_or[] = { R(VarOrTerm), R(TriplesNode), NIL };
+static const TrackerGrammarRule helper_GraphNode_or[] = { R(VarOrTerm), R(TriplesNode), L(NULL), NIL };
static const TrackerGrammarRule rule_GraphNode[] = { OR(helper_GraphNode_or), NIL };
/* CollectionPath ::= '(' GraphNodePath+ ')'
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index a962bb439..011b5ab5e 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -4204,6 +4204,10 @@ translate_GraphNode (TrackerSparql *sparql,
GError *inner_error = NULL;
/* GraphNode ::= VarOrTerm | TriplesNode
+ *
+ * TRACKER EXTENSION:
+ * Literal 'NULL' is also accepted, rule is effectively:
+ * VarOrTerm | TriplesNode | 'NULL'
*/
if (_check_in_rule (sparql, NAMED_RULE_VarOrTerm)) {
sparql->current_state.token = &sparql->current_state.object;
@@ -4213,6 +4217,10 @@ translate_GraphNode (TrackerSparql *sparql,
sparql->current_state.token = &sparql->current_state.object;
_call_rule (sparql, NAMED_RULE_TriplesNode, error);
g_assert (!tracker_token_is_empty (&sparql->current_state.object));
+ } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_NULL)) {
+ if (sparql->current_state.type != TRACKER_SPARQL_TYPE_UPDATE)
+ _raise (PARSE, "«NULL» literal is not allowed in this mode", "NULL");
+ /* Object token is left unset on purpose */
} else {
g_assert_not_reached ();
}