Source code for sqlspec.dialects.spanner._spanner

"""Google Cloud Spanner SQL dialect (GoogleSQL variant).

Extends the BigQuery dialect with Spanner-only DDL features: ``INTERLEAVE IN
[PARENT]`` for interleaved tables and ``ROW DELETION POLICY`` for row-level
time-to-live policies. The PostgreSQL-interface ``TTL INTERVAL ... ON`` form
is accepted on parse and normalized to the canonical row deletion policy so
generation always emits valid GoogleSQL.
"""

from typing import Any

from sqlglot import exp
from sqlglot.dialects.bigquery import BigQuery

from sqlspec.dialects.spanner._generators import SpannerGenerator
from sqlspec.dialects.spanner._parsers import (
    attach_create_property,
    extract_interleave_property,
    register_spanner_property_parsers,
)

__all__ = ("Spanner",)

register_spanner_property_parsers()


[docs] class Spanner(BigQuery): """Google Cloud Spanner SQL dialect.""" Generator = SpannerGenerator
[docs] def parse(self, sql: str, **opts: Any) -> "list[exp.Expr | None]": """Repair CREATE TABLE statements that sqlglot still falls back to Command for.""" expressions = super().parse(sql, **opts) if len(expressions) != 1 or not isinstance(expressions[0], exp.Command): return expressions repaired_sql, interleave_property = extract_interleave_property(sql) if interleave_property is None: return expressions reparsed = BigQuery.parse(self, repaired_sql, **opts) if len(reparsed) != 1 or not isinstance(reparsed[0], exp.Create): return expressions return [attach_create_property(reparsed[0], interleave_property)]