From d5debc63bf27a96f43886b34d969bc8e648f7d6a Mon Sep 17 00:00:00 2001 From: Alec Strong Date: Sat, 16 Apr 2022 19:20:25 -0400 Subject: [PATCH] Support MySQL index hints (#3099) --- .../dialects/mysql/grammar/MySql.bnf | 27 ++++++++++++++++ .../test/fixtures_mysql/index-hints/Test.s | 31 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 dialects/mysql/src/test/fixtures_mysql/index-hints/Test.s diff --git a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf index 67f05cf1f9ad..364aa9f14cb9 100644 --- a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf +++ b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf @@ -44,6 +44,8 @@ overrides ::= type_name | table_constraint | default_constraint | table_option + | table_or_subquery + | qualified_table_name | extension_stmt | alter_table_rules | alter_table_add_column @@ -164,6 +166,31 @@ table_option ::= 'ENGINE' ['='] {identifier} | row_format_clause ::= 'ROW_FORMAT' [ '=' ] ( DEFAULT | 'DYNAMIC' | 'FIXED' | 'COMPRESSED' | 'REDUNDANT' | 'COMPACT' ) +table_or_subquery ::= ( [ {database_name} '.' ] {table_name} [ [ 'AS' ] {table_alias} ] [ index_hint_list ] + | '(' ( {table_or_subquery} ( ',' {table_or_subquery} ) * | {join_clause} ) ')' + | '(' {compound_select_stmt} ')' [ [ 'AS' ] {table_alias} ] ) { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlTableOrSubqueryImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlTableOrSubquery" + override = true +} + +qualified_table_name ::= [ {database_name} '.' ] {table_name} [ index_hint_list ] { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlQualifiedTableNameImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlQualifiedTableName" + override = true +} + +index_hint_list ::= index_hint ( index_hint ) * + +index_hint ::= + ( 'USE' ( 'INDEX' | 'KEY' ) [ 'FOR' ( 'JOIN' | 'ORDER' 'BY' | 'GROUP' 'BY' )] [index_list] ) + | + ( ('IGNORE' | 'FORCE' ) ( 'INDEX' | 'KEY' ) [ 'FOR' ( 'JOIN' | 'ORDER' 'BY' | 'GROUP' 'BY' )] index_list ) { + pin = 1 +} + +index_list ::= '(' {index_name} ( ',' {index_name} ) * ')' + alter_table_rules ::= ( alter_table_add_column | {alter_table_rename_table} diff --git a/dialects/mysql/src/test/fixtures_mysql/index-hints/Test.s b/dialects/mysql/src/test/fixtures_mysql/index-hints/Test.s new file mode 100644 index 000000000000..bed7cc58ee26 --- /dev/null +++ b/dialects/mysql/src/test/fixtures_mysql/index-hints/Test.s @@ -0,0 +1,31 @@ +CREATE TABLE t1( + a VARCHAR(8) NOT NULL +); + +CREATE INDEX i1 ON t1(a); + +CREATE INDEX i2 ON t1(a); + +SELECT * FROM t1 USE INDEX; + +SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a; + +SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1,i1); + +SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2); + +CREATE TABLE table1( + col1 TEXT, + col2 TEXT, + col3 TEXT +); + +CREATE INDEX col1_index ON table1(col1); +CREATE INDEX col2_index ON table1(col2); +CREATE INDEX col3_index ON table1(col3); + +SELECT * FROM table1 USE INDEX (col1_index,col2_index) + WHERE col1=1 AND col2=2 AND col3=3; + +SELECT * FROM table1 IGNORE INDEX (col3_index) + WHERE col1=1 AND col2=2 AND col3=3; \ No newline at end of file