diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-09-23 12:39:07 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-11-13 11:17:31 +0100 |
commit | 3a82afdf607a992a91bc741cfe65d93653977cd7 (patch) | |
tree | a3ac6bacb74127a657af21e826efe62fadf88a81 | |
parent | 39daf8e7b2729237be0045f122868e2a9e7835dc (diff) | |
download | tracker-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.h | 8 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 8 |
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 (); } |