simple udf code generation
This commit is contained in:
@@ -34,6 +34,7 @@ FETCH = keyword("fetch").suppress()
|
||||
FROM = keyword("from").suppress()
|
||||
FULL = keyword("full")
|
||||
FUNCTION = keyword("function").suppress()
|
||||
AGGREGATION = keyword("aggregation").suppress()
|
||||
GROUP = keyword("group").suppress()
|
||||
HAVING = keyword("having").suppress()
|
||||
INNER = keyword("inner")
|
||||
@@ -73,6 +74,11 @@ RECURSIVE = keyword("recursive").suppress()
|
||||
VALUES = keyword("values").suppress()
|
||||
WINDOW = keyword("window")
|
||||
INTO = keyword("into").suppress()
|
||||
IF = keyword("if").suppress()
|
||||
STATIC = keyword("static").suppress()
|
||||
ELIF = keyword("elif").suppress()
|
||||
ELSE = keyword("else").suppress()
|
||||
FOR = keyword("for").suppress()
|
||||
|
||||
PRIMARY_KEY = Group(PRIMARY + KEY).set_parser_name("primary_key")
|
||||
FOREIGN_KEY = Group(FOREIGN + KEY).set_parser_name("foreign_key")
|
||||
@@ -112,8 +118,14 @@ INDF = (
|
||||
keyword("is not distinct from").set_parser_name("ne!")
|
||||
)
|
||||
FASSIGN = Literal(":=").set_parser_name("fassign") # Assignment in UDFs
|
||||
PASSIGN = Literal("+=").set_parser_name("passign")
|
||||
MASSIGN = Literal("-=").set_parser_name("massign")
|
||||
MULASSIGN = Literal("*=").set_parser_name("mulassign")
|
||||
DASSIGN = Literal("/=").set_parser_name("dassign")
|
||||
COLON = Literal(":").set_parser_name("colon")
|
||||
NEQ = (Literal("!=") | Literal("<>")).set_parser_name("neq")
|
||||
LAMBDA = Literal("->").set_parser_name("lambda")
|
||||
DOT = Literal(".").set_parser_name("dot")
|
||||
|
||||
AND = keyword("and")
|
||||
BETWEEN = keyword("between")
|
||||
@@ -233,6 +245,8 @@ L_INLINE = Literal("<k>").suppress()
|
||||
R_INLINE = Literal("</k>").suppress()
|
||||
LBRACE = Literal("{").suppress()
|
||||
RBRACE = Literal("}").suppress()
|
||||
LSB = Literal("[").suppress()
|
||||
RSB = Literal("]").suppress()
|
||||
LB = Literal("(").suppress()
|
||||
RB = Literal(")").suppress()
|
||||
EQ = Char("=").suppress()
|
||||
|
||||
@@ -235,6 +235,8 @@ def parser(literal_string, ident, sqlserver=False):
|
||||
scale_function = ((real_num | int_num) + call_function) / scale
|
||||
scale_ident = ((real_num | int_num) + ident) / scale
|
||||
|
||||
|
||||
|
||||
compound = (
|
||||
NULL
|
||||
| TRUE
|
||||
@@ -329,13 +331,40 @@ def parser(literal_string, ident, sqlserver=False):
|
||||
+ Group(var_name("name") + AS + over_clause("value"))("join")
|
||||
)
|
||||
) / to_join_call
|
||||
|
||||
fassign = Group(var_name("var") + Suppress(FASSIGN) + expr("expr") + Suppress(";"))("assignment")
|
||||
fassigns = fassign + ZeroOrMore(fassign, Whitespace(white=" \t"))
|
||||
|
||||
fbody = (Optional(fassigns) + expr("ret"))
|
||||
|
||||
definable_name = Forward()
|
||||
dindex = definable_name("l") + LSB + expr("idx") + RSB
|
||||
definable_name << var_name | dindex
|
||||
|
||||
# lname = Forward()
|
||||
# ptr = (lname("l") + LAMBDA + var_name("r"))
|
||||
# member = (lname("l") + DOT + var_name("r"))
|
||||
# idx = (expr | COLON)
|
||||
# index = (lname("l") + LSB + expr("lidx") + "," + idx("ridx") + RSB)
|
||||
# lname << var_name | ptr | member | index
|
||||
|
||||
assignment = expr("var") + (FASSIGN|PASSIGN|MASSIGN|MULASSIGN|DASSIGN)("op") + expr("expr")
|
||||
declaration = definable_name("var") + Optional(Suppress(FASSIGN) + expr("expr"))
|
||||
fassign = Group(assignment + Suppress(";"))("assignment")
|
||||
static_decl = Group(STATIC + delimited_list(declaration))("static_decl")
|
||||
stmt = Forward()
|
||||
elifstmt = Group(ELIF + LB + expr("cond") + RB + stmt)("elif")
|
||||
elsestmt = Group(ELSE + stmt)("else")
|
||||
ifstmt = Group(IF + LB + expr("cond") + RB + stmt +
|
||||
ZeroOrMore(elifstmt) + Optional(elsestmt))("if")
|
||||
forstmt = Group(FOR + LB + ( delimited_list(assignment)("defs")
|
||||
+ Suppress(";") + expr("cond") +
|
||||
Suppress(";") + delimited_list(assignment)("tail"))
|
||||
+ RB + stmt)("for")
|
||||
block = Forward()
|
||||
stmt << (fassign|ifstmt|forstmt|block|Suppress(";"))
|
||||
stmts = (ZeroOrMore(stmt("stmt"), Whitespace()))
|
||||
block << (LBRACE + Optional(stmts) + RBRACE)("code_block")
|
||||
fbody = (Optional(static_decl) + Optional(stmts) + expr("ret"))
|
||||
|
||||
udf = (
|
||||
Optional(AGGREGATION("Agg")) +
|
||||
FUNCTION
|
||||
+ var_name("fname")
|
||||
+ LB
|
||||
|
||||
Reference in New Issue
Block a user