From dcd0793f2b6255f561f904f1eaa9f5d11ee25de0 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:23:54 +0800 Subject: [PATCH] Add support for parsing parameterised sql types (#24483) Co-authored-by: Cletus Igwe --- lib/pure/parsesql.nim | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/pure/parsesql.nim b/lib/pure/parsesql.nim index 4ea01c89d8..299e4599dc 100644 --- a/lib/pure/parsesql.nim +++ b/lib/pure/parsesql.nim @@ -549,6 +549,7 @@ type SqlParser* = object of SqlLexer ## SQL parser object tok: Token + considerTypeParams: bool ## Determines whether type parameters (e.g., sizes in types like VARCHAR(255)) are included in the SQL AST. proc newNode*(k: SqlNodeKind): SqlNode = when defined(js): # bug #14117 @@ -641,16 +642,21 @@ proc parseDataType(p: var SqlParser): SqlNode = expectIdent(p) result = newNode(nkIdent, p.tok.literal) getTok(p) - # ignore (12, 13) part: if p.tok.kind == tkParLe: + var complexType = newNode(nkCall) + complexType.add(result) getTok(p) + complexType.add(newNode(nkIntegerLit, p.tok.literal)) expect(p, tkInteger) getTok(p) while p.tok.kind == tkComma: getTok(p) + complexType.add(newNode(nkIntegerLit, p.tok.literal)) expect(p, tkInteger) getTok(p) eat(p, tkParRi) + if p.considerTypeParams: + result = complexType proc getPrecedence(p: SqlParser): int = if isOpr(p, "*") or isOpr(p, "/") or isOpr(p, "%"): @@ -1565,19 +1571,20 @@ proc open(p: var SqlParser, input: Stream, filename: string) = p.tok.literal = "" getTok(p) -proc parseSql*(input: Stream, filename: string): SqlNode = +proc parseSql*(input: Stream, filename: string, considerTypeParams = false): SqlNode = ## parses the SQL from `input` into an AST and returns the AST. ## `filename` is only used for error messages. ## Syntax errors raise an `SqlParseError` exception. var p: SqlParser + p.considerTypeParams = considerTypeParams open(p, input, filename) try: result = parse(p) finally: close(p) -proc parseSql*(input: string, filename = ""): SqlNode = +proc parseSql*(input: string, filename = "", considerTypeParams = false): SqlNode = ## parses the SQL from `input` into an AST and returns the AST. ## `filename` is only used for error messages. ## Syntax errors raise an `SqlParseError` exception. - parseSql(newStringStream(input), "") + parseSql(newStringStream(input), "", considerTypeParams)