index c7a6ee0c6ff547c906a101f6b2509725b1c9dd60..62bae1c134904af8a84ede0d7906912fe3704f3e 100644 (file)
--- a/src/frontend/analyzer.c
+++ b/src/frontend/analyzer.c
} /* analyze_expr */
static int
-analyze_matcher(int context, sdb_store_matcher_t *m, sdb_strbuf_t *errbuf)
+analyze_matcher(int context, int parent_type,
+ sdb_store_matcher_t *m, sdb_strbuf_t *errbuf)
{
if (! m)
return 0;
case MATCHER_OR:
case MATCHER_AND:
assert(OP_M(m)->left && OP_M(m)->right);
- if (analyze_matcher(context, OP_M(m)->left, errbuf))
+ if (analyze_matcher(context, m->type, OP_M(m)->left, errbuf))
return -1;
- if (analyze_matcher(context, OP_M(m)->right, errbuf))
+ if (analyze_matcher(context, m->type, OP_M(m)->right, errbuf))
return -1;
break;
case MATCHER_NOT:
assert(UOP_M(m)->op);
- if (analyze_matcher(context, UOP_M(m)->op, errbuf))
+ if (analyze_matcher(context, m->type, UOP_M(m)->op, errbuf))
return -1;
break;
return -1;
}
}
- else if (analyze_matcher(ITER_M(m)->type, ITER_M(m)->m, errbuf))
+ else if (analyze_matcher(ITER_M(m)->type, m->type,
+ ITER_M(m)->m, errbuf))
return -1;
break;
case MATCHER_NE:
case MATCHER_GE:
case MATCHER_GT:
- assert(CMP_M(m)->left && CMP_M(m)->right);
+ assert(CMP_M(m)->right);
+ if ((parent_type == MATCHER_ALL)
+ || (parent_type == MATCHER_ANY)) {
+ // TODO: assert(! CMP_M(m)->left);
+ }
+ else {
+ assert(CMP_M(m)->left);
+ }
+
if (analyze_expr(context, CMP_M(m)->left, errbuf))
return -1;
if (analyze_expr(context, CMP_M(m)->right, errbuf))
return -1;
}
- if (analyze_matcher(context, m, errbuf))
+ if (analyze_matcher(context, -1, m, errbuf))
status = -1;
- if (analyze_matcher(-1, filter, errbuf))
+ if (analyze_matcher(-1, -1, filter, errbuf))
status = -1;
return status;
} /* sdb_fe_analyze */