diff options
author | zah <zahary@gmail.com> | 2018-10-28 14:34:57 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-10-28 13:34:57 +0100 |
commit | ee54d6977bdc70e01af97c7783361477ec811c13 (patch) | |
tree | 02544e39007533d76c4e546ffbce876e6e627eb5 /lib/pure/parsesql.nim | |
parent | f9eec2aa1e42c3ad5753f8aa3bf36c0090b888fc (diff) | |
download | Nim-ee54d6977bdc70e01af97c7783361477ec811c13.tar.gz |
Parse the usage of the SQL in operator properly (#9527)
Also adds a `treeRepr` renderer for the SQL nodes.
Diffstat (limited to 'lib/pure/parsesql.nim')
-rw-r--r-- | lib/pure/parsesql.nim | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/lib/pure/parsesql.nim b/lib/pure/parsesql.nim index 9aef43c1b..4b841b9e1 100644 --- a/lib/pure/parsesql.nim +++ b/lib/pure/parsesql.nim @@ -566,7 +566,6 @@ type SqlParser* = object of SqlLexer ## SQL parser object tok: Token - {.deprecated: [EInvalidSql: SqlParseError, PSqlNode: SqlNode, TSqlNode: SqlNodeObj, TSqlParser: SqlParser, TSqlNodeKind: SqlNodeKind].} @@ -591,6 +590,7 @@ proc len*(n: SqlNode): int = result = n.sons.len proc `[]`*(n: SqlNode; i: int): SqlNode = n.sons[i] +proc `[]`*(n: SqlNode; i: BackwardsIndex): SqlNode = n.sons[n.len - int(i)] proc add*(father, n: SqlNode) = add(father.sons, n) @@ -674,7 +674,7 @@ proc getPrecedence(p: SqlParser): int = result = 5 elif isOpr(p, "=") or isOpr(p, "<") or isOpr(p, ">") or isOpr(p, ">=") or isOpr(p, "<=") or isOpr(p, "<>") or isOpr(p, "!=") or isKeyw(p, "is") or - isKeyw(p, "like"): + isKeyw(p, "like") or isKeyw(p, "in"): result = 4 elif isKeyw(p, "and"): result = 3 @@ -717,7 +717,10 @@ proc identOrLiteral(p: var SqlParser): SqlNode = of tkParLe: getTok(p) result = newNode(nkPrGroup) - result.add(parseExpr(p)) + while true: + result.add(parseExpr(p)) + if p.tok.kind != tkComma: break + getTok(p) eat(p, tkParRi) else: if p.tok.literal == "*": @@ -1465,6 +1468,22 @@ proc `$`*(n: SqlNode): string = ## an alias for `renderSQL`. renderSQL(n) +proc treeReprAux(s: SqlNode, level: int, result: var string) = + result.add('\n') + for i in 0 ..< level: result.add(" ") + + result.add($s.kind) + if s.kind in LiteralNodes: + result.add(' ') + result.add(s.strVal) + else: + for son in s.sons: + treeReprAux(son, level + 1, result) + +proc treeRepr*(s: SqlNode): string = + result = newStringOfCap(128) + treeReprAux(s, 0, result) + when not defined(js): import streams |