16313e67e6b0d8ab72b914a352a8cca2d81c4fa1 kent Thu Jun 8 23:28:49 2017 -0700 Allowing '.' in a field name. diff --git src/lib/rqlParse.c src/lib/rqlParse.c index 79082b6..a8c67b2 100644 --- src/lib/rqlParse.c +++ src/lib/rqlParse.c @@ -134,31 +134,46 @@ char *tok = tokenizerMustHaveNext(tkz); struct rqlParse *p; AllocVar(p); char c = tok[0]; if (c == '\'' || c == '"') { p->op = rqlOpLiteral; p->type = rqlTypeString; int len = strlen(tok+1); p->val.s = cloneStringZ(tok+1, len-1); } else if (isalpha(c) || c == '_') { p->op = rqlOpSymbol; p->type = rqlTypeString; /* String until promoted at least. */ - p->val.s = cloneString(tok); + struct dyString *dy = dyStringNew(64); + for (;;) + { + dyStringAppend(dy, tok); + if ((tok = tokenizerNext(tkz)) == NULL) + break; + if (tok[0] != '.') + { + tokenizerReuse(tkz); + break; + } + dyStringAppend(dy, tok); + if ((tok = tokenizerNext(tkz)) == NULL) + break; + } + p->val.s = dyStringCannibalize(&dy); } else if (isdigit(c)) { p->op = rqlOpLiteral; p->type = rqlTypeInt; p->val.i = sqlUnsigned(tok); if ((tok = tokenizerNext(tkz)) != NULL) { if (tok[0] == '.') { char buf[32]; tok = tokenizerMustHaveNext(tkz); safef(buf, sizeof(buf), "%lld.%s", p->val.i, tok); p->type = rqlTypeDouble; p->val.x = sqlDouble(buf);