This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new f444ee2101c Fix PostgreSQL/openGauss failed to parse const with type
cast (#23530)
f444ee2101c is described below
commit f444ee2101c073541db58f6849aa6a82fbc8cef6
Author: 吴伟杰 <[email protected]>
AuthorDate: Fri Jan 13 08:35:54 2023 +0800
Fix PostgreSQL/openGauss failed to parse const with type cast (#23530)
* Fix PostgreSQL/openGauss failed to parse const with type cast
* Update openGauss unsupported SQL cases
---
.../src/main/antlr4/imports/opengauss/BaseRule.g4 | 8 ++++++++
.../src/main/antlr4/imports/postgresql/BaseRule.g4 | 8 ++++++++
.../parser/src/main/resources/case/dml/select.xml | 16 ++++++++++++++--
.../src/main/resources/sql/supported/dml/select.xml | 1 +
.../main/resources/sql/unsupported/unsupported.xml | 21 ---------------------
5 files changed, 31 insertions(+), 23 deletions(-)
diff --git
a/sql-parser/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4
b/sql-parser/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4
index 7a9e51108f3..c0c87d9d603 100644
--- a/sql-parser/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4
+++ b/sql-parser/dialect/opengauss/src/main/antlr4/imports/opengauss/BaseRule.g4
@@ -943,6 +943,7 @@ aexprConst
| STRING_
| funcName STRING_
| funcName LP_ funcArgList sortClause? RP_ STRING_
+ | constTypeName STRING_
| TRUE
| FALSE
| NULL
@@ -1092,6 +1093,13 @@ simpleTypeName
| constInterval LP_ NUMBER_ RP_
;
+constTypeName
+ : numeric
+ | bit
+ | character
+ | constDatetime
+ ;
+
exprList
: aExpr
| exprList COMMA_ aExpr
diff --git
a/sql-parser/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
b/sql-parser/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
index 0901bd6bd49..db7448b0db8 100644
---
a/sql-parser/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
+++
b/sql-parser/dialect/postgresql/src/main/antlr4/imports/postgresql/BaseRule.g4
@@ -939,6 +939,7 @@ aexprConst
| BEGIN_DOLLAR_STRING_CONSTANT DOLLAR_TEXT* END_DOLLAR_STRING_CONSTANT
| funcName STRING_
| funcName LP_ funcArgList sortClause? RP_ STRING_
+ | constTypeName STRING_
| TRUE
| FALSE
| NULL
@@ -1092,6 +1093,13 @@ simpleTypeName
| constInterval LP_ NUMBER_ RP_
;
+constTypeName
+ : numeric
+ | bit
+ | character
+ | constDatetime
+ ;
+
exprList
: aExpr
| exprList COMMA_ aExpr
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml
b/test/it/parser/src/main/resources/case/dml/select.xml
index 3ce6a75898e..203ff12abc0 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -4842,7 +4842,7 @@
</from>
</select>
- <select sql-case-id="select_literal_type_cast_money" >
+ <select sql-case-id="select_literal_type_cast_money">
<projections start-index="7" stop-index="18">
<expression-projection text="'$99'::money" start-index="7"
stop-index="18">
<binary-operation-expression start-index="7" stop-index="18">
@@ -4858,7 +4858,7 @@
</projections>
</select>
- <select sql-case-id="select_positional_parameter_type_cast_money"
parameters="123.00" >
+ <select sql-case-id="select_positional_parameter_type_cast_money"
parameters="123.00">
<projections start-index="7" stop-index="15">
<expression-projection text="$1::money" start-index="7"
stop-index="15">
<binary-operation-expression start-index="7" stop-index="15">
@@ -4873,4 +4873,16 @@
</expression-projection>
</projections>
</select>
+
+ <select sql-case-id="select_string_constant_type_cast">
+ <projections start-index="7" stop-index="25">
+ <!-- TODO Fix this case after supported string const type cast
syntax-->
+ <expression-projection text="int4 '1'" start-index="7"
stop-index="14">
+ <literal-expression value="1" start-index="7" stop-index="14"
/>
+ </expression-projection>
+ <expression-projection text="money '2'" start-index="17"
stop-index="25">
+ <literal-expression value="2" start-index="17" stop-index="25"
/>
+ </expression-projection>
+ </projections>
+ </select>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index 297c499caad..2fd1b55d9d0 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -158,4 +158,5 @@
<sql-case id="select_with_null_keyword_in_projection" value="select null
as order_id, item_id from t_order" db-types="MySQL" />
<sql-case id="select_literal_type_cast_money" value="SELECT '$99'::money"
db-types="PostgreSQL,openGauss" />
<sql-case id="select_positional_parameter_type_cast_money" value="SELECT
$1::money" db-types="PostgreSQL,openGauss" case-types="Placeholder" />
+ <sql-case id="select_string_constant_type_cast" value="SELECT int4 '1',
money '2'" db-types="PostgreSQL,openGauss" />
</sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
index d66083c3879..0536a7b47aa 100644
--- a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
+++ b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
@@ -34,7 +34,6 @@
<sql-case id="unsupported_select_case_for_opengauss_14" value="select
count(*) from partition_list_tab partition for ('10');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_15" value="select
count(*) from partition_list_tab partition for ('20');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_16" value="select
count(*) from partition_list_tab partition for ('30');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_24" value="select case
when date '2018-09-17' > date '2018-09-16' then 'A' else 'B' end;"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_25" value="select
''null''::jsonb;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_26" value="select
''null''::json;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_27" value="select
&quot;{&quot;name&quot;: [&quot;john&quot;, false],
&quot;age&quot;: 18, &quot;assress&quot;:
{&quot;country&quot; :&quot;china&quot;,
&quot;zip-code&quot;:
&quot;10000&quot;},&quot;true&quot;:true}&quot;::JSON;"
db-types="openGauss" />
@@ -145,9 +144,6 @@
<sql-case id="unsupported_select_case_for_opengauss_139" value="select
array_lower([1,2,3], 1) as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_140" value="select
array_lower(array[1,2,3], @) as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_141" value="select
array_lower(array[1,2,3], ) as result;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_142" value="select
col1 / double precision '1.5' from test_date01;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_143" value="select
double precision '1.5' * col1 from test_date01;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_144" value="select
col1:: date + integer '7' from test_date01;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_145" value="select
daterange('2000-05-06','2000-08-08','(]');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_146" value="select
daterange('2000-05-06 00:01:09','2000-08-08 19:59:00','(]');"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_147" value="select
daterange('2000-05-06 12:01:09','2000-08-08 19:59:00','(]');"
db-types="openGauss" />
@@ -171,19 +167,15 @@
<sql-case id="unsupported_select_case_for_opengauss_165" value="select
daterange('2000-05-06 12:01:09','2000-08-08 19:59:00','[]');"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_166" value="select
daterange('2000-05-06 00:01:09','2000-08-08 09:59:00','[]');"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_167" value="select
daterange('2000-05-06 17:01:09','2000-08-08 09:59:00','[]');"
db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_168" value="select
date '2019-1-6' - col1 from test_date01;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_169" value="select
daterange('2001-02-16 20:38:40','2001-02-16 20:38:41');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_170" value="select
daterange('2018-05-14 14:09:04.127444+08','2018-05-16 14:09:04.127444+08');"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_171" value="select
daterange('2000-05-06','2000-08-08');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_172" value="select
col1:: date - integer '7' from test_date01;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_173" value="select
ADD_MONTHS('2018-02-28',1) - date'2018-02-28' from sys_dummy;"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_174" value="select
bitand(6,) as result from sys_dummy;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_175" value="select
bitand(,6) as result from sys_dummy;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_176" value="select
first(s_name) as name, first(s_id nulls first ) from first06;"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_177" value="select
notlike(1, );" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_178" value="select
sin(2 2) as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_179" value="select
sin(2)(2) as result;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_180" value="select
length(EXTRACT (MONTH FROM DATE '2018-10-04')) from sys_dummy;"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_181" value="select
acos(2 2) as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_182" value="select
acos(2)(2) as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_183" value="select
acos 1 as result;" db-types="openGauss" />
@@ -436,12 +428,8 @@
<sql-case id="unsupported_select_case_for_opengauss_438" value="select
B'101' | as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_439" value="select
B'101' # as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_440" value="select
B'11110' # B'0000';" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_441" value="select
extract(epoch from timestamp with time zone '2001-02-16 20:38:40.12-08') from
sys_dummy;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_442" value="select
timestamp with time zone 'epoch' + 982384720.12 * interval '1 second' as
result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_443" value="select
extract(quarter from timestamp '2001-02-16 20:38:40') from sys_dummy;"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_444" value="select
extract(week from timestamp '2001-02-16 20:38:40') from sys_dummy;"
db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_445" value="select
extract(isoyear from date '2006-01-01') from sys_dummy;" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_446" value="select
extract(isoyear from date '2006-01-02') from sys_dummy;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_447" value="select
atan(11 11) from sys_dummy;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_448" value="select
atan(,) from sys_dummy;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_449" value="select
to_tsvector('fat cats ate fat rats') @@ 'fa:*'::tsquery as result;"
db-types="openGauss" />
@@ -497,18 +485,11 @@
<sql-case id="unsupported_select_case_for_opengauss_499" value="select !!
'cat'::tsquery as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_500" value="select
'fat:ab'::tsquery || 'fa:ab'::tsquery as result;" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_501" value="select
'rat'::tsquery && 'cat'::tsquery && ',' ::tsquery as result;"
db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_502" value="select
cast(date 'epoch' as nchar(37));" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_503" value="select
to_char(interval '2' year ,'yyyy','yyyy');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_504" value="select
to_char(interval 2 year);" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_505" value="select
to_char(current_timestamp, 0x5d);" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_506" value="select
to_char(pg_systimestamp(), #%&^);" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_507" value="select
to_char(-1239.456::numeric(7,3),''汉字'');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_508" value="select
to_char(date 'epoch', 'hh12:mi:ss yyyy-month-dd');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_509" value="select
to_char(timestamp with time zone '2010-09-13 12:32:03+08', 'hh12:mi:ss');"
db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_510" value="select
to_char(timestamp with time zone '2015-10-14 11:21:28.317367 pst',
'hh12:mi:ss');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_511" value="select
to_char(timestamp with time zone '2015-10-14 11:21:28.317367 america/new_york',
'hh12:mi:ss');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_512" value="select
to_char(timestamp with time zone '2015-10-14 11:21:28.317367+08',
'hh12:mi:ss');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_513" value="select
to_char(timestamp without time zone '2010-09-13 12:32:03+08');"
db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_514" value="select
to_char(interval '2' year ,'yyyy');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_515" value="select
to_char(interval '3' day ,'ddd');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_516" value="select
to_char(interval '3' day ,'dd');" db-types="openGauss" />
@@ -520,8 +501,6 @@
<sql-case id="unsupported_select_case_for_opengauss_522" value="select
to_number( , '99g999d9s');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_523" value="select
to_number(<1*8+9/3-9%3+9/2>, '999999d99');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_524" value="select
to_timestamp(-#&%#^5);" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_525" value="select
to_char(date 'allballs', 'hh24:mi:ss ms');" db-types="openGauss" />
- <sql-case id="unsupported_select_case_for_opengauss_526" value="select
to_char(timestamp with time zone '2015-10-14 11:21:28.317367
america/new_yorkkk', 'hh12:mi:ss');" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_527" value="select
coalesce(,1,null,2);" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_528" value="select
coalesce();" db-types="openGauss" />
<sql-case id="unsupported_select_case_for_opengauss_529" value="select
localtimestamp('skdfhhgh跳或者购买功能') from sys_dummy;" db-types="openGauss" />