src/lib/rqlParse.c 1.7
1.7 2009/12/05 03:51:27 kent
Adding whereVarList to rqlStatement structure.
Index: src/lib/rqlParse.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/rqlParse.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 4 -r1.6 -r1.7
--- src/lib/rqlParse.c 3 Dec 2009 20:05:24 -0000 1.6
+++ src/lib/rqlParse.c 5 Dec 2009 03:51:27 -0000 1.7
@@ -1,5 +1,6 @@
-/* rqlParse - parse restricted sql-like query language. Produce rqlParse tree. */
+/* rqlParse - parse restricted sql-like query language. Produce rqlParse tree. See rqlEval.c
+ * for the rqlParse interpreter. */
#include "common.h"
#include "linefile.h"
#include "hash.h"
@@ -278,9 +279,12 @@
}
}
static struct rqlParse *rqlParseIndex(struct tokenizer *tkz)
-/* Handle the [] in this[6] */
+/* Handle the [] in this[6]. Convert it into tree:
+* rqlOpArrayIx
+* rqlParseAtom
+* rqlParseAtom */
{
struct rqlParse *collection = rqlParseAtom(tkz);
struct rqlParse *p = collection;
char *tok = tokenizerNext(tkz);
@@ -562,8 +566,19 @@
errAbort("Expecting field name line %d of %s", tkz->lf->lineIx, tkz->lf->fileName);
return buf->string;
}
+
+void rqlParseVarsUsed(struct rqlParse *p, struct slName **pVarList)
+/* Put variables used by self and children onto varList. */
+{
+if (p->op == rqlOpSymbol)
+ slNameStore(pVarList, p->val.s);
+struct rqlParse *child;
+for (child = p->children; child != NULL; child = child->next)
+ rqlParseVarsUsed(child, pVarList);
+}
+
struct rqlStatement *rqlStatementParse(struct lineFile *lf)
/* Parse an RQL statement out of text */
{
struct tokenizer *tkz = tokenizerOnLineFile(lf);
@@ -660,8 +675,9 @@
}
else
{
rql->whereClause = rqlParseExpression(tkz);
+ rqlParseVarsUsed(rql->whereClause, &rql->whereVarList);
}
}
/* Parse limit clause. */
@@ -739,7 +755,9 @@
slFreeList(&rql->fieldList);
slFreeList(&rql->tableList);
if (rql->whereClause !=NULL)
rqlParseFreeRecursive(rql->whereClause);
+ slFreeList(&rql->whereVarList);
freez(pRql);
}
}
+