diff --git a/src/sqlParser.jison b/src/sqlParser.jison index 7cff3e8..7387ee2 100644 --- a/src/sqlParser.jison +++ b/src/sqlParser.jison @@ -50,6 +50,7 @@ IN return 'IN' SOUNDS return 'SOUNDS' LIKE return 'LIKE' ESCAPE return 'ESCAPE' +CAST return 'CAST' REGEXP return 'REGEXP' IS return 'IS' UNKNOWN return 'UNKNOWN' @@ -343,6 +344,9 @@ case_when_else case_when : CASE case_expr_opt when_then_list case_when_else END { $$ = { type: 'CaseWhen', caseExprOpt: $2, whenThenList: $3, else: $4 } } ; +cast + : CAST '(' expr AS IDENTIFIER ')' { $$ = { type: 'Cast', expr: $3, castTo: $5 } } + ; simple_expr_prefix : '+' simple_expr %prec UPLUS { $$ = { type: 'Prefix', prefix: $1, value: $2 } } | '-' simple_expr %prec UMINUS { $$ = { type: 'Prefix', prefix: $1, value: $2 } } @@ -361,6 +365,7 @@ simple_expr | EXISTS '(' selectClause ')' { $$ = { type: 'SubQuery', value: $3, hasExists: true } } | '{' identifier expr '}' { $$ = { type: 'IdentifierExpr', identifier: $2, value: $3 } } | case_when { $$ = $1 } + | cast { $$ = $1 } ; bit_expr : simple_expr { $$ = $1 } diff --git a/src/stringify.js b/src/stringify.js index 57ea74e..a5385ef 100644 --- a/src/stringify.js +++ b/src/stringify.js @@ -225,6 +225,14 @@ Sql.prototype.travelCaseWhen = function(ast) { } this.appendKeyword('end'); }; +Sql.prototype.travelCast = function(ast) { + this.appendKeyword('cast'); + this.append('(', true, true); + this.travel(ast.expr); + this.appendKeyword('as'); + this.append(ast.castTo); + this.append(')', true); +}; Sql.prototype.travelPrefix = function(ast) { this.appendKeyword(ast.prefix); this.travel(ast.value); diff --git a/test/main.test.js b/test/main.test.js index 834d3f1..2151b7c 100644 --- a/test/main.test.js +++ b/test/main.test.js @@ -411,4 +411,19 @@ describe('select grammar support', function() { it('bugfix table alias2', function() { testParser('select a.* from a t1 join b t2 on t1.a = t2.a') }) + + it('CAST support issue #9', function() { + testParser(`select + concat(dsw_cluster_name,',',logic_pod_name) as event_obj, + concat(dsw_cluster_name,',',logic_pod_name, ' PFC STORM. 详情: ', + '流量突跃 ', cast(FLOW_RX_BPS_RATE100 as int), '%(RX)', + '; ', cast(FLOW_TX_BPS_RATE100 as int), '%(TX)', + '; PFC 突增 ', cast(PFC_RX_PPS_RATE*100 as int), '%(RECV)') as brief + from SOURCE_BASIC_EVENT_POD_FLOW_AND_PFC_TREND + where win_end >= '2020-05-19 21:14:12' + and win_end < '2020-05-20 21:14:12' + and PFC_RX_PPS_RATE >= 100 + and (FLOW_RX_BPS_RATE <= -0.2 and FLOW_TX_BPS_RATE <= -0.2) + `) + }) });
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: