Switch to side-by-side view

--- a/src/query/wasaparse.ypp
+++ b/src/query/wasaparse.ypp
@@ -28,7 +28,9 @@
 static void addSubQuery(WasaParserDriver *d,
                         Rcl::SearchData *sd, Rcl::SearchData *sq)
 {
-    sd->addClause(new Rcl::SearchDataClauseSub(STD_SHARED_PTR<Rcl::SearchData>(sq)));
+    if (sd && sq)
+        sd->addClause(
+            new Rcl::SearchDataClauseSub(STD_SHARED_PTR<Rcl::SearchData>(sq)));
 }
 
 %}
@@ -54,8 +56,8 @@
 %type <sd> query
 %type <str> complexfieldname
 
-                          /* Non operator tokens need precedence because of the possibility of
-                             concatenation which needs to have lower prec than OR */
+/* Non operator tokens need precedence because of the possibility of
+   concatenation which needs to have lower prec than OR */
 %left <str> WORD
 %left <str> QUOTED
 %left <str> QUALIFIERS
@@ -68,35 +70,48 @@
 
 topquery: query
 {
-    LOGP("END PARSING\n");
-    d->m_result = $1;
+    // It's possible that we end up with no query (e.g.: because just a
+    // date filter was set, no terms). Allocate an empty query so that we
+    // have something to set the global criteria on (this will yield a
+    // Xapian search like <alldocuments> FILTER xxx
+    if ($1 == 0)
+        d->m_result = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
+    else
+        d->m_result = $1;
 }
 
 query: 
 query query %prec UCONCAT
 {
     LOGP("q: query query\n");
-    Rcl::SearchData *sd = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
-    addSubQuery(d, sd, $1);
-    addSubQuery(d, sd, $2);
+    Rcl::SearchData *sd = 0;
+    if ($1 || $2) {
+        sd = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
+        addSubQuery(d, sd, $1);
+        addSubQuery(d, sd, $2);
+    }
     $$ = sd;
 }
 | query AND query
 {
     LOGP("q: query AND query\n");
-    Rcl::SearchData *sd = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
-    addSubQuery(d, sd, $1);
-    addSubQuery(d, sd, $3);
+    Rcl::SearchData *sd = 0;
+    if ($1 || $3) {
+        sd = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
+        addSubQuery(d, sd, $1);
+        addSubQuery(d, sd, $3);
+    }
     $$ = sd;
 }
 | query OR query
 {
-    LOGP("q: query OR query\n");
-    Rcl::SearchData *top = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
-    Rcl::SearchData *sd = new Rcl::SearchData(Rcl::SCLT_OR, d->m_stemlang);
-    addSubQuery(d, sd, $1);
-    addSubQuery(d, sd, $3);
-    addSubQuery(d, top, sd);
+    LOGP("query: query OR query\n");
+    Rcl::SearchData *top = 0;
+    if ($1 || $3) {
+       top = new Rcl::SearchData(Rcl::SCLT_OR, d->m_stemlang);
+       addSubQuery(d, top, $1);
+       addSubQuery(d, top, $3);
+    }
     $$ = top;
 }
 | '(' query ')' 
@@ -109,8 +124,12 @@
 {
     LOGP("q: fieldexpr\n");
     Rcl::SearchData *sd = new Rcl::SearchData(Rcl::SCLT_AND, d->m_stemlang);
-    d->addClause(sd, $1);
-    $$ = sd;
+    if (d->addClause(sd, $1)) {
+        $$ = sd;
+    } else {
+        delete sd;
+        $$ = 0;
+    }
 }
 ;