ktx/python/ktx-sl/tests/test_dialect_identifier_quoting.py

94 lines
2.8 KiB
Python
Raw Normal View History

"""Reserved-word identifiers and week-of-day granularity must produce valid SQL
in the connection's native dialect.
Regression: on backtick dialects (BigQuery, MySQL) a reserved-word column such
as `default` or `like` was quoted with postgres-style double quotes, which those
dialects read as a *string literal* `WHERE loans.'like' = 'x'` yielding the
production error `Syntax error: Unexpected string literal "like"`.
"""
from __future__ import annotations
import sqlglot
from conftest import make_engine
def _loans_engine(dialect: str):
source = {
"name": "loans",
"table": "mydataset.loans",
"grain": ["id"],
"columns": [
{"name": "id", "type": "number"},
{"name": "amount", "type": "number"},
{"name": "default", "type": "boolean"},
{"name": "like", "type": "string"},
{"name": "created_at", "type": "time"},
],
"measures": [{"name": "total", "expr": "sum(amount)"}],
}
return make_engine({"loans": source}, dialect=dialect)
def test_reserved_word_column_filter_valid_on_bigquery():
sql = (
_loans_engine("bigquery")
.query({"measures": ["loans.total"], "filters": ["loans.default = true"]})
.sql
)
sqlglot.parse_one(sql, read="bigquery") # must not raise
assert "`default`" in sql
assert "'default'" not in sql
def test_reserved_word_column_filter_valid_on_mysql():
sql = (
_loans_engine("mysql")
.query({"measures": ["loans.total"], "filters": ["loans.default = true"]})
.sql
)
sqlglot.parse_one(sql, read="mysql")
assert "`default`" in sql
assert "'default'" not in sql
def test_like_column_filter_valid_on_bigquery():
# Mirrors the production message: Unexpected string literal "like".
sql = (
_loans_engine("bigquery")
.query({"measures": ["loans.total"], "filters": ["loans.like = 'x'"]})
.sql
)
sqlglot.parse_one(sql, read="bigquery")
assert "`like`" in sql
assert "'like'" not in sql
def test_reserved_word_column_still_double_quoted_on_snowflake():
sql = (
_loans_engine("snowflake")
.query({"measures": ["loans.total"], "filters": ["loans.default = true"]})
.sql
)
sqlglot.parse_one(sql, read="snowflake")
assert '"default"' in sql
def test_week_weekday_granularity_translated_on_bigquery():
sql = (
_loans_engine("bigquery")
.query(
{
"measures": ["loans.total"],
"dimensions": [
{"field": "loans.created_at", "granularity": "week_monday"}
],
}
)
.sql
)
sqlglot.parse_one(sql, read="bigquery") # must not raise
assert "WEEK_MONDAY" not in sql
assert "WEEK(MONDAY)" in sql