Skip to content

Commit

Permalink
Build deno
Browse files Browse the repository at this point in the history
  • Loading branch information
oguimbal committed Jan 6, 2021
1 parent 4eed208 commit 0785974
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 15 deletions.
20 changes: 20 additions & 0 deletions .deno/ast-mapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ export interface IAstPartialMapper {
createExtension?: (val: a.CreateExtensionStatement) => a.Statement | nil
set?: (st: a.SetStatement) => a.SetStatement | nil
dataType?: (dataType: a.DataTypeDef) => a.DataTypeDef
prepare?: (st: a.PrepareStatement) => a.Statement | nil
parameter?: (st: a.ExprParameter) => a.Expr | nil
tableRef?: (st: a.QNameAliased) => a.QNameAliased | nil
transaction?: (val: a.CommitStatement | a.RollbackStatement | a.StartTransactionStatement) => a.Statement | nil
createIndex?: (val: a.CreateIndexStatement) => a.Statement | nil
Expand Down Expand Up @@ -230,6 +232,8 @@ export class AstDefaultMapper implements IAstMapper {
return this.union(val);
case 'show':
return this.show(val);
case 'prepare':
return this.prepare(val);
default:
throw NotSupported.never(val);
}
Expand Down Expand Up @@ -484,6 +488,16 @@ export class AstDefaultMapper implements IAstMapper {
});
}

prepare(st: a.PrepareStatement): a.Statement | nil {
const statement = this.statement(st.statement);
if (!statement) {
return null;
}
return assignChanged(st, {
args: arrayNilMap(st.args, a => this.dataType(a)),
statement,
})
}

// =========================================
// ============== ALTER TABLE ==============
Expand Down Expand Up @@ -825,6 +839,8 @@ export class AstDefaultMapper implements IAstMapper {
return this.select(val);
case 'keyword':
return this.valueKeyword(val);
case 'parameter':
return this.parameter(val);
default:
throw NotSupported.never(val);
}
Expand All @@ -849,6 +865,10 @@ export class AstDefaultMapper implements IAstMapper {
});
}

parameter (st: a.ExprParameter): a.Expr | nil {
return st;
}

arrayIndex(val: a.ExprArrayIndex): a.Expr | nil {
const array = this.expr(val.array);
const index = this.expr(val.index);
Expand Down
3 changes: 3 additions & 0 deletions .deno/lexer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ export const lexer = compile({
.replace(/\\./g, m => JSON.parse('"' + m + '"'));
},
},
qparam: {
match: /\$\d+/,
},
star: '*',
comma: ',',
space: { match: /[\s\t\n\v\f\r]+/, lineBreaks: true, },
Expand Down
15 changes: 15 additions & 0 deletions .deno/syntax/ast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export type Statement = (SelectStatement
| InsertStatement
| UpdateStatement
| ShowStatement
| PrepareStatement
| DeleteStatement
| WithStatement
| RollbackStatement
Expand All @@ -29,6 +30,13 @@ export type Statement = (SelectStatement
[LOCATION]?: StatementLocation;
};

export interface PrepareStatement {
type: 'prepare';
name: string;
args?: DataTypeDef[] | nil;
statement: Statement;
}

export interface CreateEnumType {
type: 'create enum',
name: QName;
Expand Down Expand Up @@ -438,6 +446,7 @@ export type JoinType = 'INNER JOIN'
| 'FULL JOIN';

export type Expr = ExprRef
| ExprParameter
| ExprList
| ExprNull
| ExprInteger
Expand Down Expand Up @@ -513,6 +522,12 @@ export interface ExprRef {
name: string | '*';
}

export interface ExprParameter {
type: 'parameter';
name: string;
}


export interface ExprMember {
type: 'member';
operand: Expr;
Expand Down
51 changes: 36 additions & 15 deletions .deno/syntax/main.ne.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ declare var lbracket: any;
declare var rbracket: any;
declare var op_cast: any;
declare var dot: any;
declare var qparam: any;
declare var kw_like: any;
declare var kw_ilike: any;
declare var op_like: any;
Expand Down Expand Up @@ -155,6 +156,7 @@ declare var kw_create: any;
declare var kw_as: any;
declare var comma: any;
declare var kw_union: any;
declare var kw_as: any;
declare var semicolon: any;
import {lexerAny, LOCATION} from '../lexer.ts';

Expand Down Expand Up @@ -355,6 +357,7 @@ const grammar: Grammar = {
{"name": "kw_hour", "symbols": [(lexerAny.has("word") ? {type: "word"} : word)], "postprocess": notReservedKw('hour')},
{"name": "kw_minute", "symbols": [(lexerAny.has("word") ? {type: "word"} : word)], "postprocess": notReservedKw('minute')},
{"name": "kw_local", "symbols": [(lexerAny.has("word") ? {type: "word"} : word)], "postprocess": notReservedKw('local')},
{"name": "kw_prepare", "symbols": [(lexerAny.has("word") ? {type: "word"} : word)], "postprocess": notReservedKw('prepare')},
{"name": "kw_ifnotexists", "symbols": ["kw_if", (lexerAny.has("kw_not") ? {type: "kw_not"} : kw_not), "kw_exists"]},
{"name": "kw_ifexists", "symbols": ["kw_if", "kw_exists"]},
{"name": "kw_not_null", "symbols": [(lexerAny.has("kw_not") ? {type: "kw_not"} : kw_not), (lexerAny.has("kw_null") ? {type: "kw_null"} : kw_null)]},
Expand Down Expand Up @@ -391,6 +394,12 @@ const grammar: Grammar = {
}
return ret;
} },
{"name": "data_type_list$ebnf$1", "symbols": []},
{"name": "data_type_list$ebnf$1$subexpression$1", "symbols": ["comma", "data_type"], "postprocess": last},
{"name": "data_type_list$ebnf$1", "symbols": ["data_type_list$ebnf$1", "data_type_list$ebnf$1$subexpression$1"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "data_type_list", "symbols": ["data_type", "data_type_list$ebnf$1"], "postprocess": ([head, tail]) => {
return [head, ...(tail || [])];
} },
{"name": "data_type_simple", "symbols": ["data_type_text"], "postprocess": x => ({ name: toStr(x, ' ') })},
{"name": "data_type_simple", "symbols": ["data_type_numeric"], "postprocess": x => ({ name: toStr(x, ' ') })},
{"name": "data_type_simple", "symbols": ["data_type_date"], "postprocess": x => ({ name: toStr(x, ' ') })},
Expand Down Expand Up @@ -841,6 +850,7 @@ const grammar: Grammar = {
{"name": "expr_primary", "symbols": [(lexerAny.has("kw_false") ? {type: "kw_false"} : kw_false)], "postprocess": () => ({ type: 'boolean', value: false })},
{"name": "expr_primary", "symbols": [(lexerAny.has("kw_null") ? {type: "kw_null"} : kw_null)], "postprocess": ([value]) => ({ type: 'null' })},
{"name": "expr_primary", "symbols": ["value_keyword"]},
{"name": "expr_primary", "symbols": [(lexerAny.has("qparam") ? {type: "qparam"} : qparam)], "postprocess": ([value]) => ({ type: 'parameter', name: toStr(value) })},
{"name": "ops_like", "symbols": ["ops_like_keywors"]},
{"name": "ops_like", "symbols": ["ops_like_operators"]},
{"name": "ops_like_keywors$ebnf$1", "symbols": [(lexerAny.has("kw_not") ? {type: "kw_not"} : kw_not)], "postprocess": id},
Expand Down Expand Up @@ -1565,6 +1575,15 @@ const grammar: Grammar = {
right: unwrap(right),
};
} },
{"name": "prepare$ebnf$1$subexpression$1", "symbols": ["lparen", "data_type_list", "rparen"], "postprocess": get(1)},
{"name": "prepare$ebnf$1", "symbols": ["prepare$ebnf$1$subexpression$1"], "postprocess": id},
{"name": "prepare$ebnf$1", "symbols": [], "postprocess": () => null},
{"name": "prepare", "symbols": ["kw_prepare", "ident", "prepare$ebnf$1", (lexerAny.has("kw_as") ? {type: "kw_as"} : kw_as), "statement_noprep"], "postprocess": x => ({
type: 'prepare',
name: toStr(x[1]),
...x[2] && { args: x[2] },
statement: unwrap(last(x)),
}) },
{"name": "main$ebnf$1", "symbols": []},
{"name": "main$ebnf$1", "symbols": ["main$ebnf$1", "statement_separator"], "postprocess": (d) => d[0].concat([d[1]])},
{"name": "main$ebnf$2", "symbols": []},
Expand Down Expand Up @@ -1598,21 +1617,23 @@ const grammar: Grammar = {
return ret;
} },
{"name": "statement_separator", "symbols": [(lexerAny.has("semicolon") ? {type: "semicolon"} : semicolon)]},
{"name": "statement", "symbols": ["select_statement"]},
{"name": "statement", "symbols": ["createtable_statement"]},
{"name": "statement", "symbols": ["createextension_statement"]},
{"name": "statement", "symbols": ["createindex_statement"]},
{"name": "statement", "symbols": ["simplestatements_all"]},
{"name": "statement", "symbols": ["insert_statement"]},
{"name": "statement", "symbols": ["update_statement"]},
{"name": "statement", "symbols": ["altertable_statement"]},
{"name": "statement", "symbols": ["delete_statement"]},
{"name": "statement", "symbols": ["create_sequence_statement"]},
{"name": "statement", "symbols": ["alter_sequence_statement"]},
{"name": "statement", "symbols": ["drop_statement"]},
{"name": "statement", "symbols": ["createtype_statement"]},
{"name": "statement", "symbols": ["with_statement"]},
{"name": "statement", "symbols": ["union_statement"]}
{"name": "statement", "symbols": ["statement_noprep"]},
{"name": "statement", "symbols": ["prepare"]},
{"name": "statement_noprep", "symbols": ["select_statement"]},
{"name": "statement_noprep", "symbols": ["createtable_statement"]},
{"name": "statement_noprep", "symbols": ["createextension_statement"]},
{"name": "statement_noprep", "symbols": ["createindex_statement"]},
{"name": "statement_noprep", "symbols": ["simplestatements_all"]},
{"name": "statement_noprep", "symbols": ["insert_statement"]},
{"name": "statement_noprep", "symbols": ["update_statement"]},
{"name": "statement_noprep", "symbols": ["altertable_statement"]},
{"name": "statement_noprep", "symbols": ["delete_statement"]},
{"name": "statement_noprep", "symbols": ["create_sequence_statement"]},
{"name": "statement_noprep", "symbols": ["alter_sequence_statement"]},
{"name": "statement_noprep", "symbols": ["drop_statement"]},
{"name": "statement_noprep", "symbols": ["createtype_statement"]},
{"name": "statement_noprep", "symbols": ["with_statement"]},
{"name": "statement_noprep", "symbols": ["union_statement"]}
],
ParserStart: "main",
};
Expand Down
13 changes: 13 additions & 0 deletions .deno/to-sql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,10 @@ const visitor = astVisitor<IAstFullVisitor>(m => ({
ret.push(r.name === '*' ? '*' : name(r.name));
},

parameter: p => {
ret.push(p.name);
},

renameColumn: r => {
ret.push(' RENAME COLUMN '
, name(r.column)
Expand Down Expand Up @@ -824,6 +828,15 @@ const visitor = astVisitor<IAstFullVisitor>(m => ({
ret.push('SHOW ', name(s.variable));
},

prepare: s => {
ret.push('PREPARE ', name(s.name));
if (s.args?.length) {
list(s.args, a => m.dataType(a), true);
}
ret.push(' AS ');
m.statement(s.statement);
},

union: s => {
ret.push('(');
m.statement(s.left);
Expand Down

0 comments on commit 0785974

Please sign in to comment.