This is an automated email from the ASF dual-hosted git repository.
panjuan 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 6786750 Add sql parser SQLServer delete query hint statement. (#8689)
6786750 is described below
commit 67867505e7a4f5e0313dd43789f3bc1b69d4dde4
Author: Zonglei Dong <[email protected]>
AuthorDate: Mon Dec 21 11:18:46 2020 +0800
Add sql parser SQLServer delete query hint statement. (#8689)
* Add sql test case from SQLServer delete query hint statement.
* Add sql parser SQLServer delete query hint statement.
* Remove concat keyword.
Co-authored-by: Zonglei Dong <[email protected]>
---
.../main/antlr4/imports/sqlserver/DMLStatement.g4 | 54 ++++++++-
.../src/main/antlr4/imports/sqlserver/Keyword.g4 | 55 ++++++++-
.../src/main/antlr4/imports/sqlserver/Literals.g4 | 22 +++-
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 126 ++++++++++++++++++++-
.../src/main/resources/case/dml/delete.xml | 16 +++
.../main/resources/sql/supported/dml/delete.xml | 1 +
6 files changed, 262 insertions(+), 12 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
index 6b3997d..3966c1f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
@@ -22,7 +22,7 @@ import Symbol, Keyword, SQLServerKeyword, Literals, BaseRule;
insert
: withClause? INSERT top? INTO? tableName (AS? alias)? (insertDefaultValue
| insertValuesClause | insertSelectClause)
;
-
+
insertDefaultValue
: columnNames? outputClause? DEFAULT VALUES
;
@@ -57,7 +57,7 @@ assignmentValue
;
delete
- : withClause? DELETE top? (singleTableClause | multipleTablesClause)
outputClause? whereClause?
+ : withClause? DELETE top? (singleTableClause | multipleTablesClause)
outputClause? whereClause? (OPTION queryHint)?
;
singleTableClause
@@ -72,7 +72,7 @@ multipleTableNames
: tableName DOT_ASTERISK_? (COMMA_ tableName DOT_ASTERISK_?)*
;
-select
+select
: aggregationClause
;
@@ -184,3 +184,51 @@ outputWithAaterisk
outputTableName
: (AT_ name) | tableName
;
+
+queryHint
+ : (HASH | ORDER) GROUP
+ | (CONCAT | HASH | MERGE) UNION
+ | (LOOP | MERGE | HASH) JOIN
+ | EXPAND VIEWS
+ | FAST INT_NUM_
+ | FORCE ORDER
+ | (FORCE | DISABLE) EXTERNALPUSHDOWN
+ | (FORCE | DISABLE) SCALEOUTEXECUTION
+ | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
+ | KEEP PLAN
+ | KEEPFIXED PLAN
+ | MAX_GRANT_PERCENT EQ_ DECIMAL_NUM_
+ | MIN_GRANT_PERCENT EQ_ DECIMAL_NUM_
+ | MAXDOP INT_NUM_
+ | MAXRECURSION INT_NUM_
+ | NO_PERFORMANCE_SPOOL
+ | OPTIMIZE FOR LP_ AT_ name (UNKNOWN | EQ_ identifier)* RP_
+ | OPTIMIZE FOR UNKNOWN
+ | PARAMETERIZATION (SIMPLE | FORCED)
+ | QUERYTRACEON INT_NUM_
+ | RECOMPILE
+ | ROBUST PLAN
+ | USE HINT LP_ useHitName* RP_
+ | USE PLAN N STRING_
+ ;
+
+useHitName
+ : SQ_ ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS SQ_
+ | SQ_ ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES SQ_
+ | SQ_ DISABLE_BATCH_MODE_ADAPTIVE_JOINS SQ_
+ | SQ_ DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK SQ_
+ | SQ_ DISABLE_DEFERRED_COMPILATION_TV SQ_
+ | SQ_ DISABLE_INTERLEAVED_EXECUTION_TVF SQ_
+ | SQ_ DISABLE_OPTIMIZED_NESTED_LOOP SQ_
+ | SQ_ DISABLE_OPTIMIZER_ROWGOAL SQ_
+ | SQ_ DISABLE_PARAMETER_SNIFFING SQ_
+ | SQ_ DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK SQ_
+ | SQ_ DISABLE_TSQL_SCALAR_UDF_INLINING SQ_
+ | SQ_ DISALLOW_BATCH_MODE SQ_
+ | SQ_ ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS SQ_
+ | SQ_ ENABLE_QUERY_OPTIMIZER_HOTFIXES SQ_
+ | SQ_ FORCE_DEFAULT_CARDINALITY_ESTIMATION SQ_
+ | SQ_ FORCE_LEGACY_CARDINALITY_ESTIMATION SQ_
+ | SQ_ QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n SQ_
+ | SQ_ QUERY_PLAN_PROFILE SQ_
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Keyword.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Keyword.g4
index 6ab5f84..1a3d49f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Keyword.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Keyword.g4
@@ -430,7 +430,7 @@ MAX
MIN
: M I N
;
-
+
SUM
: S U M
;
@@ -583,8 +583,59 @@ TIES
EXCEPT
: E X C E P T
;
-
+
INTERSECT
: I N T E R S E C T
;
+USE
+ : U S E
+ ;
+
+MERGE
+ : M E R G E
+ ;
+
+LOOP
+ : L O O P
+ ;
+
+EXPAND
+ : E X P A N D
+ ;
+
+VIEWS
+ : V I E W S
+ ;
+
+FAST
+ : F A S T
+ ;
+
+FORCE
+ : F O R C E
+ ;
+
+KEEP
+ : K E E P
+ ;
+
+PLAN
+ : P L A N
+ ;
+
+OPTIMIZE
+ : O P T I M I Z E
+ ;
+
+SIMPLE
+ : S I M P L E
+ ;
+
+FORCED
+ : F O R C E D
+ ;
+
+HINT
+ : H I N T
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
index 3674cfc..fd8e727 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/Literals.g4
@@ -23,13 +23,27 @@ IDENTIFIER_
: LBT_? DQ_? [a-zA-Z_$#][a-zA-Z0-9_$#]* DQ_? RBT_?
;
-STRING_
+STRING_
: (DQ_ ( '\\'. | '""' | ~('"'| '\\') )* DQ_)
| (SQ_ ('\\'. | '\'\'' | ~('\'' | '\\'))* SQ_)
;
NUMBER_
- : INT_? DOT_? INT_ (E (PLUS_ | MINUS_)? INT_)?
+ : INT_NUM_
+ | FLOAT_NUM_
+ | DECIMAL_NUM_
+ ;
+
+INT_NUM_
+ : DIGIT+
+ ;
+
+FLOAT_NUM_
+ : INT_NUM_? DOT_? INT_NUM_ E (PLUS_ | MINUS_)? INT_NUM_
+ ;
+
+DECIMAL_NUM_
+ : INT_NUM_? DOT_ INT_NUM_
;
HEX_DIGIT_
@@ -40,8 +54,8 @@ BIT_NUM_
: '0b' ('0' | '1')+ | B SQ_ ('0' | '1')+ SQ_
;
-fragment INT_
- : [0-9]+
+fragment DIGIT
+ : [0-9]
;
fragment HEX_
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index 2bcdc33..bdf58d9 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -166,7 +166,7 @@ MONTHS
WEEKS
: W E E K S
;
-
+
DAYS
: D A Y S
;
@@ -660,11 +660,11 @@ SUBSCRIBE
;
QUERY
- : Q U E R Y
+ : Q U E R Y
;
NOTIFICATIONS
- : N O T I F I C A T I O N S
+ : N O T I F I C A T I O N S
;
CHECKPOINT
@@ -930,3 +930,123 @@ INSERTED
DELETED
: D E L E T E D
;
+
+ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
+ : A S S U M E UL_ J O I N UL_ P R E D I C A T E UL_ D E P E N D S UL_ O N
UL_ F I L T E R S
+ ;
+
+ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
+ : A S S U M E UL_ M I N UL_ S E L E C T I V I T Y UL_ F O R UL_ F I L T E
R UL_ E S T I M A T E S
+ ;
+
+DISABLE_BATCH_MODE_ADAPTIVE_JOINS
+ : D I S A B L E UL_ B A T C H UL_ M O D E UL_ A D A P T I V E UL_ J O I N S
+ ;
+
+DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK
+ : D I S A B L E UL_ B A T C H UL_ M O D E UL_ M E M O R Y UL_ G R A N T
UL_ F E E D B A C K
+ ;
+
+DISABLE_DEFERRED_COMPILATION_TV
+ : D I S A B L E UL_ D E F E R R E D UL_ C O M P I L A T I O N UL_ T V
+ ;
+
+DISABLE_INTERLEAVED_EXECUTION_TVF
+ : D I S A B L E UL_ I N T E R L E A V E D UL_ E X E C U T I O N UL_ T V F
+ ;
+
+DISABLE_OPTIMIZED_NESTED_LOOP
+ : D I S A B L E UL_ O P T I M I Z E D UL_ N E S T E D UL_ L O O P
+ ;
+
+DISABLE_OPTIMIZER_ROWGOAL
+ : D I S A B L E UL_ O P T I M I Z E R UL_ R O W G O A L
+ ;
+
+DISABLE_PARAMETER_SNIFFING
+ : D I S A B L E UL_ P A R A M E T E R UL_ S N I F F I N G
+ ;
+
+DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK
+ : D I S A B L E UL_ R O W UL_ M O D E UL_ M E M O R Y UL_ G R A N T UL_ F
E E D B A C K
+ ;
+
+DISABLE_TSQL_SCALAR_UDF_INLINING
+ : D I S A B L E UL_ T S Q L UL_ S C A L A R UL_ U D F UL_ I N L I N I N G
+ ;
+
+DISALLOW_BATCH_MODE
+ : D I S A L L O W UL_ B A T C H UL_ M O D E
+ ;
+
+ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS
+ : E N A B L E UL_ H I S T UL_ A M E N D M E N T UL_ F O R UL_ A S C UL_ K
E Y S
+ ;
+
+ENABLE_QUERY_OPTIMIZER_HOTFIXES
+ : E N A B L E UL_ Q U E R Y UL_ O P T I M I Z E R UL_ H O T F I X E S
+ ;
+
+FORCE_DEFAULT_CARDINALITY_ESTIMATION
+ : F O R C E UL_ D E F A U L T UL_ C A R D I N A L I T Y UL_ E S T I M A T
I O N
+ ;
+
+FORCE_LEGACY_CARDINALITY_ESTIMATION
+ : F O R C E UL_ L E G A C Y UL_ C A R D I N A L I T Y UL_ E S T I M A T I
O N
+ ;
+
+QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
+ : Q U E R Y UL_ O P T I M I Z E R UL_ C O M P A T I B I L I T Y UL_ L E V
E L UL_
+ ;
+
+QUERY_PLAN_PROFILE
+ : Q U E R Y UL_ P L A N UL_ P R O F I L E
+ ;
+
+EXTERNALPUSHDOWN
+ : E X T E R N A L P U S H D O W N
+ ;
+
+SCALEOUTEXECUTION
+ : S C A L E O U T E X E C U T I O N
+ ;
+
+IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
+ : I G N O R E UL_ N O N C L U S T E R E D UL_ C O L U M N S T O R E UL_ I
N D E X
+ ;
+
+KEEPFIXED
+ : K E E P F I X E D
+ ;
+
+MAX_GRANT_PERCENT
+ : M A X UL_ G R A N T UL_ P E R C E N T
+ ;
+
+MIN_GRANT_PERCENT
+ : M I N UL_ G R A N T UL_ P E R C E N T
+ ;
+
+MAXRECURSION
+ : M A X R E C U R S I O N
+ ;
+
+NO_PERFORMANCE_SPOOL
+ : N O UL_ P E R F O R M A N C E UL_ S P O O L
+ ;
+
+PARAMETERIZATION
+ : P A R A M E T E R I Z A T I O N
+ ;
+
+QUERYTRACEON
+ : Q U E R Y T R A C E O N
+ ;
+
+RECOMPILE
+ : R E C O M P I L E
+ ;
+
+ROBUST
+ : R O B U S T
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/delete.xml
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/delete.xml
index 2e2d288..3903444 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/delete.xml
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/delete.xml
@@ -403,4 +403,20 @@
<table name="t_order" start-index="12" stop-index="18"/>
<table name="t_order_item" start-index="21" stop-index="32"/>
</delete>
+
+ <delete sql-case-id="delete_with_query_hint" parameters="1000">
+ <table name="t_order" start-index="12" stop-index="18" />
+ <where start-index="20" stop-index="37" literal-stop-index="40">
+ <and-predicate>
+ <predicate start-index="26" stop-index="37"
literal-stop-index="40">
+ <column-left-value name="order_id" start-index="26"
stop-index="33" />
+ <operator type="=" />
+ <compare-right-value>
+ <parameter-marker-expression value="0"
start-index="37" stop-index="37" />
+ <literal-expression value="1000" start-index="37"
stop-index="40" />
+ </compare-right-value>
+ </predicate>
+ </and-predicate>
+ </where>
+ </delete>
</sql-parser-test-cases>
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/delete.xml
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/delete.xml
index 739d86c..300550f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/delete.xml
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/delete.xml
@@ -34,4 +34,5 @@
<sql-case id="delete_without_columns_with_with_clause" value="WITH cte AS
(SELECT order_id, user_id FROM t_order) DELETE t_order FROM cte WHERE
t_order.order_id = cte.order_id" db-types="SQLServer" />
<sql-case id="delete_multi_tables" value="DELETE t_order, t_order_item
from t_order, t_order_item where t_order.order_id = t_order_item.order_id and
t_order.status = ?" db-types="MySQL"/>
<sql-case id="delete_multi_tables_with_using" value="DELETE from t_order,
t_order_item using t_order left join t_order_item on t_order.order_id =
t_order_item.order_id where t_order.status = ?" db-types="MySQL"/>
+ <sql-case id="delete_with_query_hint" value="DELETE FROM t_order WHERE
order_id = ? HASH GROUP" db-types="SQLServer" />
</sql-cases>