Skip to content

Commit

Permalink
Support MySQL system variables (#3576)
Browse files Browse the repository at this point in the history
* Modify at_sign lexer and add parser to handle MyQL system variables + provide fixtures for validation.

* Improve at_sign lexer.
$ sign is now supported, and a `.` cannot be at the start/end of a variable name.

Co-authored-by: Barry Hart <barrywhart@yahoo.com>
  • Loading branch information
qgallet and barrywhart committed Jul 10, 2022
1 parent 50f0638 commit faa1c83
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 7 deletions.
13 changes: 10 additions & 3 deletions src/sqlfluff/dialects/dialect_mysql.py
Expand Up @@ -95,6 +95,7 @@
LiteralGrammar=ansi_dialect.get_grammar("LiteralGrammar").copy(
insert=[
Ref("DoubleQuotedLiteralSegment"),
Ref("SystemVariableSegment"),
]
),
FromClauseTerminatorGrammar=ansi_dialect.get_grammar(
Expand Down Expand Up @@ -208,6 +209,12 @@
type="literal",
trim_chars=("@",),
),
SystemVariableSegment=RegexParser(
r"@@(session|global)\.[A-Za-z0-9_]+",
CodeSegment,
name="system_variable",
type="system_variable",
),
)


Expand Down Expand Up @@ -684,13 +691,13 @@ class IntervalExpressionSegment(BaseSegment):
Ref("DatatypeSegment"),
),
LocalVariableNameSegment=RegexParser(
r"`?[a-zA-Z0-9_]*`?",
r"`?[a-zA-Z0-9_$]*`?",
CodeSegment,
name="declared_variable",
type="variable",
),
SessionVariableNameSegment=RegexParser(
r"[@][a-zA-Z0-9_]*",
r"[@][a-zA-Z0-9_$]*",
CodeSegment,
name="declared_variable",
type="variable",
Expand All @@ -710,7 +717,7 @@ class IntervalExpressionSegment(BaseSegment):
[
RegexLexer(
"at_sign",
r"[@][a-zA-Z0-9_]*",
r"@@?[a-zA-Z0-9_$]*(\.[a-zA-Z0-9_$]+)?",
CodeSegment,
),
],
Expand Down
5 changes: 4 additions & 1 deletion test/fixtures/dialects/mysql/set_session_variable.sql
@@ -1 +1,4 @@
set @abc = 1;
set @abc = 1;
set @my_var = 1;
set @my$currency = 1;
set @sha256enabled = 1;
30 changes: 27 additions & 3 deletions test/fixtures/dialects/mysql/set_session_variable.yml
Expand Up @@ -3,13 +3,37 @@
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: 91d7a5a3d6a5986cf93fd70ccbc2cc4f148a27c126ab479bc3d44f68690d4af3
_hash: 9e4ffffc861f4647dfc51be1591f5df5931d712fe5083c39fde3ce9942d8ad60
file:
statement:
- statement:
set_statement:
- keyword: set
- variable: '@abc'
- comparison_operator:
raw_comparison_operator: '='
- variable: '1'
statement_terminator: ;
- statement_terminator: ;
- statement:
set_statement:
- keyword: set
- variable: '@my_var'
- comparison_operator:
raw_comparison_operator: '='
- variable: '1'
- statement_terminator: ;
- statement:
set_statement:
- keyword: set
- variable: '@my$currency'
- comparison_operator:
raw_comparison_operator: '='
- variable: '1'
- statement_terminator: ;
- statement:
set_statement:
- keyword: set
- variable: '@sha256enabled'
- comparison_operator:
raw_comparison_operator: '='
- variable: '1'
- statement_terminator: ;
5 changes: 5 additions & 0 deletions test/fixtures/dialects/mysql/system_variables.sql
@@ -0,0 +1,5 @@
SELECT @@global.time_zone;
SELECT @@session.time_zone;
SELECT @@global.version;
SELECT @@session.rand_seed1;
SELECT CONVERT_TZ(NOW(), @@global.time_zone, '+00:00')
59 changes: 59 additions & 0 deletions test/fixtures/dialects/mysql/system_variables.yml
@@ -0,0 +1,59 @@
# YML test files are auto-generated from SQL files and should not be edited by
# hand. To help enforce this, the "hash" field in the file must match a hash
# computed by SQLFluff when running the tests. Please run
# `python test/generate_parse_fixture_yml.py` to generate them after adding or
# altering SQL files.
_hash: 7ee845cc79c4b19c5a15b765bf58282520be92649f543a90c3badb1900de89e4
file:
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
system_variable: '@@global.time_zone'
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
system_variable: '@@session.time_zone'
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
system_variable: '@@global.version'
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
system_variable: '@@session.rand_seed1'
- statement_terminator: ;
- statement:
select_statement:
select_clause:
keyword: SELECT
select_clause_element:
function:
function_name:
function_name_identifier: CONVERT_TZ
bracketed:
- start_bracket: (
- expression:
function:
function_name:
function_name_identifier: NOW
bracketed:
start_bracket: (
end_bracket: )
- comma: ','
- expression:
system_variable: '@@global.time_zone'
- comma: ','
- expression:
literal: "'+00:00'"
- end_bracket: )

0 comments on commit faa1c83

Please sign in to comment.