diff --git a/sqlspec/adapters/adbc/data_dictionary.py b/sqlspec/adapters/adbc/data_dictionary.py index cdad9bde3..2f419c0f3 100644 --- a/sqlspec/adapters/adbc/data_dictionary.py +++ b/sqlspec/adapters/adbc/data_dictionary.py @@ -357,7 +357,7 @@ def get_version(self, driver: "AdbcDriver") -> "VersionInfo | None": try: version_query_dialect = "mysql" if dialect == "mariadb" else dialect - version_value = driver.select_value_or_none(self._get_query(version_query_dialect, "version")) + version_value = driver.select_value_or_none(self._get_query(version_query_dialect, "version", "current")) except Exception: self._log_version_unavailable(dialect, "query_failed") self.cache_version(driver_id, None) @@ -450,18 +450,18 @@ def get_tables(self, driver: "AdbcDriver", schema: "str | None" = None) -> "list if dialect == "bigquery": tables_table, kcu_table, rc_table = format_bigquery_information_schema_tables(schema_name) - query_text = self._get_query_text(dialect, "tables_by_schema").format( + query_text = self._get_query_text(dialect, "tables", "by_schema").format( tables_table=tables_table, kcu_table=kcu_table, rc_table=rc_table ) return driver.select(query_text, schema_type=TableMetadata) if dialect == "sqlite": schema_prefix = f"{format_identifier(schema_name)}." if schema_name else "" - query_text = self._get_query_text(dialect, "tables_by_schema").format(schema_prefix=schema_prefix) + query_text = self._get_query_text(dialect, "tables", "by_schema").format(schema_prefix=schema_prefix) return driver.select(query_text, schema_type=TableMetadata) return driver.select( - self._get_query(dialect, "tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self._get_query(dialect, "tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata ) def get_columns( @@ -484,30 +484,30 @@ def get_columns( if dialect == "bigquery": schema_prefix = format_bigquery_schema_prefix(schema_name) if table is None: - query_text = self._get_query_text(dialect, "columns_by_schema").format(schema_prefix=schema_prefix) + query_text = self._get_query_text(dialect, "columns", "by_schema").format(schema_prefix=schema_prefix) return driver.select(query_text, schema_name=schema_name, schema_type=ColumnMetadata) - query_text = self._get_query_text(dialect, "columns_by_table").format(schema_prefix=schema_prefix) + query_text = self._get_query_text(dialect, "columns", "by_table").format(schema_prefix=schema_prefix) table_name = self._resolve_identifier(dialect, table) return driver.select(query_text, table_name=table_name, schema_name=schema_name, schema_type=ColumnMetadata) if dialect == "sqlite": schema_prefix = f"{format_identifier(schema_name)}." if schema_name else "" if table is None: - query_text = self._get_query_text(dialect, "columns_by_schema").format(schema_prefix=schema_prefix) + query_text = self._get_query_text(dialect, "columns", "by_schema").format(schema_prefix=schema_prefix) return driver.select(query_text, schema_type=ColumnMetadata) table_identifier = f"{schema_name}.{table}" if schema_name else table - query_text = self._get_query_text(dialect, "columns_by_table").format( + query_text = self._get_query_text(dialect, "columns", "by_table").format( table_name=format_identifier(table_identifier) ) return driver.select(query_text, schema_type=ColumnMetadata) if table is None: return driver.select( - self._get_query(dialect, "columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self._get_query(dialect, "columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) table_name = self._resolve_identifier(dialect, table) return driver.select( - self._get_query(dialect, "columns_by_table"), + self._get_query(dialect, "columns", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ColumnMetadata, @@ -537,7 +537,7 @@ def get_indexes( table_name = table table_identifier = f"{schema_name}.{table_name}" if schema_name else table_name - index_list_sql = self._get_query_text(dialect, "indexes_by_table").format( + index_list_sql = self._get_query_text(dialect, "indexes", "by_table").format( table_name=format_identifier(table_identifier) ) index_list_rows = driver.select(index_list_sql) @@ -547,7 +547,7 @@ def get_indexes( if not index_name: continue index_identifier = f"{schema_name}.{index_name}" if schema_name else index_name - columns_sql = self._get_query_text(dialect, "index_columns_by_index").format( + columns_sql = self._get_query_text(dialect, "indexes", "columns_by_index").format( index_name=format_identifier(index_identifier) ) columns_rows = driver.select(columns_sql) @@ -567,17 +567,17 @@ def get_indexes( return index_metadata_list if dialect == "duckdb": - query_name = "indexes_by_schema" if table is None else "indexes_by_table" - return driver.select(self._get_query(dialect, query_name), schema_type=IndexMetadata) + operation = "by_schema" if table is None else "by_table" + return driver.select(self._get_query(dialect, "indexes", operation), schema_type=IndexMetadata) if table is None: return driver.select( - self._get_query(dialect, "indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self._get_query(dialect, "indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) table_name = self._resolve_identifier(dialect, table) return driver.select( - self._get_query(dialect, "indexes_by_table"), + self._get_query(dialect, "indexes", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=IndexMetadata, @@ -603,11 +603,11 @@ def get_foreign_keys( if dialect == "bigquery": _, kcu_table, rc_table = format_bigquery_information_schema_tables(schema_name) if table is None: - query_text = self._get_query_text(dialect, "foreign_keys_by_schema").format( + query_text = self._get_query_text(dialect, "foreign_keys", "by_schema").format( kcu_table=kcu_table, rc_table=rc_table ) return driver.select(query_text, schema_name=schema_name, schema_type=ForeignKeyMetadata) - query_text = self._get_query_text(dialect, "foreign_keys_by_table").format( + query_text = self._get_query_text(dialect, "foreign_keys", "by_table").format( kcu_table=kcu_table, rc_table=rc_table ) table_name = self._resolve_identifier(dialect, table) @@ -618,23 +618,25 @@ def get_foreign_keys( if dialect == "sqlite": if table is None: schema_prefix = f"{format_identifier(schema_name)}." if schema_name else "" - query_text = self._get_query_text(dialect, "foreign_keys_by_schema").format(schema_prefix=schema_prefix) + query_text = self._get_query_text(dialect, "foreign_keys", "by_schema").format( + schema_prefix=schema_prefix + ) return driver.select(query_text, schema_type=ForeignKeyMetadata) table_label = table.replace("'", "''") table_identifier = f"{schema_name}.{table}" if schema_name else table - query_text = self._get_query_text(dialect, "foreign_keys_by_table").format( + query_text = self._get_query_text(dialect, "foreign_keys", "by_table").format( table_name=format_identifier(table_identifier), table_label=table_label ) return driver.select(query_text, schema_type=ForeignKeyMetadata) if table is None: - query_text_optional = self._get_query_text_or_none(dialect, "foreign_keys_by_schema") + query_text_optional = self._get_query_text_or_none(dialect, "foreign_keys", "by_schema") if query_text_optional is not None: return driver.select(query_text_optional, schema_name=schema_name, schema_type=ForeignKeyMetadata) resolved_table_name = self._resolve_identifier(dialect, table) if table is not None else None return driver.select( - self._get_query(dialect, "foreign_keys_by_table"), + self._get_query(dialect, "foreign_keys", "by_table"), schema_name=schema_name, table_name=resolved_table_name, schema_type=ForeignKeyMetadata, @@ -782,17 +784,20 @@ def _normalize_dialect(self, driver: "AdbcDriver") -> str: dialect_value = str(driver.dialect) return normalize_dialect_name(dialect_value) - def _get_query(self, dialect: str, name: str) -> "SQL": + def _get_query(self, dialect: str, domain: str, operation: str) -> "SQL": loader = get_data_dictionary_loader() - return loader.get_query(dialect, name) + query = loader.get_domain_query(dialect, domain, operation) + if query.sql is None: + msg = f"No data-dictionary query found for {dialect}/{domain}/{operation}" + raise SQLFileNotFoundError(msg) + return query.sql - def _get_query_text(self, dialect: str, name: str) -> str: - loader = get_data_dictionary_loader() - return loader.get_query_text(dialect, name) + def _get_query_text(self, dialect: str, domain: str, operation: str) -> str: + return self._get_query(dialect, domain, operation).raw_sql - def _get_query_text_or_none(self, dialect: str, name: str) -> "str | None": + def _get_query_text_or_none(self, dialect: str, domain: str, operation: str) -> "str | None": try: - return self._get_query_text(dialect, name) + return self._get_query_text(dialect, domain, operation) except SQLFileNotFoundError: return None @@ -920,7 +925,7 @@ def _capability_for_domain(self, dialect: str, domain: str, probes: "dict[str, b return self._transport_capability(domain) if domain in {"schemas", "objects", "tables"} and (probes["objects"] or probes["table_types"]): return self._transport_capability(domain) - if domain == "indexes" and self._has_query(dialect, "indexes_by_schema"): + if domain == "indexes" and self._has_query(dialect, "indexes", "by_schema"): return MetadataCapability( domain=domain, support=MetadataSupport.SUPPORTED, @@ -945,9 +950,9 @@ def _transport_capability(self, domain: str) -> "MetadataCapability": warnings=(_ADBC_TRANSPORT_WARNING,), ) - def _has_query(self, dialect: str, name: str) -> bool: + def _has_query(self, dialect: str, domain: str, operation: str) -> bool: try: - self._get_query(dialect, name) + self._get_query(dialect, domain, operation) except SQLFileNotFoundError: return False return True diff --git a/sqlspec/adapters/aiomysql/data_dictionary.py b/sqlspec/adapters/aiomysql/data_dictionary.py index 16da24f4c..2e3ffcaaf 100644 --- a/sqlspec/adapters/aiomysql/data_dictionary.py +++ b/sqlspec/adapters/aiomysql/data_dictionary.py @@ -56,7 +56,7 @@ async def get_version(self, driver: "AiomysqlDriver") -> "VersionInfo | None": if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -153,7 +153,7 @@ async def get_ddl( """Get native SHOW CREATE output and replay-sensitive context for a table.""" _ = include_dependencies, prefer_native, redact schema_name = self._resolve_metadata_schema(schema) - raw_version = await driver.select_value_or_none(self.get_query_text("version")) + raw_version = await driver.select_value_or_none(self.get_query_text("version", "current")) sql_mode = await driver.select_value_or_none("SELECT @@sql_mode") sql_quote_show_create = await driver.select_value_or_none("SELECT @@sql_quote_show_create") statement = build_mysql_show_create_statement(object_name, schema_name, object_type) @@ -210,7 +210,7 @@ async def get_tables(self, driver: "AiomysqlDriver", schema: "str | None" = None schema_name = self._resolve_metadata_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") return await driver.select( - self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata ) async def get_columns( @@ -221,12 +221,12 @@ async def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return await driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return await driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) async def get_indexes( @@ -237,12 +237,12 @@ async def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return await driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return await driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) async def get_foreign_keys( @@ -253,12 +253,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -270,7 +270,7 @@ def _resolve_metadata_schema(self, schema: "str | None") -> "str | None": async def _get_engine_version(self, driver: "AiomysqlDriver") -> "MySQLEngineVersion | None": try: - version_value = await driver.select_value_or_none(self.get_query_text("version")) + version_value = await driver.select_value_or_none(self.get_query_text("version", "current")) except Exception: return None if version_value is None: diff --git a/sqlspec/adapters/aiosqlite/data_dictionary.py b/sqlspec/adapters/aiosqlite/data_dictionary.py index 9a7662b7e..6ff071f0c 100644 --- a/sqlspec/adapters/aiosqlite/data_dictionary.py +++ b/sqlspec/adapters/aiosqlite/data_dictionary.py @@ -64,7 +64,7 @@ async def get_version(self, driver: "AiosqliteDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -158,11 +158,11 @@ async def get_foreign_keys( schema_name = self.resolve_schema(schema) if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") - query_text = self._get_domain_query_text("constraints", "foreign_keys_by_schema") + query_text = self._get_domain_query_text("foreign_keys", "by_schema") return await driver.select(query_text, schema_name=schema_name, schema_type=ForeignKeyMetadata) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") - query_text = self._get_domain_query_text("constraints", "foreign_keys_by_table") + query_text = self._get_domain_query_text("foreign_keys", "by_table") return await driver.select( query_text, table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata ) diff --git a/sqlspec/adapters/arrow_odbc/data_dictionary.py b/sqlspec/adapters/arrow_odbc/data_dictionary.py index 811631270..04cc4d97c 100644 --- a/sqlspec/adapters/arrow_odbc/data_dictionary.py +++ b/sqlspec/adapters/arrow_odbc/data_dictionary.py @@ -104,15 +104,18 @@ def get_dialect_config(self) -> "DialectConfig": """Return the runtime dialect configuration for this data dictionary.""" return get_dialect_config(self._dialect) - def get_query(self, name: str) -> "SQL": - """Return a named SQL query for the runtime dialect.""" + def get_query(self, domain: str, operation: str, *, mode: str | None = None) -> "SQL": + """Return an exact domain query for the runtime dialect.""" loader = get_data_dictionary_loader() - return loader.get_query(self._dialect, name) + query = loader.get_domain_query(self._dialect, domain, operation, mode=mode) + if query.sql is None: + msg = f"No data-dictionary query found for {self._dialect}/{domain}/{operation}" + raise SQLFileNotFoundError(msg) + return query.sql - def get_query_text(self, name: str) -> str: - """Return raw SQL text for a named runtime dialect query.""" - loader = get_data_dictionary_loader() - return loader.get_query_text(self._dialect, name) + def get_query_text(self, domain: str, operation: str, *, mode: str | None = None) -> str: + """Return raw SQL text for an exact runtime dialect query.""" + return self.get_query(domain, operation, mode=mode).raw_sql def get_metadata_capabilities( self, driver: "ArrowOdbcDriver", domains: "Sequence[str] | None" = None @@ -166,7 +169,7 @@ def get_version(self, driver: "ArrowOdbcDriver") -> VersionInfo | None: return self._version_cache.get(driver_id) try: - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) except SQLFileNotFoundError: self._log_version_unavailable(self._dialect, "no_query") self.cache_version(driver_id, None) @@ -203,7 +206,9 @@ def get_tables(self, driver: "ArrowOdbcDriver", schema: str | None = None) -> li """Get table metadata for dialects with bundled catalog queries.""" try: return driver.select( - self.get_query("tables_by_schema"), schema_name=self.resolve_schema(schema), schema_type=TableMetadata + self.get_query("tables", "by_schema"), + schema_name=self.resolve_schema(schema), + schema_type=TableMetadata, ) except SQLFileNotFoundError: return [] @@ -212,14 +217,14 @@ def get_columns( self, driver: "ArrowOdbcDriver", table: str | None = None, schema: str | None = None ) -> list[ColumnMetadata]: """Get column metadata for dialects with bundled catalog queries.""" - query_name = "columns_by_table" if table is not None else "columns_by_schema" + operation = "by_table" if table is not None else "by_schema" resolved_schema = self.resolve_schema(schema) resolved_table = self.resolve_identifier(table) if table is not None else None parameters: dict[str, Any] = {"schema_name": resolved_schema} if table is not None: parameters["table_name"] = resolved_table try: - rows = driver.select(self.get_query(query_name), schema_type=ColumnMetadata, **parameters) + rows = driver.select(self.get_query("columns", operation), schema_type=ColumnMetadata, **parameters) except SQLFileNotFoundError: rows = [] if rows or resolved_table is None: @@ -230,12 +235,12 @@ def get_indexes( self, driver: "ArrowOdbcDriver", table: str | None = None, schema: str | None = None ) -> list[IndexMetadata]: """Get index metadata for dialects with bundled catalog queries.""" - query_name = "indexes_by_table" if table is not None else "indexes_by_schema" + operation = "by_table" if table is not None else "by_schema" parameters: dict[str, Any] = {"schema_name": self.resolve_schema(schema)} if table is not None: parameters["table_name"] = self.resolve_identifier(table) try: - return driver.select(self.get_query(query_name), schema_type=IndexMetadata, **parameters) + return driver.select(self.get_query("indexes", operation), schema_type=IndexMetadata, **parameters) except SQLFileNotFoundError: return [] @@ -243,12 +248,14 @@ def get_foreign_keys( self, driver: "ArrowOdbcDriver", table: str | None = None, schema: str | None = None ) -> list[ForeignKeyMetadata]: """Get foreign-key metadata for dialects with bundled catalog queries.""" - query_name = "foreign_keys_by_table" if table is not None else "foreign_keys_by_schema" + operation = "by_table" if table is not None else "by_schema" parameters: dict[str, Any] = {"schema_name": self.resolve_schema(schema)} if table is not None: parameters["table_name"] = self.resolve_identifier(table) try: - return driver.select(self.get_query(query_name), schema_type=ForeignKeyMetadata, **parameters) + return driver.select( + self.get_query("foreign_keys", operation), schema_type=ForeignKeyMetadata, **parameters + ) except SQLFileNotFoundError: return [] @@ -302,13 +309,7 @@ def _capability_for_domain(self, domain: str) -> MetadataCapability: source=MetadataSource.DRIVER_METADATA, warnings=(_ODBC_COLUMN_PARTIAL_WARNING,), ) - query_by_domain = { - "tables": "tables_by_schema", - "indexes": "indexes_by_schema", - "foreign_keys": "foreign_keys_by_schema", - } - query_name = query_by_domain.get(domain) - if query_name is not None and self._has_query(query_name): + if domain in {"tables", "indexes", "foreign_keys"} and self._has_query(domain, "by_schema"): return MetadataCapability( domain=domain, support=MetadataSupport.SUPPORTED, @@ -323,9 +324,9 @@ def _capability_for_domain(self, domain: str) -> MetadataCapability: warnings=(_ODBC_CATALOG_UNAVAILABLE_WARNING,), ) - def _has_query(self, name: str) -> bool: + def _has_query(self, domain: str, operation: str) -> bool: try: - self.get_query(name) + self.get_query(domain, operation) except SQLFileNotFoundError: return False return True diff --git a/sqlspec/adapters/asyncmy/data_dictionary.py b/sqlspec/adapters/asyncmy/data_dictionary.py index 424cce72a..d9656870b 100644 --- a/sqlspec/adapters/asyncmy/data_dictionary.py +++ b/sqlspec/adapters/asyncmy/data_dictionary.py @@ -57,7 +57,7 @@ async def get_version(self, driver: "AsyncmyDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -154,7 +154,7 @@ async def get_ddl( """Get native SHOW CREATE output and replay-sensitive context for a table.""" _ = include_dependencies, prefer_native, redact schema_name = self._resolve_metadata_schema(schema) - raw_version = await driver.select_value_or_none(self.get_query_text("version")) + raw_version = await driver.select_value_or_none(self.get_query_text("version", "current")) sql_mode = await driver.select_value_or_none("SELECT @@sql_mode") sql_quote_show_create = await driver.select_value_or_none("SELECT @@sql_quote_show_create") statement = build_mysql_show_create_statement(object_name, schema_name, object_type) @@ -211,7 +211,7 @@ async def get_tables(self, driver: "AsyncmyDriver", schema: "str | None" = None) schema_name = self._resolve_metadata_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") return await driver.select( - self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata ) async def get_columns( @@ -222,12 +222,12 @@ async def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return await driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return await driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) async def get_indexes( @@ -238,12 +238,12 @@ async def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return await driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return await driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) async def get_foreign_keys( @@ -254,12 +254,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -271,7 +271,7 @@ def _resolve_metadata_schema(self, schema: "str | None") -> "str | None": async def _get_engine_version(self, driver: "AsyncmyDriver") -> "MySQLEngineVersion | None": try: - version_value = await driver.select_value_or_none(self.get_query_text("version")) + version_value = await driver.select_value_or_none(self.get_query_text("version", "current")) except Exception: return None if version_value is None: diff --git a/sqlspec/adapters/asyncpg/data_dictionary.py b/sqlspec/adapters/asyncpg/data_dictionary.py index 28711819f..c061360ba 100644 --- a/sqlspec/adapters/asyncpg/data_dictionary.py +++ b/sqlspec/adapters/asyncpg/data_dictionary.py @@ -315,7 +315,7 @@ async def get_version(self, driver: "AsyncpgDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -428,12 +428,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/bigquery/data_dictionary.py b/sqlspec/adapters/bigquery/data_dictionary.py index 0bc206b5d..8bc39303b 100644 --- a/sqlspec/adapters/bigquery/data_dictionary.py +++ b/sqlspec/adapters/bigquery/data_dictionary.py @@ -188,7 +188,7 @@ def get_tables(self, driver: "BigQueryDriver", schema: "str | None" = None) -> " self._log_schema_introspect(driver, schema_name=scope.schema_name, table_name=None, operation="tables") tables_table, kcu_table, rc_table = format_bigquery_information_schema_tables(schema) - query_text = self.get_query_text("tables_by_schema").format( + query_text = self.get_query_text("tables", "by_schema").format( tables_table=tables_table, kcu_table=kcu_table, rc_table=rc_table ) return driver.select(query_text, schema_name=scope.schema_name, schema_type=TableMetadata) @@ -201,11 +201,11 @@ def get_columns( schema_prefix = format_bigquery_schema_prefix(schema) if table is None: self._log_schema_introspect(driver, schema_name=scope.schema_name, table_name=None, operation="columns") - query_text = self.get_query_text("columns_by_schema").format(schema_prefix=schema_prefix) + query_text = self.get_query_text("columns", "by_schema").format(schema_prefix=schema_prefix) return driver.select(query_text, schema_name=scope.schema_name, schema_type=ColumnMetadata) self._log_table_describe(driver, schema_name=scope.schema_name, table_name=table, operation="columns") - query_text = self.get_query_text("columns_by_table").format(schema_prefix=schema_prefix) + query_text = self.get_query_text("columns", "by_table").format(schema_prefix=schema_prefix) return driver.select(query_text, table_name=table, schema_name=scope.schema_name, schema_type=ColumnMetadata) def get_indexes( @@ -251,10 +251,10 @@ def get_foreign_keys( rc_table = scope.dataset_information_schema_table("REFERENTIAL_CONSTRAINTS") if table is None: - query_text = self.get_query_text("foreign_keys_by_schema").format(kcu_table=kcu_table, rc_table=rc_table) + query_text = self.get_query_text("foreign_keys", "by_schema").format(kcu_table=kcu_table, rc_table=rc_table) return driver.select(query_text, schema_name=scope.schema_name, schema_type=ForeignKeyMetadata) - query_text = self.get_query_text("foreign_keys_by_table").format(kcu_table=kcu_table, rc_table=rc_table) + query_text = self.get_query_text("foreign_keys", "by_table").format(kcu_table=kcu_table, rc_table=rc_table) return driver.select( query_text, table_name=table, schema_name=scope.schema_name, schema_type=ForeignKeyMetadata ) diff --git a/sqlspec/adapters/cockroach_asyncpg/data_dictionary.py b/sqlspec/adapters/cockroach_asyncpg/data_dictionary.py index c3dc856db..2cc7aca2c 100644 --- a/sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +++ b/sqlspec/adapters/cockroach_asyncpg/data_dictionary.py @@ -276,7 +276,7 @@ async def get_version(self, driver: "CockroachAsyncpgDriver") -> "VersionInfo | if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -363,13 +363,13 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table_name, schema_name=schema_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/cockroach_psycopg/data_dictionary.py b/sqlspec/adapters/cockroach_psycopg/data_dictionary.py index 8448c2c8b..6d42d97d9 100644 --- a/sqlspec/adapters/cockroach_psycopg/data_dictionary.py +++ b/sqlspec/adapters/cockroach_psycopg/data_dictionary.py @@ -283,7 +283,7 @@ def get_version(self, driver: "CockroachPsycopgSyncDriver") -> "VersionInfo | No if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -376,13 +376,13 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table_name, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -518,7 +518,7 @@ async def get_version(self, driver: "CockroachPsycopgAsyncDriver") -> "VersionIn if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -613,13 +613,13 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table_name, schema_name=schema_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/duckdb/data_dictionary.py b/sqlspec/adapters/duckdb/data_dictionary.py index ec8aa6c95..0708206c9 100644 --- a/sqlspec/adapters/duckdb/data_dictionary.py +++ b/sqlspec/adapters/duckdb/data_dictionary.py @@ -46,7 +46,7 @@ def get_version(self, driver: "DuckDBDriver") -> "VersionInfo | None": if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -92,7 +92,7 @@ def get_tables(self, driver: "DuckDBDriver", schema: "str | None" = None) -> "li """Get tables sorted by topological dependency order using DuckDB catalog.""" schema_name = self.resolve_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") - return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata) + return driver.select(self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata) def get_columns( self, driver: "DuckDBDriver", table: "str | None" = None, schema: "str | None" = None @@ -137,12 +137,12 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/mssql_python/data_dictionary.py b/sqlspec/adapters/mssql_python/data_dictionary.py index c03088ec6..42e18ef92 100644 --- a/sqlspec/adapters/mssql_python/data_dictionary.py +++ b/sqlspec/adapters/mssql_python/data_dictionary.py @@ -163,7 +163,7 @@ def get_version(self, driver: "MssqlPythonDriver") -> MssqlVersionInfo | None: if driver_id in self._version_fetch_attempted: return cast("MssqlVersionInfo | None", self._version_cache.get(driver_id)) - row = driver.select_one_or_none(self.get_query_text("version")) + row = driver.select_one_or_none(self.get_query_text("version", "current")) if not row: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -275,7 +275,7 @@ def get_foreign_keys( return cast( "list[ForeignKeyMetadata]", driver.select( - self.get_domain_query("constraints", "foreign_keys_by_schema"), + self.get_domain_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata, ), @@ -284,7 +284,7 @@ def get_foreign_keys( return cast( "list[ForeignKeyMetadata]", driver.select( - self.get_domain_query("constraints", "foreign_keys_by_table"), + self.get_domain_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/mysqlconnector/data_dictionary.py b/sqlspec/adapters/mysqlconnector/data_dictionary.py index 06e64b6d7..815e377fa 100644 --- a/sqlspec/adapters/mysqlconnector/data_dictionary.py +++ b/sqlspec/adapters/mysqlconnector/data_dictionary.py @@ -57,7 +57,7 @@ def get_version(self, driver: "MysqlConnectorSyncDriver") -> "VersionInfo | None return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -154,7 +154,7 @@ def get_ddl( """Get native SHOW CREATE output and replay-sensitive context for a table.""" _ = include_dependencies, prefer_native, redact schema_name = self._resolve_metadata_schema(schema) - raw_version = driver.select_value_or_none(self.get_query_text("version")) + raw_version = driver.select_value_or_none(self.get_query_text("version", "current")) sql_mode = driver.select_value_or_none("SELECT @@sql_mode") sql_quote_show_create = driver.select_value_or_none("SELECT @@sql_quote_show_create") statement = build_mysql_show_create_statement(object_name, schema_name, object_type) @@ -210,7 +210,7 @@ def get_tables(self, driver: "MysqlConnectorSyncDriver", schema: "str | None" = """Get tables sorted by topological dependency order using the MySQL catalog.""" schema_name = self._resolve_metadata_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") - return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata) + return driver.select(self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata) def get_columns( self, driver: "MysqlConnectorSyncDriver", table: "str | None" = None, schema: "str | None" = None @@ -220,12 +220,12 @@ def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) def get_indexes( @@ -236,12 +236,12 @@ def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) def get_foreign_keys( @@ -252,12 +252,12 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -269,7 +269,7 @@ def _resolve_metadata_schema(self, schema: "str | None") -> "str | None": def _get_engine_version(self, driver: "MysqlConnectorSyncDriver") -> "MySQLEngineVersion | None": try: - version_value = driver.select_value_or_none(self.get_query_text("version")) + version_value = driver.select_value_or_none(self.get_query_text("version", "current")) except Exception: return None if version_value is None: @@ -318,7 +318,7 @@ async def get_version(self, driver: "MysqlConnectorAsyncDriver") -> "VersionInfo return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -415,7 +415,7 @@ async def get_ddl( """Get native SHOW CREATE output and replay-sensitive context for a table.""" _ = include_dependencies, prefer_native, redact schema_name = self._resolve_metadata_schema(schema) - raw_version = await driver.select_value_or_none(self.get_query_text("version")) + raw_version = await driver.select_value_or_none(self.get_query_text("version", "current")) sql_mode = await driver.select_value_or_none("SELECT @@sql_mode") sql_quote_show_create = await driver.select_value_or_none("SELECT @@sql_quote_show_create") statement = build_mysql_show_create_statement(object_name, schema_name, object_type) @@ -474,7 +474,7 @@ async def get_tables( schema_name = self._resolve_metadata_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") return await driver.select( - self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata ) async def get_columns( @@ -485,12 +485,12 @@ async def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return await driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return await driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) async def get_indexes( @@ -501,12 +501,12 @@ async def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return await driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return await driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) async def get_foreign_keys( @@ -517,12 +517,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -534,7 +534,7 @@ def _resolve_metadata_schema(self, schema: "str | None") -> "str | None": async def _get_engine_version(self, driver: "MysqlConnectorAsyncDriver") -> "MySQLEngineVersion | None": try: - version_value = await driver.select_value_or_none(self.get_query_text("version")) + version_value = await driver.select_value_or_none(self.get_query_text("version", "current")) except Exception: return None if version_value is None: diff --git a/sqlspec/adapters/oracledb/data_dictionary.py b/sqlspec/adapters/oracledb/data_dictionary.py index 932ab5db8..17e8c22bc 100644 --- a/sqlspec/adapters/oracledb/data_dictionary.py +++ b/sqlspec/adapters/oracledb/data_dictionary.py @@ -311,7 +311,7 @@ def get_ddl( owner = self.resolve_schema(schema) normalized_name = self.resolve_identifier(object_name) normalized_type = object_type.upper() - query = get_data_dictionary_loader().get_domain_query("oracle", "ddl", "dbms_metadata") + query = get_data_dictionary_loader().get_domain_query("oracle", "ddl", "by_object") if not query.is_supported or query.sql is None: return _oracle_ddl_metadata_result( object_type=normalized_type, object_name=normalized_name, owner=owner, ddl_text=None @@ -471,7 +471,7 @@ def get_storage_capabilities(self, driver: "OracleSyncDriver") -> OracleStorageC capabilities = _unsupported_storage_capabilities() reason: str | None = None try: - rows = driver.select(self.get_query_text("storage_options")) + rows = driver.select(self.get_query_text("version", "storage_options")) capabilities = _storage_capabilities_from_rows(rows) if not rows: reason = "options_not_reported" @@ -512,10 +512,10 @@ def get_tables(self, driver: "OracleSyncDriver", schema: "str | None" = None) -> schema_name = self.resolve_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") ordered_rows = driver.select( - self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "by_schema"), schema_name=schema_name, table_name=None, schema_type=TableMetadata ) all_rows = driver.select( - self.get_query("all_tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "names_by_schema"), schema_name=schema_name, schema_type=TableMetadata ) return merge_oracle_table_lists(ordered_rows, all_rows) @@ -527,12 +527,12 @@ def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="columns") return driver.select( - self.get_query("columns_by_table"), + self.get_query("columns", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ColumnMetadata, @@ -546,12 +546,12 @@ def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="indexes") return driver.select( - self.get_query("indexes_by_table"), + self.get_query("indexes", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=IndexMetadata, @@ -565,12 +565,12 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, @@ -587,7 +587,7 @@ def _build_version_info( return OracleVersionInfo(parts[0], parts[1], parts[2], compatible=compatible, is_autonomous=is_autonomous) def _select_domain( - self, driver: "OracleSyncDriver", domain: str, *, query_name: str = "by_owner", **binds: object + self, driver: "OracleSyncDriver", domain: str, *, query_name: str = "by_schema", **binds: object ) -> MetadataResult: query = get_data_dictionary_loader().get_domain_query("oracle", domain, query_name) if not query.is_supported or query.sql is None: @@ -597,7 +597,7 @@ def _select_domain( return _oracle_domain_metadata_result(domain, cast("list[object]", rows)) def _get_compatible_value(self, driver: "OracleSyncDriver") -> "str | None": - query_text = self.get_query_text("compatible") + query_text = self.get_query_text("version", "compatible") try: value = driver.select_value(query_text) if value is None: @@ -607,7 +607,7 @@ def _get_compatible_value(self, driver: "OracleSyncDriver") -> "str | None": return None def _is_autonomous(self, driver: "OracleSyncDriver") -> bool: - query_text = self.get_query_text("autonomous_service") + query_text = self.get_query_text("version", "autonomous_service") try: return bool(driver.select_value_or_none(query_text)) except Exception: @@ -615,7 +615,7 @@ def _is_autonomous(self, driver: "OracleSyncDriver") -> bool: def _fetch_version(self, driver: "OracleSyncDriver") -> "OracleVersionInfo | None": """Query the server for its version, compatible level, and autonomous flag.""" - version_row = driver.select_one_or_none(self.get_query_text("version")) + version_row = driver.select_one_or_none(self.get_query_text("version", "current")) if not version_row: self._log_version_unavailable(type(self).dialect, "missing") return None @@ -707,7 +707,7 @@ async def get_ddl( owner = self.resolve_schema(schema) normalized_name = self.resolve_identifier(object_name) normalized_type = object_type.upper() - query = get_data_dictionary_loader().get_domain_query("oracle", "ddl", "dbms_metadata") + query = get_data_dictionary_loader().get_domain_query("oracle", "ddl", "by_object") if not query.is_supported or query.sql is None: return _oracle_ddl_metadata_result( object_type=normalized_type, object_name=normalized_name, owner=owner, ddl_text=None @@ -869,7 +869,7 @@ async def get_storage_capabilities(self, driver: "OracleAsyncDriver") -> OracleS capabilities = _unsupported_storage_capabilities() reason: str | None = None try: - rows = await driver.select(self.get_query_text("storage_options")) + rows = await driver.select(self.get_query_text("version", "storage_options")) capabilities = _storage_capabilities_from_rows(rows) if not rows: reason = "options_not_reported" @@ -910,10 +910,10 @@ async def get_tables(self, driver: "OracleAsyncDriver", schema: "str | None" = N schema_name = self.resolve_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") ordered_rows = await driver.select( - self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "by_schema"), schema_name=schema_name, table_name=None, schema_type=TableMetadata ) all_rows = await driver.select( - self.get_query("all_tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata + self.get_query("tables", "names_by_schema"), schema_name=schema_name, schema_type=TableMetadata ) return merge_oracle_table_lists(ordered_rows, all_rows) @@ -925,12 +925,12 @@ async def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return await driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="columns") return await driver.select( - self.get_query("columns_by_table"), + self.get_query("columns", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ColumnMetadata, @@ -944,12 +944,12 @@ async def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return await driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="indexes") return await driver.select( - self.get_query("indexes_by_table"), + self.get_query("indexes", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=IndexMetadata, @@ -963,12 +963,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, @@ -985,7 +985,7 @@ def _build_version_info( return OracleVersionInfo(parts[0], parts[1], parts[2], compatible=compatible, is_autonomous=is_autonomous) async def _select_domain( - self, driver: "OracleAsyncDriver", domain: str, *, query_name: str = "by_owner", **binds: object + self, driver: "OracleAsyncDriver", domain: str, *, query_name: str = "by_schema", **binds: object ) -> MetadataResult: query = get_data_dictionary_loader().get_domain_query("oracle", domain, query_name) if not query.is_supported or query.sql is None: @@ -995,7 +995,7 @@ async def _select_domain( return _oracle_domain_metadata_result(domain, cast("list[object]", rows)) async def _get_compatible_value(self, driver: "OracleAsyncDriver") -> "str | None": - query_text = self.get_query_text("compatible") + query_text = self.get_query_text("version", "compatible") try: value = await driver.select_value(query_text) if value is None: @@ -1005,7 +1005,7 @@ async def _get_compatible_value(self, driver: "OracleAsyncDriver") -> "str | Non return None async def _is_autonomous(self, driver: "OracleAsyncDriver") -> bool: - query_text = self.get_query_text("autonomous_service") + query_text = self.get_query_text("version", "autonomous_service") try: return bool(await driver.select_value_or_none(query_text)) except Exception: @@ -1013,7 +1013,7 @@ async def _is_autonomous(self, driver: "OracleAsyncDriver") -> bool: async def _fetch_version(self, driver: "OracleAsyncDriver") -> "OracleVersionInfo | None": """Query the server for its version, compatible level, and autonomous flag.""" - version_row = await driver.select_one_or_none(self.get_query_text("version")) + version_row = await driver.select_one_or_none(self.get_query_text("version", "current")) if not version_row: self._log_version_unavailable(type(self).dialect, "missing") return None diff --git a/sqlspec/adapters/psqlpy/data_dictionary.py b/sqlspec/adapters/psqlpy/data_dictionary.py index c10a5feaf..86d3d0c73 100644 --- a/sqlspec/adapters/psqlpy/data_dictionary.py +++ b/sqlspec/adapters/psqlpy/data_dictionary.py @@ -316,7 +316,7 @@ async def get_version(self, driver: "PsqlpyDriver") -> "VersionInfo | None": if driver_id in self._version_fetch_attempted: return self._version_cache.get(driver_id) - version_value = await driver.select_value(self.get_query("version")) + version_value = await driver.select_value(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -412,12 +412,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/psycopg/data_dictionary.py b/sqlspec/adapters/psycopg/data_dictionary.py index b7d70823c..31cef670f 100644 --- a/sqlspec/adapters/psycopg/data_dictionary.py +++ b/sqlspec/adapters/psycopg/data_dictionary.py @@ -321,7 +321,7 @@ def get_version(self, driver: "PsycopgSyncDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -433,12 +433,12 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, @@ -600,7 +600,7 @@ async def get_version(self, driver: "PsycopgAsyncDriver") -> "VersionInfo | None return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = await driver.select_value_or_none(self.get_query("version")) + version_value = await driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -712,12 +712,12 @@ async def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) table_name = self.resolve_identifier(table) self._log_table_describe(driver, schema_name=schema_name, table_name=table_name, operation="foreign_keys") return await driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/pymssql/data_dictionary.py b/sqlspec/adapters/pymssql/data_dictionary.py index 3807c5c93..560296588 100644 --- a/sqlspec/adapters/pymssql/data_dictionary.py +++ b/sqlspec/adapters/pymssql/data_dictionary.py @@ -163,7 +163,7 @@ def get_version(self, driver: "PymssqlDriver") -> MssqlVersionInfo | None: if driver_id in self._version_fetch_attempted: return cast("MssqlVersionInfo | None", self._version_cache.get(driver_id)) - row = driver.select_one_or_none(self.get_query_text("version")) + row = driver.select_one_or_none(self.get_query_text("version", "current")) if not row: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -275,7 +275,7 @@ def get_foreign_keys( return cast( "list[ForeignKeyMetadata]", driver.select( - self.get_domain_query("constraints", "foreign_keys_by_schema"), + self.get_domain_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata, ), @@ -284,7 +284,7 @@ def get_foreign_keys( return cast( "list[ForeignKeyMetadata]", driver.select( - self.get_domain_query("constraints", "foreign_keys_by_table"), + self.get_domain_query("foreign_keys", "by_table"), schema_name=schema_name, table_name=table, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/pymysql/data_dictionary.py b/sqlspec/adapters/pymysql/data_dictionary.py index 09228e16c..16deb693e 100644 --- a/sqlspec/adapters/pymysql/data_dictionary.py +++ b/sqlspec/adapters/pymysql/data_dictionary.py @@ -57,7 +57,7 @@ def get_version(self, driver: "PyMysqlDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -152,7 +152,7 @@ def get_ddl( """Get native SHOW CREATE output and replay-sensitive context for a table.""" _ = include_dependencies, prefer_native, redact schema_name = self._resolve_metadata_schema(schema) - raw_version = driver.select_value_or_none(self.get_query_text("version")) + raw_version = driver.select_value_or_none(self.get_query_text("version", "current")) sql_mode = driver.select_value_or_none("SELECT @@sql_mode") sql_quote_show_create = driver.select_value_or_none("SELECT @@sql_quote_show_create") statement = build_mysql_show_create_statement(object_name, schema_name, object_type) @@ -208,7 +208,7 @@ def get_tables(self, driver: "PyMysqlDriver", schema: "str | None" = None) -> "l """Get tables sorted by topological dependency order using the MySQL catalog.""" schema_name = self._resolve_metadata_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") - return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata) + return driver.select(self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata) def get_columns( self, driver: "PyMysqlDriver", table: "str | None" = None, schema: "str | None" = None @@ -218,12 +218,12 @@ def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) def get_indexes( @@ -234,12 +234,12 @@ def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) def get_foreign_keys( @@ -250,12 +250,12 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, @@ -267,7 +267,7 @@ def _resolve_metadata_schema(self, schema: "str | None") -> "str | None": def _get_engine_version(self, driver: "PyMysqlDriver") -> "MySQLEngineVersion | None": try: - version_value = driver.select_value_or_none(self.get_query_text("version")) + version_value = driver.select_value_or_none(self.get_query_text("version", "current")) except Exception: return None if version_value is None: diff --git a/sqlspec/adapters/spanner/data_dictionary.py b/sqlspec/adapters/spanner/data_dictionary.py index ea3d9b6eb..ffc915518 100644 --- a/sqlspec/adapters/spanner/data_dictionary.py +++ b/sqlspec/adapters/spanner/data_dictionary.py @@ -110,7 +110,7 @@ def get_tables(self, driver: "SpannerSyncDriver", schema: "str | None" = None) - """Get tables using INFORMATION_SCHEMA.""" schema_name = self.resolve_schema(schema) self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables") - return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata) + return driver.select(self.get_query("tables", "by_schema"), schema_name=schema_name, schema_type=TableMetadata) def get_columns( self, driver: "SpannerSyncDriver", table: "str | None" = None, schema: "str | None" = None @@ -120,12 +120,12 @@ def get_columns( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns") return driver.select( - self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_schema"), schema_name=schema_name, schema_type=ColumnMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns") return driver.select( - self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata + self.get_query("columns", "by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata ) def get_indexes( @@ -136,12 +136,12 @@ def get_indexes( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes") return driver.select( - self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_schema"), schema_name=schema_name, schema_type=IndexMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes") return driver.select( - self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata + self.get_query("indexes", "by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata ) def get_foreign_keys( @@ -152,11 +152,11 @@ def get_foreign_keys( if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata + self.get_query("foreign_keys", "by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata ) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") return driver.select( - self.get_query("foreign_keys_by_table"), + self.get_query("foreign_keys", "by_table"), table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata, diff --git a/sqlspec/adapters/sqlite/data_dictionary.py b/sqlspec/adapters/sqlite/data_dictionary.py index f801365f0..7d1fa92f4 100644 --- a/sqlspec/adapters/sqlite/data_dictionary.py +++ b/sqlspec/adapters/sqlite/data_dictionary.py @@ -55,7 +55,7 @@ def get_version(self, driver: "SqliteDriver") -> "VersionInfo | None": return self._version_cache.get(driver_id) # Not cached, fetch from database - version_value = driver.select_value_or_none(self.get_query("version")) + version_value = driver.select_value_or_none(self.get_query("version", "current")) if not version_value: self._log_version_unavailable(type(self).dialect, "missing") self.cache_version(driver_id, None) @@ -154,11 +154,11 @@ def get_foreign_keys( schema_name = self.resolve_schema(schema) if table is None: self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys") - query_text = self._get_domain_query_text("constraints", "foreign_keys_by_schema") + query_text = self._get_domain_query_text("foreign_keys", "by_schema") return driver.select(query_text, schema_name=schema_name, schema_type=ForeignKeyMetadata) self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys") - query_text = self._get_domain_query_text("constraints", "foreign_keys_by_table") + query_text = self._get_domain_query_text("foreign_keys", "by_table") return driver.select(query_text, table_name=table, schema_name=schema_name, schema_type=ForeignKeyMetadata) def _get_domain_query_text(self, domain: str, query_name: str) -> str: diff --git a/sqlspec/data_dictionary/_loader.py b/sqlspec/data_dictionary/_loader.py index 33299ef03..8cb07a9ba 100644 --- a/sqlspec/data_dictionary/_loader.py +++ b/sqlspec/data_dictionary/_loader.py @@ -13,7 +13,6 @@ MetadataSource, MetadataSupport, ) -from sqlspec.exceptions import SQLFileNotFoundError from sqlspec.loader import SQLFileLoader from sqlspec.utils.text import slugify @@ -26,7 +25,6 @@ else: from importlib.abc import Traversable - from sqlspec.core.statement import SQL from sqlspec.data_dictionary._types import DialectConfig, VersionInfo __all__ = ("DataDictionaryLoader", "get_data_dictionary_loader") @@ -40,77 +38,13 @@ class DataDictionaryLoader: """Loads and manages data dictionary SQL for all dialects.""" - __slots__ = ("_domain_loaders", "_loaded_dialects", "_loaded_domain_paths", "_sql_loaders") + __slots__ = ("_domain_loaders", "_loaded_domain_paths") def __init__(self) -> None: """Initialize the data dictionary loader.""" - self._sql_loaders: dict[str, SQLFileLoader] = {} self._domain_loaders: dict[tuple[str, str, str | None], SQLFileLoader] = {} - self._loaded_dialects: set[str] = set() self._loaded_domain_paths: set[tuple[str, str, str | None]] = set() - def _get_loader(self, dialect: str) -> "SQLFileLoader": - """Return or create a SQL loader for a dialect. - - Args: - dialect: Dialect name. - - Returns: - SQLFileLoader instance. - """ - loader = self._sql_loaders.get(dialect) - if loader is None: - loader = SQLFileLoader() - self._sql_loaders[dialect] = loader - return loader - - def _ensure_dialect_loaded(self, dialect: str) -> None: - """Lazy load SQL files for a dialect. - - Args: - dialect: Dialect name. - - Raises: - SQLFileNotFoundError: When the dialect SQL directory is missing. - """ - if dialect in self._loaded_dialects: - return - dialect_resource = _sql_resource_root().joinpath(dialect) - if not dialect_resource.is_dir(): - raise SQLFileNotFoundError(str(dialect_resource)) - loader = self._get_loader(dialect) - with as_file(dialect_resource) as dialect_path: - loader.load_sql(dialect_path) - self._loaded_dialects.add(dialect) - - def get_query(self, dialect: str, query_name: str) -> "SQL": - """Get SQL query for a specific dialect and operation. - - Args: - dialect: Dialect name. - query_name: Query name to fetch. - - Returns: - SQL object for the named query. - """ - self._ensure_dialect_loaded(dialect) - loader = self._get_loader(dialect) - return loader.get_sql(query_name) - - def get_query_text(self, dialect: str, query_name: str) -> str: - """Get raw SQL text for a specific dialect and operation. - - Args: - dialect: Dialect name. - query_name: Query name to fetch. - - Returns: - Raw SQL text for the named query. - """ - self._ensure_dialect_loaded(dialect) - loader = self._get_loader(dialect) - return loader.get_query_text(query_name) - def _get_domain_loader(self, dialect: str, domain: str, mode: str | None) -> "SQLFileLoader": """Return or create a SQL loader for a dialect/domain/mode pack.""" key = (dialect, domain, mode) @@ -124,12 +58,16 @@ def _domain_path_candidates( self, dialect: str, domain: str, mode: str | None ) -> "tuple[tuple[str | None, Traversable], ...]": """Return candidate resource paths for a domain query pack.""" - dialect_resource = _sql_resource_root().joinpath(dialect) + try: + sql_root = resources.files(f"sqlspec.data_dictionary.dialects.{dialect}").joinpath("sql") + except (ModuleNotFoundError, FileNotFoundError): + return () if mode is None: - return ((None, dialect_resource.joinpath(domain)),) + return ((None, sql_root.joinpath(f"{domain}.sql")), (None, sql_root.joinpath(domain))) return ( - (mode, dialect_resource.joinpath(domain).joinpath(mode)), - (mode, dialect_resource.joinpath(mode).joinpath(domain)), + (mode, sql_root.joinpath(mode).joinpath(f"{domain}.sql")), + (mode, sql_root.joinpath(domain).joinpath(f"{mode}.sql")), + (mode, sql_root.joinpath(domain).joinpath(mode)), ) def _ensure_domain_loaded(self, dialect: str, domain: str, mode: str | None) -> bool: @@ -148,14 +86,20 @@ def _ensure_domain_loaded(self, dialect: str, domain: str, mode: str | None) -> return True for resolved_mode, domain_resource in self._domain_path_candidates(dialect, domain, mode): - if not domain_resource.is_dir(): - continue - loader = self._get_domain_loader(dialect, domain, resolved_mode) - with as_file(domain_resource) as domain_path: - loader.load_sql(domain_path) - self._loaded_domain_paths.add((dialect, domain, resolved_mode)) - if resolved_mode == mode: - return True + if domain_resource.is_file(): + loader = self._get_domain_loader(dialect, domain, resolved_mode) + with as_file(domain_resource) as file_path: + loader.load_sql(file_path) + self._loaded_domain_paths.add((dialect, domain, resolved_mode)) + if resolved_mode == mode: + return True + elif domain_resource.is_dir(): + loader = self._get_domain_loader(dialect, domain, resolved_mode) + with as_file(domain_resource) as domain_path: + loader.load_sql(domain_path) + self._loaded_domain_paths.add((dialect, domain, resolved_mode)) + if resolved_mode == mode: + return True return False def _unsupported_domain_query( @@ -288,10 +232,10 @@ def get_domain_query( return MetadataQuery( dialect=normalized_dialect, domain=normalized_domain, - name=normalized_query, + name=query_name, mode=normalized_mode, - sql=loader.get_sql(normalized_query), capability=capability, + sql=loader.get_sql(normalized_query), ) def get_domain_queries( @@ -358,10 +302,17 @@ def list_dialects(self) -> "list[str]": Returns: List of dialect names with SQL directories. """ - sql_root = _sql_resource_root() - if not sql_root.is_dir(): + try: + dialects_root = resources.files("sqlspec.data_dictionary.dialects") + except (ModuleNotFoundError, FileNotFoundError): + return [] + if not dialects_root.is_dir(): return [] - return sorted([path.name for path in sql_root.iterdir() if path.is_dir()]) + return sorted([ + path.name + for path in dialects_root.iterdir() + if path.is_dir() and path.name != "__pycache__" and path.joinpath("sql").is_dir() + ]) _loader_instance: DataDictionaryLoader | None = None diff --git a/sqlspec/data_dictionary/dialects/bigquery/__init__.py b/sqlspec/data_dictionary/dialects/bigquery/__init__.py new file mode 100644 index 000000000..7cef1ccca --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/__init__.py @@ -0,0 +1,15 @@ +"""Dialect configuration for bigquery.""" + +from sqlspec.data_dictionary.dialects.bigquery.config import ( + BIGQUERY_CONFIG, + BIGQUERY_VERSION_PATTERN, + format_bigquery_information_schema_tables, + format_bigquery_schema_prefix, +) + +__all__ = ( + "BIGQUERY_CONFIG", + "BIGQUERY_VERSION_PATTERN", + "format_bigquery_information_schema_tables", + "format_bigquery_schema_prefix", +) diff --git a/sqlspec/data_dictionary/dialects/bigquery.py b/sqlspec/data_dictionary/dialects/bigquery/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/bigquery.py rename to sqlspec/data_dictionary/dialects/bigquery/config.py diff --git a/sqlspec/data_dictionary/dialects/bigquery/sql/columns.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/columns.sql new file mode 100644 index 000000000..352807cea --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/columns.sql @@ -0,0 +1,63 @@ +-- name: by_dataset +-- dialect: bigquery +SELECT + table_catalog, + table_schema, + table_name, + column_name, + ordinal_position, + is_nullable, + data_type, + is_generated, + generation_expression, + is_stored, + is_hidden, + is_partitioning_column, + clustering_ordinal_position, + column_default, + rounding_mode +FROM {columns_table} +WHERE (:schema_name IS NULL OR table_schema = :schema_name) + AND (:table_name IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name, ordinal_position; + +-- name: field_paths_by_dataset +-- dialect: bigquery +SELECT + table_catalog, + table_schema, + table_name, + column_name, + field_path, + data_type, + description, + collation_name, + rounding_mode +FROM {field_paths_table} +WHERE (:schema_name IS NULL OR table_schema = :schema_name) + AND (:table_name IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name, field_path; + +-- name: by_table +-- dialect: bigquery +SELECT + column_name, + data_type, + is_nullable, + column_default +FROM {schema_prefix}INFORMATION_SCHEMA.COLUMNS +WHERE table_name = :table_name + AND (:schema_name IS NULL OR table_schema = :schema_name) +ORDER BY ordinal_position; + +-- name: by_schema +-- dialect: bigquery +SELECT + table_name, + column_name, + data_type, + is_nullable, + column_default +FROM {schema_prefix}INFORMATION_SCHEMA.COLUMNS +WHERE (:schema_name IS NULL OR table_schema = :schema_name) +ORDER BY table_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/bigquery/constraints/by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/bigquery/constraints/by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/constraints.sql diff --git a/sqlspec/data_dictionary/sql/bigquery/datasets/list.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/datasets.sql similarity index 100% rename from sqlspec/data_dictionary/sql/bigquery/datasets/list.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/datasets.sql diff --git a/sqlspec/data_dictionary/sql/bigquery/ddl/table_ddl_by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/ddl.sql similarity index 90% rename from sqlspec/data_dictionary/sql/bigquery/ddl/table_ddl_by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/ddl.sql index be0b0e20f..834743903 100644 --- a/sqlspec/data_dictionary/sql/bigquery/ddl/table_ddl_by_dataset.sql +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/ddl.sql @@ -1,4 +1,4 @@ --- name: table_ddl_by_dataset +-- name: by_object -- dialect: bigquery SELECT table_catalog, diff --git a/sqlspec/data_dictionary/sql/bigquery/dependencies/hints_by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/dependencies.sql similarity index 100% rename from sqlspec/data_dictionary/sql/bigquery/dependencies/hints_by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/dependencies.sql diff --git a/sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/foreign_keys.sql similarity index 94% rename from sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/foreign_keys.sql index 15c123ede..fc9b734c2 100644 --- a/sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: bigquery SELECT kcu.table_name, @@ -16,7 +16,7 @@ JOIN {kcu_table} pk_kcu WHERE kcu.table_name = :table_name AND (:schema_name IS NULL OR kcu.table_schema = :schema_name); --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: bigquery SELECT kcu.table_name, diff --git a/sqlspec/data_dictionary/dialects/bigquery/sql/indexes.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/indexes.sql new file mode 100644 index 000000000..51a4d9379 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/indexes.sql @@ -0,0 +1,59 @@ +-- name: search_by_dataset +-- dialect: bigquery +SELECT + si.index_catalog AS schema_name, + si.table_name, + si.index_name, + ARRAY_AGG(sic.index_field_path ORDER BY sic.index_field_path) AS columns, + FALSE AS is_unique, + FALSE AS is_primary +FROM {search_indexes_table} AS si +LEFT JOIN {search_index_columns_table} AS sic + ON si.index_catalog = sic.index_catalog + AND si.index_schema = sic.index_schema + AND si.table_name = sic.table_name + AND si.index_name = sic.index_name +WHERE (:schema_name IS NULL OR si.index_schema = :schema_name) + AND (:table_name IS NULL OR si.table_name = :table_name) +GROUP BY si.index_catalog, si.table_name, si.index_name +ORDER BY si.table_name, si.index_name; + +-- name: vector_by_dataset +-- dialect: bigquery +SELECT + vi.index_catalog AS schema_name, + vi.table_name, + vi.index_name, + ARRAY_AGG(vic.index_field_path ORDER BY vic.index_field_path) AS columns, + FALSE AS is_unique, + FALSE AS is_primary +FROM {vector_indexes_table} AS vi +LEFT JOIN {vector_index_columns_table} AS vic + ON vi.index_catalog = vic.index_catalog + AND vi.index_schema = vic.index_schema + AND vi.table_name = vic.table_name + AND vi.index_name = vic.index_name +WHERE (:schema_name IS NULL OR vi.index_schema = :schema_name) + AND (:table_name IS NULL OR vi.table_name = :table_name) +GROUP BY vi.index_catalog, vi.table_name, vi.index_name +ORDER BY vi.table_name, vi.index_name; + +-- name: by_table +-- dialect: bigquery +SELECT + NULL AS index_name, + NULL AS table_name, + NULL AS is_unique, + NULL AS is_primary, + NULL AS columns +WHERE FALSE; + +-- name: by_schema +-- dialect: bigquery +SELECT + NULL AS index_name, + NULL AS table_name, + NULL AS is_unique, + NULL AS is_primary, + NULL AS columns +WHERE FALSE; diff --git a/sqlspec/data_dictionary/sql/bigquery/objects/by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/bigquery/objects/by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/bigquery/privileges/by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/bigquery/privileges/by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/privileges.sql diff --git a/sqlspec/data_dictionary/dialects/bigquery/sql/routines.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/routines.sql new file mode 100644 index 000000000..47d38fd3c --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/routines.sql @@ -0,0 +1,50 @@ +-- name: by_dataset +-- dialect: bigquery +SELECT + routine_catalog, + routine_schema, + routine_name, + routine_type, + data_type, + routine_body, + routine_definition, + external_language, + is_deterministic, + security_type, + created, + last_altered +FROM {routines_table} +WHERE (:schema_name IS NULL OR routine_schema = :schema_name) + AND (:routine_name IS NULL OR routine_name = :routine_name) +ORDER BY routine_schema, routine_name; + +-- name: options_by_dataset +-- dialect: bigquery +SELECT + specific_catalog, + specific_schema, + specific_name, + option_name, + option_type, + option_value +FROM {routine_options_table} +WHERE (:schema_name IS NULL OR specific_schema = :schema_name) + AND (:routine_name IS NULL OR specific_name = :routine_name) +ORDER BY specific_schema, specific_name, option_name; + +-- name: parameters_by_dataset +-- dialect: bigquery +SELECT + specific_catalog, + specific_schema, + specific_name, + ordinal_position, + parameter_mode, + is_result, + parameter_name, + data_type, + parameter_default +FROM {parameters_table} +WHERE (:schema_name IS NULL OR specific_schema = :schema_name) + AND (:routine_name IS NULL OR specific_name = :routine_name) +ORDER BY specific_schema, specific_name, ordinal_position; diff --git a/sqlspec/data_dictionary/dialects/bigquery/sql/system.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/system.sql new file mode 100644 index 000000000..1968d84a4 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/system.sql @@ -0,0 +1,59 @@ +-- name: jobs_by_region +-- dialect: bigquery +SELECT + project_id, + project_number, + user_email, + job_id, + job_type, + statement_type, + priority, + creation_time, + start_time, + end_time, + state, + reservation_id, + total_bytes_processed, + total_slot_ms, + cache_hit, + error_result, + query +FROM {jobs_table} +WHERE (:user_email IS NULL OR user_email = :user_email) + AND (:state IS NULL OR state = :state) + AND (:created_after IS NULL OR creation_time >= :created_after) +ORDER BY creation_time DESC +LIMIT :limit; + +-- name: reservations_by_region +-- dialect: bigquery +SELECT + project_id, + project_number, + reservation_name, + slot_capacity, + ignore_idle_slots, + edition, + autoscale, + concurrency, + creation_time, + update_time +FROM {reservations_table} +WHERE (:reservation_name IS NULL OR reservation_name = :reservation_name) +ORDER BY reservation_name; + +-- name: sessions_by_region +-- dialect: bigquery +SELECT + project_id, + project_number, + user_email, + session_id, + creation_time, + expiration_time, + is_active +FROM {sessions_table} +WHERE (:user_email IS NULL OR user_email = :user_email) + AND (:is_active IS NULL OR is_active = :is_active) +ORDER BY creation_time DESC +LIMIT :limit; diff --git a/sqlspec/data_dictionary/dialects/bigquery/sql/tables.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/tables.sql new file mode 100644 index 000000000..9bb0ef815 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/tables.sql @@ -0,0 +1,87 @@ +-- name: options_by_dataset +-- dialect: bigquery +SELECT + table_catalog, + table_schema, + table_name, + option_name, + option_type, + option_value +FROM {table_options_table} +WHERE (:schema_name IS NULL OR table_schema = :schema_name) + AND (:table_name IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name, option_name; + +-- name: partitions_by_dataset +-- dialect: bigquery +SELECT + table_catalog, + table_schema, + table_name, + partition_id, + total_rows, + total_logical_bytes, + last_modified_time, + storage_tier +FROM {partitions_table} +WHERE (:schema_name IS NULL OR table_schema = :schema_name) + AND (:table_name IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name, partition_id; + +-- name: storage_by_dataset +-- dialect: bigquery +SELECT + table_catalog, + table_schema, + table_name, + total_rows, + total_partitions, + total_logical_bytes, + active_logical_bytes, + long_term_logical_bytes, + total_physical_bytes, + active_physical_bytes, + long_term_physical_bytes, + time_travel_physical_bytes, + storage_last_modified_time +FROM {table_storage_table} +WHERE (:schema_name IS NULL OR table_schema = :schema_name) + AND (:table_name IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name; + +-- name: by_schema +-- dialect: bigquery +WITH RECURSIVE dependency_tree AS ( + SELECT + t.table_name, + 0 AS level, + [t.table_name] AS path + FROM {tables_table} t + WHERE t.table_type = 'BASE TABLE' + AND (:schema_name IS NULL OR t.table_schema = :schema_name) + AND NOT EXISTS ( + SELECT 1 + FROM {kcu_table} kcu + JOIN {rc_table} rc ON kcu.constraint_name = rc.constraint_name + WHERE kcu.table_name = t.table_name + AND (:schema_name IS NULL OR kcu.table_schema = :schema_name) + ) + + UNION ALL + + SELECT + kcu.table_name, + dt.level + 1, + ARRAY_CONCAT(dt.path, [kcu.table_name]) + FROM {kcu_table} kcu + JOIN {rc_table} rc ON kcu.constraint_name = rc.constraint_name + JOIN {kcu_table} pk_kcu + ON rc.unique_constraint_name = pk_kcu.constraint_name + AND kcu.ordinal_position = pk_kcu.ordinal_position + JOIN dependency_tree dt ON pk_kcu.table_name = dt.table_name + WHERE kcu.table_name NOT IN UNNEST(dt.path) + AND (:schema_name IS NULL OR kcu.table_schema = :schema_name) +) +SELECT DISTINCT table_name +FROM dependency_tree +ORDER BY level, table_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/version.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/version.sql similarity index 72% rename from sqlspec/data_dictionary/sql/bigquery/version.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/version.sql index 1222c5181..4980c6c2d 100644 --- a/sqlspec/data_dictionary/sql/bigquery/version.sql +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: bigquery SELECT NULL AS version; diff --git a/sqlspec/data_dictionary/sql/bigquery/views/materialized_by_dataset.sql b/sqlspec/data_dictionary/dialects/bigquery/sql/views.sql similarity index 56% rename from sqlspec/data_dictionary/sql/bigquery/views/materialized_by_dataset.sql rename to sqlspec/data_dictionary/dialects/bigquery/sql/views.sql index f30fead91..98f343f3a 100644 --- a/sqlspec/data_dictionary/sql/bigquery/views/materialized_by_dataset.sql +++ b/sqlspec/data_dictionary/dialects/bigquery/sql/views.sql @@ -1,3 +1,17 @@ +-- name: by_dataset +-- dialect: bigquery +SELECT + v.table_catalog, + v.table_schema, + v.table_name, + v.view_definition, + v.check_option, + v.use_standard_sql +FROM {views_table} AS v +WHERE (:schema_name IS NULL OR v.table_schema = :schema_name) + AND (:view_name IS NULL OR v.table_name = :view_name) +ORDER BY v.table_schema, v.table_name; + -- name: materialized_by_dataset -- dialect: bigquery SELECT diff --git a/sqlspec/data_dictionary/dialects/cockroachdb/__init__.py b/sqlspec/data_dictionary/dialects/cockroachdb/__init__.py new file mode 100644 index 000000000..6dcc444c1 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/cockroachdb/__init__.py @@ -0,0 +1,9 @@ +"""Dialect configuration for cockroachdb.""" + +from sqlspec.data_dictionary.dialects.cockroachdb.config import ( + COCKROACHDB_CONFIG, + COCKROACHDB_VERSION_PATTERN, + resolve_cockroachdb_json_type, +) + +__all__ = ("COCKROACHDB_CONFIG", "COCKROACHDB_VERSION_PATTERN", "resolve_cockroachdb_json_type") diff --git a/sqlspec/data_dictionary/dialects/cockroachdb.py b/sqlspec/data_dictionary/dialects/cockroachdb/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/cockroachdb.py rename to sqlspec/data_dictionary/dialects/cockroachdb/config.py diff --git a/sqlspec/data_dictionary/sql/cockroachdb/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/columns.sql similarity index 50% rename from sqlspec/data_dictionary/sql/cockroachdb/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/columns.sql index 48f0a6e83..c10b800c7 100644 --- a/sqlspec/data_dictionary/sql/cockroachdb/columns/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/cockroachdb/sql/columns.sql @@ -16,3 +16,20 @@ FROM information_schema.columns WHERE table_schema = :schema_name AND (:table_name::text IS NULL OR table_name = :table_name) ORDER BY table_schema, table_name, ordinal_position; + +-- name: by_table +-- dialect: cockroachdb +SELECT + a.attname::text AS column_name, + pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, + CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, + pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default +FROM pg_catalog.pg_attribute a +JOIN pg_catalog.pg_class c ON a.attrelid = c.oid +JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid +LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum +WHERE c.relname = :table_name + AND n.nspname = :schema_name + AND a.attnum > 0 + AND NOT a.attisdropped +ORDER BY a.attnum; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/comments/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/comments.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/comments/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/comments.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/constraints/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/constraints/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/constraints.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/crdb_internal/ranges.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/crdb_internal.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/crdb_internal/ranges.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/crdb_internal.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/ddl/by_object.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/ddl.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/ddl/by_object.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/ddl.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/dependencies/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/dependencies.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/dependencies/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/dependencies.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/foreign_keys.sql similarity index 96% rename from sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/foreign_keys.sql index 638f42198..6878b94fe 100644 --- a/sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/cockroachdb/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: cockroachdb SELECT tc.constraint_name::text AS constraint_name, @@ -19,7 +19,7 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = :table_name ORDER BY tc.constraint_name, kcu.column_name; --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: cockroachdb SELECT tc.constraint_name::text AS constraint_name, diff --git a/sqlspec/data_dictionary/dialects/cockroachdb/sql/indexes.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/indexes.sql new file mode 100644 index 000000000..b3ead0eef --- /dev/null +++ b/sqlspec/data_dictionary/dialects/cockroachdb/sql/indexes.sql @@ -0,0 +1,31 @@ +-- name: by_schema +-- dialect: cockroachdb +SELECT + table_schema::text AS schema_name, + table_name::text AS table_name, + index_name::text AS index_name, + column_name::text AS column_name, + non_unique = false AS is_unique, + index_name = 'primary' AS is_primary, + direction::text AS direction, + storing::text AS storing +FROM information_schema.statistics +WHERE table_schema = :schema_name + AND (:table_name::text IS NULL OR table_name = :table_name) +ORDER BY table_schema, table_name, index_name, seq_in_index; + +-- name: by_table +-- dialect: cockroachdb +SELECT + i.relname::text AS index_name, + a.attname::text AS column_name, + ix.indisunique AS is_unique, + ix.indisprimary AS is_primary +FROM pg_catalog.pg_class t +JOIN pg_catalog.pg_namespace n ON t.relnamespace = n.oid +JOIN pg_catalog.pg_index ix ON t.oid = ix.indrelid +JOIN pg_catalog.pg_class i ON i.oid = ix.indexrelid +JOIN pg_catalog.pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) +WHERE t.relname = :table_name + AND n.nspname = :schema_name +ORDER BY i.relname, a.attnum; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/privileges/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/privileges/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/privileges.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/schemas/list.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/schemas/list.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/sequences/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/sequences.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/sequences/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/sequences.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/tables/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/tables.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/tables/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/tables.sql diff --git a/sqlspec/data_dictionary/sql/cockroachdb/version.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/version.sql similarity index 71% rename from sqlspec/data_dictionary/sql/cockroachdb/version.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/version.sql index e470cfb59..39ccd1a04 100644 --- a/sqlspec/data_dictionary/sql/cockroachdb/version.sql +++ b/sqlspec/data_dictionary/dialects/cockroachdb/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: cockroachdb SELECT version(); diff --git a/sqlspec/data_dictionary/sql/cockroachdb/views/by_schema.sql b/sqlspec/data_dictionary/dialects/cockroachdb/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/cockroachdb/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/cockroachdb/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/duckdb/__init__.py b/sqlspec/data_dictionary/dialects/duckdb/__init__.py new file mode 100644 index 000000000..616edc037 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/duckdb/__init__.py @@ -0,0 +1,5 @@ +"""Dialect configuration for duckdb.""" + +from sqlspec.data_dictionary.dialects.duckdb.config import DUCKDB_CONFIG, DUCKDB_VERSION_PATTERN + +__all__ = ("DUCKDB_CONFIG", "DUCKDB_VERSION_PATTERN") diff --git a/sqlspec/data_dictionary/dialects/duckdb.py b/sqlspec/data_dictionary/dialects/duckdb/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/duckdb.py rename to sqlspec/data_dictionary/dialects/duckdb/config.py diff --git a/sqlspec/data_dictionary/sql/duckdb/columns/by_table.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/columns.sql similarity index 50% rename from sqlspec/data_dictionary/sql/duckdb/columns/by_table.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/columns.sql index 090d4624b..7705bfaf1 100644 --- a/sqlspec/data_dictionary/sql/duckdb/columns/by_table.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/columns.sql @@ -1,3 +1,24 @@ +-- name: by_schema +-- dialect: duckdb +SELECT + database_name, + schema_name, + table_name, + column_name, + column_index AS ordinal_position, + data_type, + is_nullable, + column_default, + character_maximum_length AS max_length, + numeric_precision, + numeric_scale, + comment, + internal +FROM duckdb_columns() +WHERE schema_name = COALESCE(:schema_name, current_schema()) + AND NOT internal +ORDER BY table_name, column_index; + -- name: by_table -- dialect: duckdb SELECT diff --git a/sqlspec/data_dictionary/sql/duckdb/constraints/by_table.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/constraints.sql similarity index 51% rename from sqlspec/data_dictionary/sql/duckdb/constraints/by_table.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/constraints.sql index 48a574e3b..3e069e824 100644 --- a/sqlspec/data_dictionary/sql/duckdb/constraints/by_table.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/constraints.sql @@ -1,3 +1,20 @@ +-- name: by_schema +-- dialect: duckdb +SELECT + database_name, + schema_name, + table_name, + constraint_name, + constraint_type, + constraint_text, + expression, + constraint_column_names, + referenced_table, + referenced_column_names +FROM duckdb_constraints() +WHERE schema_name = COALESCE(:schema_name, current_schema()) +ORDER BY table_name, constraint_index; + -- name: by_table -- dialect: duckdb SELECT diff --git a/sqlspec/data_dictionary/sql/duckdb/databases/list.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/databases.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/databases/list.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/databases.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/dependencies/by_schema.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/dependencies.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/dependencies/by_schema.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/dependencies.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/extensions/list.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/extensions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/extensions/list.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/extensions.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/foreign_keys.sql similarity index 95% rename from sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/foreign_keys.sql index 15c8dfad2..4eace98c0 100644 --- a/sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: duckdb SELECT kcu.table_name, @@ -17,7 +17,7 @@ JOIN information_schema.key_column_usage pk_kcu WHERE kcu.table_schema = COALESCE(:schema_name, current_schema()) AND kcu.table_name = :table_name; --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: duckdb SELECT kcu.table_name, diff --git a/sqlspec/data_dictionary/sql/duckdb/functions/by_schema.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/functions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/functions/by_schema.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/functions.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/indexes/by_table.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/indexes.sql similarity index 51% rename from sqlspec/data_dictionary/sql/duckdb/indexes/by_table.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/indexes.sql index e4e243852..473c031d3 100644 --- a/sqlspec/data_dictionary/sql/duckdb/indexes/by_table.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/indexes.sql @@ -1,3 +1,20 @@ +-- name: by_schema +-- dialect: duckdb +SELECT + database_name, + schema_name, + table_name, + index_name, + is_unique, + is_primary, + expressions AS columns, + comment, + tags, + sql AS native_sql +FROM duckdb_indexes() +WHERE schema_name = COALESCE(:schema_name, current_schema()) +ORDER BY table_name, index_name; + -- name: by_table -- dialect: duckdb SELECT diff --git a/sqlspec/data_dictionary/sql/duckdb/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/schemas/list.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/schemas/list.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/sequences/by_schema.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/sequences.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/sequences/by_schema.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/sequences.sql diff --git a/sqlspec/data_dictionary/sql/duckdb/system/settings.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/system.sql similarity index 55% rename from sqlspec/data_dictionary/sql/duckdb/system/settings.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/system.sql index 4494038dc..225856a49 100644 --- a/sqlspec/data_dictionary/sql/duckdb/system/settings.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/system.sql @@ -1,3 +1,13 @@ +-- name: logs +-- dialect: duckdb +SELECT * +FROM duckdb_logs(); + +-- name: memory +-- dialect: duckdb +SELECT * +FROM duckdb_memory(); + -- name: settings -- dialect: duckdb SELECT diff --git a/sqlspec/data_dictionary/sql/duckdb/tables.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/tables.sql similarity index 98% rename from sqlspec/data_dictionary/sql/duckdb/tables.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/tables.sql index a5a0ef04e..b0989a7bc 100644 --- a/sqlspec/data_dictionary/sql/duckdb/tables.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/tables.sql @@ -1,4 +1,4 @@ --- name: tables_by_schema +-- name: by_schema -- dialect: duckdb WITH RECURSIVE dependency_tree AS ( SELECT diff --git a/sqlspec/data_dictionary/sql/duckdb/version.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/version.sql similarity index 73% rename from sqlspec/data_dictionary/sql/duckdb/version.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/version.sql index 0118c32d6..5e4353be4 100644 --- a/sqlspec/data_dictionary/sql/duckdb/version.sql +++ b/sqlspec/data_dictionary/dialects/duckdb/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: duckdb SELECT version() AS version; diff --git a/sqlspec/data_dictionary/sql/duckdb/views/by_schema.sql b/sqlspec/data_dictionary/dialects/duckdb/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/duckdb/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/duckdb/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/mariadb/__init__.py b/sqlspec/data_dictionary/dialects/mariadb/__init__.py new file mode 100644 index 000000000..62b8a4286 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mariadb/__init__.py @@ -0,0 +1,5 @@ +"""MariaDB dialect configuration.""" + +from sqlspec.data_dictionary.dialects.mysql.config import MARIADB_CONFIG + +__all__ = ("MARIADB_CONFIG",) diff --git a/sqlspec/data_dictionary/sql/mariadb/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/columns.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/columns.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/constraints/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/constraints/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/constraints.sql diff --git a/sqlspec/data_dictionary/dialects/mariadb/sql/ddl.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/ddl.sql new file mode 100644 index 000000000..94817bca1 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mariadb/sql/ddl.sql @@ -0,0 +1,27 @@ +-- name: event_by_name +-- dialect: mysql +SELECT 'SHOW CREATE EVENT' AS statement_template; + +-- name: function_by_name +-- dialect: mysql +SELECT 'SHOW CREATE FUNCTION' AS statement_template; + +-- name: procedure_by_name +-- dialect: mysql +SELECT 'SHOW CREATE PROCEDURE' AS statement_template; + +-- name: sequence_by_name +-- dialect: mysql +SELECT 'SHOW CREATE SEQUENCE' AS statement_template; + +-- name: table_by_name +-- dialect: mysql +SELECT 'SHOW CREATE TABLE' AS statement_template; + +-- name: trigger_by_name +-- dialect: mysql +SELECT 'SHOW CREATE TRIGGER' AS statement_template; + +-- name: view_by_name +-- dialect: mysql +SELECT 'SHOW CREATE VIEW' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/events/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/events.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/events/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/events.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/indexes/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/indexes.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/indexes/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/indexes.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/partitions/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/partitions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/partitions/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/partitions.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/plugins/list.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/plugins.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/plugins/list.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/plugins.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/privileges/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/privileges/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/privileges.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/routines/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/routines.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/routines/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/routines.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/schemas/list.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/schemas/list.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/system/performance_schema_tables.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/system.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/system/performance_schema_tables.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/system.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/tables/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/tables.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/tables/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/tables.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/triggers/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/triggers.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/triggers/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/triggers.sql diff --git a/sqlspec/data_dictionary/sql/mariadb/views/by_schema.sql b/sqlspec/data_dictionary/dialects/mariadb/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mariadb/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/mariadb/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/mssql/__init__.py b/sqlspec/data_dictionary/dialects/mssql/__init__.py new file mode 100644 index 000000000..43b098e76 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mssql/__init__.py @@ -0,0 +1,49 @@ +"""Dialect configuration for mssql.""" + +from sqlspec.data_dictionary.dialects.mssql.config import ( + MSSQL_CONFIG, + MSSQL_PRODUCT_VERSION_PATTERN, + MSSQL_VERSION_PATTERN, + build_mssql_metadata_capability_profile, + build_mssql_system_metadata_capability, + build_mssql_system_metadata_result, + build_mssql_table_ddl_result, + extract_mssql_version_value, + get_mssql_data_dictionary_options, + is_mssql_azure_sql, + list_mssql_available_features, + merge_mssql_table_lists, + mssql_supports_greatest_least, + mssql_supports_json_functions, + mssql_supports_native_json, + mssql_supports_string_agg, + mssql_system_metadata_denied, + parse_mssql_engine_edition, + parse_mssql_version_components, + resolve_mssql_feature_flag, + validate_mssql_system_metadata_options, +) + +__all__ = ( + "MSSQL_CONFIG", + "MSSQL_PRODUCT_VERSION_PATTERN", + "MSSQL_VERSION_PATTERN", + "build_mssql_metadata_capability_profile", + "build_mssql_system_metadata_capability", + "build_mssql_system_metadata_result", + "build_mssql_table_ddl_result", + "extract_mssql_version_value", + "get_mssql_data_dictionary_options", + "is_mssql_azure_sql", + "list_mssql_available_features", + "merge_mssql_table_lists", + "mssql_supports_greatest_least", + "mssql_supports_json_functions", + "mssql_supports_native_json", + "mssql_supports_string_agg", + "mssql_system_metadata_denied", + "parse_mssql_engine_edition", + "parse_mssql_version_components", + "resolve_mssql_feature_flag", + "validate_mssql_system_metadata_options", +) diff --git a/sqlspec/data_dictionary/dialects/mssql.py b/sqlspec/data_dictionary/dialects/mssql/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/mssql.py rename to sqlspec/data_dictionary/dialects/mssql/config.py diff --git a/sqlspec/data_dictionary/sql/mssql/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/columns.sql similarity index 50% rename from sqlspec/data_dictionary/sql/mssql/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/columns.sql index f4ccbacfc..5deb549a7 100644 --- a/sqlspec/data_dictionary/sql/mssql/columns/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/columns.sql @@ -51,3 +51,58 @@ OUTER APPLY ( ) AS unique_cols WHERE (:schema_name IS NULL OR s.name = :schema_name) ORDER BY s.name, tab.name, c.column_id; + +-- name: by_table +-- dialect: mssql +SELECT + s.name AS schema_name, + tab.name AS table_name, + c.column_id AS ordinal_position, + c.name AS column_name, + typ.name AS data_type, + CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS is_nullable, + OBJECT_DEFINITION(c.default_object_id) AS column_default, + c.max_length, + c.precision AS numeric_precision, + c.scale AS numeric_scale, + CAST(CASE WHEN pk_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_primary, + CAST(CASE WHEN unique_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_unique, + c.collation_name, + CAST(c.is_sparse AS BIT) AS is_sparse, + CAST(c.is_column_set AS BIT) AS is_column_set, + CAST(c.is_hidden AS BIT) AS is_hidden, + CAST(c.is_masked AS BIT) AS is_masked, + c.encryption_type_desc, + c.encryption_algorithm_name, + c.generated_always_type_desc, + CAST(CASE WHEN cc.object_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_computed, + cc.definition AS computed_definition, + CAST(cc.is_persisted AS BIT) AS is_persisted_computed, + CAST(CASE WHEN ic.object_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_identity, + CONVERT(BIGINT, ic.seed_value) AS identity_seed, + CONVERT(BIGINT, ic.increment_value) AS identity_increment +FROM sys.columns AS c +INNER JOIN sys.types AS typ ON c.user_type_id = typ.user_type_id +INNER JOIN sys.tables AS tab ON c.object_id = tab.object_id +INNER JOIN sys.schemas AS s ON tab.schema_id = s.schema_id +LEFT JOIN sys.computed_columns AS cc ON c.object_id = cc.object_id AND c.column_id = cc.column_id +LEFT JOIN sys.identity_columns AS ic ON c.object_id = ic.object_id AND c.column_id = ic.column_id +OUTER APPLY ( + SELECT TOP 1 idx_col.column_id + FROM sys.indexes AS idx + INNER JOIN sys.index_columns AS idx_col ON idx.object_id = idx_col.object_id AND idx.index_id = idx_col.index_id + WHERE idx.object_id = tab.object_id + AND idx.is_primary_key = 1 + AND idx_col.column_id = c.column_id +) AS pk_cols +OUTER APPLY ( + SELECT TOP 1 idx_col.column_id + FROM sys.indexes AS idx + INNER JOIN sys.index_columns AS idx_col ON idx.object_id = idx_col.object_id AND idx.index_id = idx_col.index_id + WHERE idx.object_id = tab.object_id + AND idx.is_unique = 1 + AND idx_col.column_id = c.column_id +) AS unique_cols +WHERE s.name = :schema_name + AND tab.name = :table_name +ORDER BY c.column_id; diff --git a/sqlspec/data_dictionary/sql/mssql/constraints/by_table.sql b/sqlspec/data_dictionary/dialects/mssql/sql/constraints.sql similarity index 50% rename from sqlspec/data_dictionary/sql/mssql/constraints/by_table.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/constraints.sql index 0494966d2..6829e2a85 100644 --- a/sqlspec/data_dictionary/sql/mssql/constraints/by_table.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/constraints.sql @@ -1,3 +1,46 @@ +-- name: by_schema +-- dialect: mssql +SELECT + s.name AS schema_name, + t.name AS table_name, + kc.name AS constraint_name, + kc.type_desc AS constraint_type, + CAST(kc.is_system_named AS BIT) AS is_system_named, + NULL AS column_name, + NULL AS definition +FROM sys.key_constraints AS kc +INNER JOIN sys.tables AS t ON kc.parent_object_id = t.object_id +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) +UNION ALL +SELECT + s.name AS schema_name, + t.name AS table_name, + cc.name AS constraint_name, + 'CHECK_CONSTRAINT' AS constraint_type, + CAST(cc.is_system_named AS BIT) AS is_system_named, + NULL AS column_name, + cc.definition +FROM sys.check_constraints AS cc +INNER JOIN sys.tables AS t ON cc.parent_object_id = t.object_id +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) +UNION ALL +SELECT + s.name AS schema_name, + t.name AS table_name, + dc.name AS constraint_name, + 'DEFAULT_CONSTRAINT' AS constraint_type, + CAST(dc.is_system_named AS BIT) AS is_system_named, + c.name AS column_name, + dc.definition +FROM sys.default_constraints AS dc +INNER JOIN sys.tables AS t ON dc.parent_object_id = t.object_id +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +INNER JOIN sys.columns AS c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) +ORDER BY schema_name, table_name, constraint_name; + -- name: by_table -- dialect: mssql SELECT diff --git a/sqlspec/data_dictionary/sql/mssql/ddl/table_inputs_by_table.sql b/sqlspec/data_dictionary/dialects/mssql/sql/ddl.sql similarity index 52% rename from sqlspec/data_dictionary/sql/mssql/ddl/table_inputs_by_table.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/ddl.sql index 431187431..c0b431677 100644 --- a/sqlspec/data_dictionary/sql/mssql/ddl/table_inputs_by_table.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/ddl.sql @@ -1,3 +1,44 @@ +-- name: index_inputs_by_table +-- dialect: mssql +/* sqlspec:mssql:ddl_index_inputs */ +SELECT + s.name AS schema_name, + t.name AS table_name, + i.name AS index_name, + i.type_desc, + CAST(i.is_unique AS BIT) AS is_unique, + CAST(i.has_filter AS BIT) AS has_filter, + i.filter_definition, + STUFF(( + SELECT ',' + c2.name + FROM sys.index_columns AS ic2 + INNER JOIN sys.columns AS c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id + WHERE ic2.object_id = i.object_id + AND ic2.index_id = i.index_id + AND ic2.is_included_column = 0 + ORDER BY ic2.key_ordinal + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns, + STUFF(( + SELECT ',' + c3.name + FROM sys.index_columns AS ic3 + INNER JOIN sys.columns AS c3 ON ic3.object_id = c3.object_id AND ic3.column_id = c3.column_id + WHERE ic3.object_id = i.object_id + AND ic3.index_id = i.index_id + AND ic3.is_included_column = 1 + ORDER BY ic3.index_column_id + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS included_columns +FROM sys.indexes AS i +INNER JOIN sys.tables AS t ON i.object_id = t.object_id +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +WHERE s.name = :schema_name + AND t.name = :table_name + AND i.name IS NOT NULL + AND i.is_primary_key = 0 + AND i.is_unique_constraint = 0 +ORDER BY i.name; + -- name: table_inputs_by_table -- dialect: mssql /* sqlspec:mssql:ddl_table_inputs */ diff --git a/sqlspec/data_dictionary/sql/mssql/dependencies/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/dependencies.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/dependencies/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/dependencies.sql diff --git a/sqlspec/data_dictionary/sql/mssql/extended_properties/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/extended_properties.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/extended_properties/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/extended_properties.sql diff --git a/sqlspec/data_dictionary/sql/mssql/foreign_keys.sql b/sqlspec/data_dictionary/dialects/mssql/sql/foreign_keys.sql similarity index 96% rename from sqlspec/data_dictionary/sql/mssql/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/foreign_keys.sql index 7f55083d3..3e27eb1c2 100644 --- a/sqlspec/data_dictionary/sql/mssql/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: mssql SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name, @@ -18,7 +18,7 @@ WHERE OBJECT_SCHEMA_NAME(fk.parent_object_id) = :schema_name AND OBJECT_NAME(fk.parent_object_id) = :table_name ORDER BY fk.name, fkc.constraint_column_id; --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: mssql SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name, diff --git a/sqlspec/data_dictionary/sql/mssql/indexes/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/indexes.sql similarity index 50% rename from sqlspec/data_dictionary/sql/mssql/indexes/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/indexes.sql index e51c8b375..768c6b650 100644 --- a/sqlspec/data_dictionary/sql/mssql/indexes/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/indexes.sql @@ -40,3 +40,47 @@ LEFT JOIN sys.partition_schemes AS ps ON ds.data_space_id = ps.data_space_id WHERE (:schema_name IS NULL OR s.name = :schema_name) AND i.name IS NOT NULL ORDER BY s.name, t.name, i.name; + +-- name: by_table +-- dialect: mssql +SELECT + s.name AS schema_name, + t.name AS table_name, + i.name AS index_name, + i.type_desc, + CAST(i.is_unique AS BIT) AS is_unique, + CAST(i.is_primary_key AS BIT) AS is_primary, + CAST(i.is_unique_constraint AS BIT) AS is_unique_constraint, + CAST(i.has_filter AS BIT) AS has_filter, + i.filter_definition, + ds.name AS data_space_name, + ps.name AS partition_scheme_name, + STUFF(( + SELECT ',' + c2.name + FROM sys.index_columns AS ic2 + INNER JOIN sys.columns AS c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id + WHERE ic2.object_id = i.object_id + AND ic2.index_id = i.index_id + AND ic2.is_included_column = 0 + ORDER BY ic2.key_ordinal + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns, + STUFF(( + SELECT ',' + c3.name + FROM sys.index_columns AS ic3 + INNER JOIN sys.columns AS c3 ON ic3.object_id = c3.object_id AND ic3.column_id = c3.column_id + WHERE ic3.object_id = i.object_id + AND ic3.index_id = i.index_id + AND ic3.is_included_column = 1 + ORDER BY ic3.index_column_id + FOR XML PATH(''), TYPE + ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS included_columns +FROM sys.indexes AS i +INNER JOIN sys.tables AS t ON i.object_id = t.object_id +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +LEFT JOIN sys.data_spaces AS ds ON i.data_space_id = ds.data_space_id +LEFT JOIN sys.partition_schemes AS ps ON ds.data_space_id = ps.data_space_id +WHERE s.name = :schema_name + AND t.name = :table_name + AND i.name IS NOT NULL +ORDER BY i.name; diff --git a/sqlspec/data_dictionary/sql/mssql/modules/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/modules.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/modules/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/modules.sql diff --git a/sqlspec/data_dictionary/sql/mssql/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/mssql/permissions/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/permissions.sql similarity index 61% rename from sqlspec/data_dictionary/sql/mssql/permissions/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/permissions.sql index a089b66b8..28c51137f 100644 --- a/sqlspec/data_dictionary/sql/mssql/permissions/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/permissions.sql @@ -18,3 +18,14 @@ LEFT JOIN sys.database_principals AS grantee ON perm.grantee_principal_id = gran LEFT JOIN sys.database_principals AS grantor ON perm.grantor_principal_id = grantor.principal_id WHERE (:schema_name IS NULL OR s.name = :schema_name) ORDER BY s.name, o.name, grantee.name, perm.permission_name; + +-- name: role_members +-- dialect: mssql +SELECT + role_principal.name AS role_name, + member_principal.name AS member_name, + member_principal.type_desc AS member_type +FROM sys.database_role_members AS drm +INNER JOIN sys.database_principals AS role_principal ON drm.role_principal_id = role_principal.principal_id +INNER JOIN sys.database_principals AS member_principal ON drm.member_principal_id = member_principal.principal_id +ORDER BY role_principal.name, member_principal.name; diff --git a/sqlspec/data_dictionary/sql/mssql/routines/parameters_by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/routines.sql similarity index 61% rename from sqlspec/data_dictionary/sql/mssql/routines/parameters_by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/routines.sql index bc3386f49..95ff6f63e 100644 --- a/sqlspec/data_dictionary/sql/mssql/routines/parameters_by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/routines.sql @@ -1,3 +1,21 @@ +-- name: by_schema +-- dialect: mssql +SELECT + DB_NAME() AS catalog_name, + s.name AS schema_name, + p.name AS routine_name, + p.type AS routine_type, + p.type_desc, + sm.definition, + p.create_date, + p.modify_date +FROM sys.procedures AS p +INNER JOIN sys.schemas AS s ON p.schema_id = s.schema_id +LEFT JOIN sys.sql_modules AS sm ON p.object_id = sm.object_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) + AND p.is_ms_shipped = 0 +ORDER BY s.name, p.name; + -- name: parameters_by_schema -- dialect: mssql SELECT diff --git a/sqlspec/data_dictionary/sql/mssql/schemas/list.sql b/sqlspec/data_dictionary/dialects/mssql/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/schemas/list.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/mssql/sequences/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/sequences.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/sequences/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/sequences.sql diff --git a/sqlspec/data_dictionary/sql/mssql/storage/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/storage.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/storage/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/storage.sql diff --git a/sqlspec/data_dictionary/sql/mssql/system/query_store_runtime.sql b/sqlspec/data_dictionary/dialects/mssql/sql/system.sql similarity index 55% rename from sqlspec/data_dictionary/sql/mssql/system/query_store_runtime.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/system.sql index c3ab2dc9e..6ef02fad9 100644 --- a/sqlspec/data_dictionary/sql/mssql/system/query_store_runtime.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/system.sql @@ -1,3 +1,24 @@ +-- name: dmv_exec_requests +-- dialect: mssql +/* sqlspec:mssql:dmv_exec_requests */ +SELECT + req.session_id, + sess.login_name, + req.status, + req.command, + req.cpu_time, + req.total_elapsed_time, + req.logical_reads, + req.reads, + req.writes, + DB_NAME(req.database_id) AS database_name, + txt.text AS sql_text +FROM sys.dm_exec_requests AS req +INNER JOIN sys.dm_exec_sessions AS sess ON req.session_id = sess.session_id +OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS txt +WHERE req.session_id <> @@SPID +ORDER BY req.total_elapsed_time DESC; + -- name: query_store_runtime -- dialect: mssql /* sqlspec:mssql:query_store_runtime */ diff --git a/sqlspec/data_dictionary/dialects/mssql/sql/tables.sql b/sqlspec/data_dictionary/dialects/mssql/sql/tables.sql new file mode 100644 index 000000000..ac5809577 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mssql/sql/tables.sql @@ -0,0 +1,95 @@ +-- name: all_by_schema +-- dialect: mssql +SELECT + s.name AS schema_name, + t.name AS table_name, + 'BASE TABLE' AS table_type, + DB_NAME() AS table_catalog, + t.create_date, + t.modify_date, + CAST(t.is_memory_optimized AS BIT) AS is_memory_optimized, + CAST(t.temporal_type AS INT) AS temporal_type, + t.temporal_type_desc +FROM sys.tables AS t +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) +ORDER BY s.name, t.name; + +-- name: by_schema +-- dialect: mssql +WITH dependency_tree AS ( + SELECT + s.name AS schema_name, + t.name AS table_name, + t.object_id, + 0 AS level, + CAST(CONCAT('|', t.object_id, '|') AS NVARCHAR(MAX)) AS path + FROM sys.tables AS t + INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id + WHERE (:schema_name IS NULL OR s.name = :schema_name) + AND NOT EXISTS ( + SELECT 1 + FROM sys.foreign_keys AS fk + WHERE fk.parent_object_id = t.object_id + ) + + UNION ALL + + SELECT + child_schema.name AS schema_name, + child_table.name AS table_name, + child_table.object_id, + dependency_tree.level + 1 AS level, + CAST(CONCAT(dependency_tree.path, child_table.object_id, '|') AS NVARCHAR(MAX)) AS path + FROM sys.foreign_keys AS fk + INNER JOIN sys.tables AS child_table ON fk.parent_object_id = child_table.object_id + INNER JOIN sys.schemas AS child_schema ON child_table.schema_id = child_schema.schema_id + INNER JOIN dependency_tree ON fk.referenced_object_id = dependency_tree.object_id + WHERE (:schema_name IS NULL OR child_schema.name = :schema_name) + AND CHARINDEX(CONCAT('|', child_table.object_id, '|'), dependency_tree.path) = 0 +) +SELECT + schema_name, + table_name, + 'BASE TABLE' AS table_type, + DB_NAME() AS table_catalog, + MAX(level) AS level +FROM dependency_tree +GROUP BY schema_name, table_name +ORDER BY level, schema_name, table_name; + +-- name: details_by_table +-- dialect: mssql +SELECT + DB_NAME() AS catalog_name, + s.name AS schema_name, + t.name AS table_name, + 'BASE TABLE' AS table_type, + t.create_date, + t.modify_date, + CAST(t.is_memory_optimized AS BIT) AS is_memory_optimized, + CAST(t.durability AS INT) AS durability, + t.durability_desc, + CAST(t.temporal_type AS INT) AS temporal_type, + t.temporal_type_desc, + history_schema.name AS history_schema_name, + history_table.name AS history_table_name +FROM sys.tables AS t +INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id +LEFT JOIN sys.tables AS history_table ON t.history_table_id = history_table.object_id +LEFT JOIN sys.schemas AS history_schema ON history_table.schema_id = history_schema.schema_id +WHERE s.name = :schema_name + AND t.name = :table_name +ORDER BY s.name, t.name; + +-- name: names_by_schema +-- dialect: mssql +SELECT + s.name AS schema_name, + t.name AS table_name, + t.create_date, + t.modify_date +FROM sys.tables t +INNER JOIN sys.schemas s ON t.schema_id = s.schema_id +WHERE (:schema_name IS NULL OR s.name = :schema_name) +ORDER BY s.name, t.name; diff --git a/sqlspec/data_dictionary/sql/mssql/triggers/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/triggers.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/triggers/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/triggers.sql diff --git a/sqlspec/data_dictionary/sql/mssql/version.sql b/sqlspec/data_dictionary/dialects/mssql/sql/version.sql similarity index 94% rename from sqlspec/data_dictionary/sql/mssql/version.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/version.sql index 9ddb4a373..99441a3a8 100644 --- a/sqlspec/data_dictionary/sql/mssql/version.sql +++ b/sqlspec/data_dictionary/dialects/mssql/sql/version.sql @@ -1,4 +1,4 @@ --- name: version +-- name: current -- dialect: mssql SELECT @@VERSION AS version_string, diff --git a/sqlspec/data_dictionary/sql/mssql/views/by_schema.sql b/sqlspec/data_dictionary/dialects/mssql/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mssql/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/mssql/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/mysql/__init__.py b/sqlspec/data_dictionary/dialects/mysql/__init__.py new file mode 100644 index 000000000..1101d3537 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mysql/__init__.py @@ -0,0 +1,31 @@ +"""Dialect configuration for mysql.""" + +from sqlspec.data_dictionary.dialects.mysql.config import ( + MARIADB_CONFIG, + MYSQL_CONFIG, + MYSQL_VERSION_PATTERN, + MySQLEngineVersion, + build_mysql_metadata_capability_profile, + build_mysql_show_create_statement, + build_mysql_system_metadata_capability, + format_mysql_identifier, + make_mysql_ddl_result, + mysql_system_metadata_query_name, + parse_mysql_engine_version, + resolve_mysql_json_type, +) + +__all__ = ( + "MARIADB_CONFIG", + "MYSQL_CONFIG", + "MYSQL_VERSION_PATTERN", + "MySQLEngineVersion", + "build_mysql_metadata_capability_profile", + "build_mysql_show_create_statement", + "build_mysql_system_metadata_capability", + "format_mysql_identifier", + "make_mysql_ddl_result", + "mysql_system_metadata_query_name", + "parse_mysql_engine_version", + "resolve_mysql_json_type", +) diff --git a/sqlspec/data_dictionary/dialects/mysql.py b/sqlspec/data_dictionary/dialects/mysql/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/mysql.py rename to sqlspec/data_dictionary/dialects/mysql/config.py diff --git a/sqlspec/data_dictionary/sql/mysql/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/columns.sql similarity index 62% rename from sqlspec/data_dictionary/sql/mysql/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/columns.sql index 2b4046d37..d629a0e84 100644 --- a/sqlspec/data_dictionary/sql/mysql/columns/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mysql/sql/columns.sql @@ -21,3 +21,15 @@ SELECT FROM information_schema.columns WHERE table_schema = COALESCE(:schema_name, DATABASE()) ORDER BY table_schema, table_name, ordinal_position; + +-- name: by_table +-- dialect: mysql +SELECT + column_name AS `column_name`, + data_type AS `data_type`, + is_nullable AS `is_nullable`, + column_default AS `column_default` +FROM information_schema.columns +WHERE table_name = :table_name + AND table_schema = COALESCE(:schema_name, DATABASE()) +ORDER BY ordinal_position; diff --git a/sqlspec/data_dictionary/sql/mysql/components/list.sql b/sqlspec/data_dictionary/dialects/mysql/sql/components.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/components/list.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/components.sql diff --git a/sqlspec/data_dictionary/sql/mysql/constraints/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/constraints/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/constraints.sql diff --git a/sqlspec/data_dictionary/dialects/mysql/sql/ddl.sql b/sqlspec/data_dictionary/dialects/mysql/sql/ddl.sql new file mode 100644 index 000000000..bfe0ee3df --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mysql/sql/ddl.sql @@ -0,0 +1,23 @@ +-- name: event_by_name +-- dialect: mysql +SELECT 'SHOW CREATE EVENT' AS statement_template; + +-- name: function_by_name +-- dialect: mysql +SELECT 'SHOW CREATE FUNCTION' AS statement_template; + +-- name: procedure_by_name +-- dialect: mysql +SELECT 'SHOW CREATE PROCEDURE' AS statement_template; + +-- name: table_by_name +-- dialect: mysql +SELECT 'SHOW CREATE TABLE' AS statement_template; + +-- name: trigger_by_name +-- dialect: mysql +SELECT 'SHOW CREATE TRIGGER' AS statement_template; + +-- name: view_by_name +-- dialect: mysql +SELECT 'SHOW CREATE VIEW' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/events/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/events.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/events/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/events.sql diff --git a/sqlspec/data_dictionary/sql/mysql/foreign_keys.sql b/sqlspec/data_dictionary/dialects/mysql/sql/foreign_keys.sql similarity index 93% rename from sqlspec/data_dictionary/sql/mysql/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/foreign_keys.sql index aa594075a..791c455c1 100644 --- a/sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/mysql/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: mysql SELECT table_name AS `table_name`, @@ -13,7 +13,7 @@ WHERE referenced_table_name IS NOT NULL AND table_name = :table_name AND table_schema = COALESCE(:schema_name, DATABASE()); --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: mysql SELECT table_name AS `table_name`, diff --git a/sqlspec/data_dictionary/sql/mysql/indexes/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/indexes.sql similarity index 58% rename from sqlspec/data_dictionary/sql/mysql/indexes/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/indexes.sql index eb821f243..a0b8d68c0 100644 --- a/sqlspec/data_dictionary/sql/mysql/indexes/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/mysql/sql/indexes.sql @@ -17,3 +17,17 @@ WHERE table_schema = COALESCE(:schema_name, DATABASE()) AND (:table_name IS NULL OR table_name = :table_name) GROUP BY table_schema, table_name, index_name, non_unique, index_type, is_visible, index_comment ORDER BY table_schema, table_name, index_name; + +-- name: by_table +-- dialect: mysql +SELECT + s.index_name AS index_name, + s.table_name AS table_name, + CASE WHEN s.non_unique = 0 THEN 1 ELSE 0 END AS is_unique, + CASE WHEN s.index_name = 'PRIMARY' THEN 1 ELSE 0 END AS is_primary, + GROUP_CONCAT(s.column_name ORDER BY s.seq_in_index) AS columns +FROM information_schema.statistics s +WHERE s.table_schema = COALESCE(:schema_name, DATABASE()) + AND s.table_name = :table_name +GROUP BY s.index_name, s.table_name, s.non_unique +ORDER BY s.index_name; diff --git a/sqlspec/data_dictionary/sql/mysql/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/mysql/partitions/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/partitions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/partitions/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/partitions.sql diff --git a/sqlspec/data_dictionary/sql/mysql/plugins/list.sql b/sqlspec/data_dictionary/dialects/mysql/sql/plugins.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/plugins/list.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/plugins.sql diff --git a/sqlspec/data_dictionary/sql/mysql/privileges/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/privileges/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/privileges.sql diff --git a/sqlspec/data_dictionary/sql/mysql/routines/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/routines.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/routines/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/routines.sql diff --git a/sqlspec/data_dictionary/sql/mysql/schemas/list.sql b/sqlspec/data_dictionary/dialects/mysql/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/schemas/list.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/mysql/system/sys_schema_table_statistics.sql b/sqlspec/data_dictionary/dialects/mysql/sql/system.sql similarity index 53% rename from sqlspec/data_dictionary/sql/mysql/system/sys_schema_table_statistics.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/system.sql index c8496e708..0b4765a19 100644 --- a/sqlspec/data_dictionary/sql/mysql/system/sys_schema_table_statistics.sql +++ b/sqlspec/data_dictionary/dialects/mysql/sql/system.sql @@ -1,3 +1,16 @@ +-- name: performance_schema_tables +-- dialect: mysql +SELECT + table_schema, + table_name, + table_rows, + avg_row_length, + data_length, + index_length +FROM information_schema.tables +WHERE table_schema = 'performance_schema' +ORDER BY table_name; + -- name: sys_schema_table_statistics -- dialect: mysql SELECT diff --git a/sqlspec/data_dictionary/dialects/mysql/sql/tables.sql b/sqlspec/data_dictionary/dialects/mysql/sql/tables.sql new file mode 100644 index 000000000..2af31015e --- /dev/null +++ b/sqlspec/data_dictionary/dialects/mysql/sql/tables.sql @@ -0,0 +1,62 @@ +-- name: by_schema +-- dialect: mysql +WITH RECURSIVE dependency_tree AS ( + SELECT + table_name, + 0 AS level, + CAST(table_name AS CHAR(4000)) AS path + FROM information_schema.tables AS root_table + WHERE root_table.table_type = 'BASE TABLE' + AND root_table.table_schema = COALESCE(:schema_name, DATABASE()) + AND NOT EXISTS ( + SELECT 1 + FROM information_schema.key_column_usage AS root_key + WHERE root_key.table_name = root_table.table_name + AND root_key.table_schema = root_table.table_schema + AND root_key.referenced_table_name IS NOT NULL + ) + + UNION ALL + + SELECT + child_key.table_name, + dependency_tree.level + 1, + CONCAT(dependency_tree.path, ',', child_key.table_name) + FROM information_schema.key_column_usage AS child_key + JOIN dependency_tree ON child_key.referenced_table_name = dependency_tree.table_name + WHERE child_key.table_schema = COALESCE(:schema_name, DATABASE()) + AND child_key.referenced_table_name IS NOT NULL + AND NOT FIND_IN_SET(child_key.table_name, dependency_tree.path) +), dependency_levels AS ( + SELECT table_name, MIN(level) AS dependency_level + FROM dependency_tree + GROUP BY table_name +) +SELECT + catalog_table.table_schema AS schema_name, + CAST(catalog_table.table_name AS CHAR) AS table_name, + catalog_table.table_type AS table_type, + catalog_table.engine AS engine, + catalog_table.version AS version, + catalog_table.row_format AS row_format, + catalog_table.table_rows AS table_rows, + catalog_table.avg_row_length AS avg_row_length, + catalog_table.data_length AS data_length, + catalog_table.max_data_length AS max_data_length, + catalog_table.index_length AS index_length, + catalog_table.data_free AS data_free, + catalog_table.auto_increment AS auto_increment, + catalog_table.create_time AS create_time, + catalog_table.update_time AS update_time, + catalog_table.check_time AS check_time, + catalog_table.table_collation AS table_collation, + catalog_table.checksum AS checksum, + catalog_table.create_options AS create_options, + catalog_table.table_comment AS table_comment, + COALESCE(dependency_levels.dependency_level, 0) AS dependency_level, + COALESCE(dependency_levels.dependency_level, 0) AS level +FROM information_schema.tables AS catalog_table +LEFT JOIN dependency_levels ON dependency_levels.table_name = catalog_table.table_name +WHERE catalog_table.table_schema = COALESCE(:schema_name, DATABASE()) + AND (:table_name IS NULL OR catalog_table.table_name = :table_name) +ORDER BY dependency_level, catalog_table.table_name; diff --git a/sqlspec/data_dictionary/sql/mysql/triggers/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/triggers.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/triggers/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/triggers.sql diff --git a/sqlspec/data_dictionary/sql/mysql/version.sql b/sqlspec/data_dictionary/dialects/mysql/sql/version.sql similarity index 73% rename from sqlspec/data_dictionary/sql/mysql/version.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/version.sql index fabef269c..54f67da8f 100644 --- a/sqlspec/data_dictionary/sql/mysql/version.sql +++ b/sqlspec/data_dictionary/dialects/mysql/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: mysql SELECT VERSION() AS version; diff --git a/sqlspec/data_dictionary/sql/mysql/views/by_schema.sql b/sqlspec/data_dictionary/dialects/mysql/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/mysql/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/mysql/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/oracle/__init__.py b/sqlspec/data_dictionary/dialects/oracle/__init__.py new file mode 100644 index 000000000..02e716668 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/oracle/__init__.py @@ -0,0 +1,39 @@ +"""Dialect configuration for oracle.""" + +from sqlspec.data_dictionary.dialects.oracle.config import ( + ORACLE_CONFIG, + ORACLE_JSON_STORAGE_BLOB_JSON, + ORACLE_JSON_STORAGE_BLOB_PLAIN, + ORACLE_JSON_STORAGE_NATIVE, + ORACLE_VERSION_PATTERN, + extract_oracle_version_value, + list_oracle_available_features, + merge_oracle_table_lists, + oracle_supports_json_blob, + oracle_supports_native_json, + oracle_supports_oson_blob, + parse_oracle_compatible_major, + parse_oracle_version_components, + resolve_oracle_feature_flag, + resolve_oracle_json_storage, + resolve_oracle_json_type, +) + +__all__ = ( + "ORACLE_CONFIG", + "ORACLE_JSON_STORAGE_BLOB_JSON", + "ORACLE_JSON_STORAGE_BLOB_PLAIN", + "ORACLE_JSON_STORAGE_NATIVE", + "ORACLE_VERSION_PATTERN", + "extract_oracle_version_value", + "list_oracle_available_features", + "merge_oracle_table_lists", + "oracle_supports_json_blob", + "oracle_supports_native_json", + "oracle_supports_oson_blob", + "parse_oracle_compatible_major", + "parse_oracle_version_components", + "resolve_oracle_feature_flag", + "resolve_oracle_json_storage", + "resolve_oracle_json_type", +) diff --git a/sqlspec/data_dictionary/dialects/oracle.py b/sqlspec/data_dictionary/dialects/oracle/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/oracle.py rename to sqlspec/data_dictionary/dialects/oracle/config.py diff --git a/sqlspec/data_dictionary/sql/oracle/arguments/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/arguments.sql similarity index 96% rename from sqlspec/data_dictionary/sql/oracle/arguments/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/arguments.sql index 7a3e3db7d..3af760b9f 100644 --- a/sqlspec/data_dictionary/sql/oracle/arguments/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/arguments.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/columns/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/columns.sql similarity index 68% rename from sqlspec/data_dictionary/sql/oracle/columns/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/columns.sql index 48a88fc9b..0b7115b8c 100644 --- a/sqlspec/data_dictionary/sql/oracle/columns/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/columns.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT c.owner AS schema_name, @@ -28,3 +28,19 @@ LEFT JOIN all_col_comments cc WHERE c.owner = COALESCE(:schema_name, USER) AND (:table_name IS NULL OR c.table_name = :table_name) ORDER BY c.owner, c.table_name, c.internal_column_id; + +-- name: by_table +-- dialect: oracle +SELECT + column_name AS column_name, + data_type AS data_type, + nullable AS is_nullable, + data_default AS column_default, + column_id AS ordinal_position, + hidden_column, + virtual_column, + identity_column +FROM all_tab_cols +WHERE owner = COALESCE(:schema_name, USER) + AND table_name = :table_name +ORDER BY column_id; diff --git a/sqlspec/data_dictionary/sql/oracle/comments/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/comments.sql similarity index 96% rename from sqlspec/data_dictionary/sql/oracle/comments/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/comments.sql index 01dbed6f5..9ce8845cf 100644 --- a/sqlspec/data_dictionary/sql/oracle/comments/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/comments.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/constraints/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/constraints.sql similarity index 98% rename from sqlspec/data_dictionary/sql/oracle/constraints/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/constraints.sql index e67d573c5..5e05c1915 100644 --- a/sqlspec/data_dictionary/sql/oracle/constraints/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/constraints.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT c.owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/ddl/dbms_metadata.sql b/sqlspec/data_dictionary/dialects/oracle/sql/ddl.sql similarity index 81% rename from sqlspec/data_dictionary/sql/oracle/ddl/dbms_metadata.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/ddl.sql index d4bb79d57..a2e006118 100644 --- a/sqlspec/data_dictionary/sql/oracle/ddl/dbms_metadata.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/ddl.sql @@ -1,4 +1,4 @@ --- name: dbms_metadata +-- name: by_object -- dialect: oracle SELECT DBMS_METADATA.GET_DDL(:object_type, :object_name, :owner) AS ddl FROM dual; diff --git a/sqlspec/data_dictionary/sql/oracle/dependencies/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/dependencies.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/dependencies/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/dependencies.sql index 5e6d3e5d7..c310236d3 100644 --- a/sqlspec/data_dictionary/sql/oracle/dependencies/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/dependencies.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/foreign_keys.sql b/sqlspec/data_dictionary/dialects/oracle/sql/foreign_keys.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/foreign_keys.sql index 918b9a3fa..fce3cdbf2 100644 --- a/sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: oracle SELECT c.table_name, @@ -23,7 +23,7 @@ WHERE c.constraint_type = 'R' AND c.owner = COALESCE(:schema_name, USER) AND (:table_name IS NULL OR c.table_name = :table_name); --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: oracle SELECT c.table_name, diff --git a/sqlspec/data_dictionary/sql/oracle/grants/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/grants.sql similarity index 97% rename from sqlspec/data_dictionary/sql/oracle/grants/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/grants.sql index 8de0b62ca..f889201e5 100644 --- a/sqlspec/data_dictionary/sql/oracle/grants/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/grants.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/indexes/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/indexes.sql similarity index 64% rename from sqlspec/data_dictionary/sql/oracle/indexes/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/indexes.sql index 7c26385df..e17d28a92 100644 --- a/sqlspec/data_dictionary/sql/oracle/indexes/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/indexes.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT i.owner AS schema_name, @@ -53,3 +53,26 @@ GROUP BY i.avg_data_blocks_per_key, i.clustering_factor ORDER BY i.owner, i.table_name, i.index_name; + +-- name: by_table +-- dialect: oracle +SELECT + i.index_name, + i.table_name AS table_name, + CASE WHEN i.uniqueness = 'UNIQUE' THEN 1 ELSE 0 END AS is_unique, + CASE + WHEN MAX(CASE WHEN c.constraint_type = 'P' THEN 1 ELSE 0 END) = 1 THEN 1 + ELSE 0 + END AS is_primary, + LISTAGG(ic.column_name, ',') WITHIN GROUP (ORDER BY ic.column_position) AS columns +FROM all_indexes i +JOIN all_ind_columns ic + ON i.owner = ic.index_owner + AND i.index_name = ic.index_name +LEFT JOIN all_constraints c + ON c.owner = i.owner + AND c.index_name = i.index_name + AND c.constraint_type = 'P' +WHERE i.table_name = :table_name + AND i.owner = COALESCE(:schema_name, USER) +GROUP BY i.index_name, i.table_name, i.uniqueness; diff --git a/sqlspec/data_dictionary/sql/oracle/lob_storage/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/lob_storage.sql similarity index 96% rename from sqlspec/data_dictionary/sql/oracle/lob_storage/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/lob_storage.sql index 28ba1cadc..43531ec3b 100644 --- a/sqlspec/data_dictionary/sql/oracle/lob_storage/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/lob_storage.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/materialized_views/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/materialized_views.sql similarity index 96% rename from sqlspec/data_dictionary/sql/oracle/materialized_views/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/materialized_views.sql index d2ae6181a..8c3a2fa79 100644 --- a/sqlspec/data_dictionary/sql/oracle/materialized_views/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/materialized_views.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/objects/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/objects.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/objects/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/objects.sql index 96ce3782a..f27eeb9fe 100644 --- a/sqlspec/data_dictionary/sql/oracle/objects/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/objects.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/partitions/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/partitions.sql similarity index 97% rename from sqlspec/data_dictionary/sql/oracle/partitions/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/partitions.sql index d98280774..506d991fb 100644 --- a/sqlspec/data_dictionary/sql/oracle/partitions/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/partitions.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT table_owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/routines/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/routines.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/routines/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/routines.sql index 62fe7025e..60195947d 100644 --- a/sqlspec/data_dictionary/sql/oracle/routines/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/routines.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/schemas/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/schemas.sql similarity index 92% rename from sqlspec/data_dictionary/sql/oracle/schemas/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/schemas.sql index dfbc465f7..b941a2f83 100644 --- a/sqlspec/data_dictionary/sql/oracle/schemas/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/schemas.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT username AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/sequences/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/sequences.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/sequences/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/sequences.sql index cc22b3f36..98cd00e33 100644 --- a/sqlspec/data_dictionary/sql/oracle/sequences/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/sequences.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT sequence_owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/source/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/source.sql similarity index 93% rename from sqlspec/data_dictionary/sql/oracle/source/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/source.sql index 41bef31bd..ad26607ae 100644 --- a/sqlspec/data_dictionary/sql/oracle/source/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/source.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/dialects/oracle/sql/system.sql b/sqlspec/data_dictionary/dialects/oracle/sql/system.sql new file mode 100644 index 000000000..9972e45c8 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/oracle/sql/system.sql @@ -0,0 +1,29 @@ +-- name: awr +-- dialect: oracle +SELECT + :acknowledge_license AS license_acknowledged, + :include_diagnostics AS diagnostics_enabled, + 'DBA_HIST_SNAPSHOT' AS required_view, + 'AWR/ASH/ADDM and DBA_HIST access requires explicit opt-in, privileges, and license acknowledgement.' AS warning +FROM dual +WHERE :include_diagnostics = 1 + AND :acknowledge_license = 1; + +-- name: no_diagnostics +-- dialect: oracle +SELECT + 0 AS diagnostics_enabled, + 'disabled' AS diagnostics_mode, + 'Oracle diagnostics, AWR/ASH/ADDM, Statspack, and DBA_HIST queries are disabled by default.' AS warning +FROM dual; + +-- name: statspack +-- dialect: oracle +SELECT + :acknowledge_license AS license_acknowledged, + :include_diagnostics AS diagnostics_enabled, + 'STATS$SNAPSHOT' AS required_view, + 'Statspack access requires explicit opt-in and privileges.' AS warning +FROM dual +WHERE :include_diagnostics = 1 + AND :acknowledge_license = 1; diff --git a/sqlspec/data_dictionary/sql/oracle/tables/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/tables.sql similarity index 82% rename from sqlspec/data_dictionary/sql/oracle/tables/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/tables.sql index b25371aea..35ff7f6fa 100644 --- a/sqlspec/data_dictionary/sql/oracle/tables/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/tables.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT t.owner AS schema_name, @@ -38,3 +38,11 @@ LEFT JOIN all_tab_comments c WHERE t.owner = COALESCE(:schema_name, USER) AND (:table_name IS NULL OR t.table_name = :table_name) ORDER BY t.owner, t.table_name; + +-- name: names_by_schema +-- dialect: oracle +SELECT + table_name +FROM all_tables +WHERE owner = COALESCE(:schema_name, USER) +ORDER BY table_name; diff --git a/sqlspec/data_dictionary/sql/oracle/triggers/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/triggers.sql similarity index 96% rename from sqlspec/data_dictionary/sql/oracle/triggers/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/triggers.sql index 5179534ac..1b91d7152 100644 --- a/sqlspec/data_dictionary/sql/oracle/triggers/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/triggers.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/sql/oracle/version.sql b/sqlspec/data_dictionary/dialects/oracle/sql/version.sql similarity index 97% rename from sqlspec/data_dictionary/sql/oracle/version.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/version.sql index 20590fadd..51fe10d9f 100644 --- a/sqlspec/data_dictionary/sql/oracle/version.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/version.sql @@ -1,4 +1,4 @@ --- name: version +-- name: current -- dialect: oracle SELECT product AS "product", diff --git a/sqlspec/data_dictionary/sql/oracle/views/by_owner.sql b/sqlspec/data_dictionary/dialects/oracle/sql/views.sql similarity index 95% rename from sqlspec/data_dictionary/sql/oracle/views/by_owner.sql rename to sqlspec/data_dictionary/dialects/oracle/sql/views.sql index 47c7ce123..2bce3c383 100644 --- a/sqlspec/data_dictionary/sql/oracle/views/by_owner.sql +++ b/sqlspec/data_dictionary/dialects/oracle/sql/views.sql @@ -1,4 +1,4 @@ --- name: by_owner +-- name: by_schema -- dialect: oracle SELECT owner AS schema_name, diff --git a/sqlspec/data_dictionary/dialects/postgres/__init__.py b/sqlspec/data_dictionary/dialects/postgres/__init__.py new file mode 100644 index 000000000..d15fc9558 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/postgres/__init__.py @@ -0,0 +1,9 @@ +"""Dialect configuration for postgres.""" + +from sqlspec.data_dictionary.dialects.postgres.config import ( + POSTGRES_CONFIG, + POSTGRES_VERSION_PATTERN, + resolve_postgres_json_type, +) + +__all__ = ("POSTGRES_CONFIG", "POSTGRES_VERSION_PATTERN", "resolve_postgres_json_type") diff --git a/sqlspec/data_dictionary/dialects/postgres.py b/sqlspec/data_dictionary/dialects/postgres/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/postgres.py rename to sqlspec/data_dictionary/dialects/postgres/config.py diff --git a/sqlspec/data_dictionary/sql/postgres/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/columns.sql similarity index 71% rename from sqlspec/data_dictionary/sql/postgres/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/columns.sql index 2fac50f14..ac11d3bcf 100644 --- a/sqlspec/data_dictionary/sql/postgres/columns/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/postgres/sql/columns.sql @@ -39,3 +39,20 @@ WHERE n.nspname = :schema_name AND a.attnum > 0 AND NOT a.attisdropped ORDER BY n.nspname, c.relname, a.attnum; + +-- name: by_table +-- dialect: postgres +SELECT + a.attname::text AS column_name, + pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, + CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, + pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default +FROM pg_catalog.pg_attribute a +JOIN pg_catalog.pg_class c ON a.attrelid = c.oid +JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid +LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum +WHERE c.relname = :table_name + AND n.nspname = :schema_name + AND a.attnum > 0 + AND NOT a.attisdropped +ORDER BY a.attnum; diff --git a/sqlspec/data_dictionary/sql/postgres/comments/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/comments.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/comments/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/comments.sql diff --git a/sqlspec/data_dictionary/sql/postgres/constraints/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/constraints/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/constraints.sql diff --git a/sqlspec/data_dictionary/sql/postgres/ddl/by_object.sql b/sqlspec/data_dictionary/dialects/postgres/sql/ddl.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/ddl/by_object.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/ddl.sql diff --git a/sqlspec/data_dictionary/sql/postgres/dependencies/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/dependencies.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/dependencies/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/dependencies.sql diff --git a/sqlspec/data_dictionary/sql/postgres/extensions/list.sql b/sqlspec/data_dictionary/dialects/postgres/sql/extensions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/extensions/list.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/extensions.sql diff --git a/sqlspec/data_dictionary/sql/postgres/foreign_keys.sql b/sqlspec/data_dictionary/dialects/postgres/sql/foreign_keys.sql similarity index 95% rename from sqlspec/data_dictionary/sql/postgres/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/foreign_keys.sql index 7bb87677f..5c91ca764 100644 --- a/sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/postgres/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: postgres SELECT kcu.table_name, @@ -19,7 +19,7 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND (:schema_name::text IS NULL OR tc.table_schema = :schema_name) AND (:table_name::text IS NULL OR tc.table_name = :table_name); --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: postgres SELECT kcu.table_name, diff --git a/sqlspec/data_dictionary/sql/postgres/indexes/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/indexes.sql similarity index 74% rename from sqlspec/data_dictionary/sql/postgres/indexes/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/indexes.sql index a319cb91c..41006915e 100644 --- a/sqlspec/data_dictionary/sql/postgres/indexes/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/postgres/sql/indexes.sql @@ -41,3 +41,32 @@ LEFT JOIN pg_catalog.pg_depend dep ON dep.objid = idx.oid AND dep.deptype = 'e' WHERE tn.nspname = :schema_name AND (:table_name::text IS NULL OR tbl.relname = :table_name) ORDER BY tn.nspname, tbl.relname, idx.relname; + +-- name: by_table +-- dialect: postgres +SELECT + i.relname as index_name, + t.relname as table_name, + ix.indisunique as is_unique, + ix.indisprimary as is_primary, + array_agg(a.attname::text ORDER BY array_position(ix.indkey, a.attnum)) as columns +FROM + pg_class t, + pg_class i, + pg_index ix, + pg_attribute a, + pg_namespace n +WHERE + t.oid = ix.indrelid + AND i.oid = ix.indexrelid + AND a.attrelid = t.oid + AND a.attnum = ANY(ix.indkey) + AND t.relkind = 'r' + AND t.relnamespace = n.oid + AND n.nspname = :schema_name + AND t.relname = :table_name +GROUP BY + t.relname, + i.relname, + ix.indisunique, + ix.indisprimary; diff --git a/sqlspec/data_dictionary/sql/postgres/materialized_views/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/materialized_views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/materialized_views/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/materialized_views.sql diff --git a/sqlspec/data_dictionary/sql/postgres/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/postgres/partitions/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/partitions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/partitions/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/partitions.sql diff --git a/sqlspec/data_dictionary/sql/postgres/privileges/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/privileges/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/privileges.sql diff --git a/sqlspec/data_dictionary/sql/postgres/routines/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/routines.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/routines/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/routines.sql diff --git a/sqlspec/data_dictionary/sql/postgres/schemas/list.sql b/sqlspec/data_dictionary/dialects/postgres/sql/schemas.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/schemas/list.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/schemas.sql diff --git a/sqlspec/data_dictionary/sql/postgres/sequences/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/sequences.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/sequences/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/sequences.sql diff --git a/sqlspec/data_dictionary/dialects/postgres/sql/system.sql b/sqlspec/data_dictionary/dialects/postgres/sql/system.sql new file mode 100644 index 000000000..b6b6aae58 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/postgres/sql/system.sql @@ -0,0 +1,53 @@ +-- name: pg_stat_statements +-- dialect: postgres +SELECT + userid::text AS user_oid, + dbid::text AS database_oid, + queryid::text AS query_id, + query::text AS query_text, + calls, + total_exec_time, + mean_exec_time, + rows +FROM pg_catalog.pg_stat_statements +ORDER BY total_exec_time DESC +LIMIT :limit; + +-- name: settings +-- dialect: postgres +SELECT + name::text AS setting_name, + setting::text AS setting_value, + unit::text AS unit, + category::text AS category, + context::text AS context, + vartype::text AS value_type, + source::text AS source, + boot_val::text AS boot_value, + reset_val::text AS reset_value, + pending_restart +FROM pg_catalog.pg_settings +ORDER BY name; + +-- name: table_stats +-- dialect: postgres +SELECT + schemaname::text AS schema_name, + relname::text AS table_name, + seq_scan, + seq_tup_read, + idx_scan, + idx_tup_fetch, + n_tup_ins, + n_tup_upd, + n_tup_del, + n_live_tup, + n_dead_tup, + vacuum_count, + autovacuum_count, + analyze_count, + autoanalyze_count +FROM pg_catalog.pg_stat_user_tables +WHERE (:schema_name::text IS NULL OR schemaname = :schema_name) + AND (:table_name::text IS NULL OR relname = :table_name) +ORDER BY schemaname, relname; diff --git a/sqlspec/data_dictionary/sql/postgres/tables/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/tables.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/tables/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/tables.sql diff --git a/sqlspec/data_dictionary/sql/postgres/triggers/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/triggers.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/triggers/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/triggers.sql diff --git a/sqlspec/data_dictionary/sql/postgres/version.sql b/sqlspec/data_dictionary/dialects/postgres/sql/version.sql similarity index 69% rename from sqlspec/data_dictionary/sql/postgres/version.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/version.sql index f5a439590..300e1168a 100644 --- a/sqlspec/data_dictionary/sql/postgres/version.sql +++ b/sqlspec/data_dictionary/dialects/postgres/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: postgres SELECT version(); diff --git a/sqlspec/data_dictionary/sql/postgres/views/by_schema.sql b/sqlspec/data_dictionary/dialects/postgres/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/postgres/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/postgres/sql/views.sql diff --git a/sqlspec/data_dictionary/dialects/spanner/__init__.py b/sqlspec/data_dictionary/dialects/spanner/__init__.py new file mode 100644 index 000000000..64bb8f7ca --- /dev/null +++ b/sqlspec/data_dictionary/dialects/spanner/__init__.py @@ -0,0 +1,5 @@ +"""Dialect configuration for spanner.""" + +from sqlspec.data_dictionary.dialects.spanner.config import SPANNER_CONFIG, SPANNER_VERSION_PATTERN + +__all__ = ("SPANNER_CONFIG", "SPANNER_VERSION_PATTERN") diff --git a/sqlspec/data_dictionary/dialects/spanner.py b/sqlspec/data_dictionary/dialects/spanner/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/spanner.py rename to sqlspec/data_dictionary/dialects/spanner/config.py diff --git a/sqlspec/data_dictionary/sql/spanner/columns.sql b/sqlspec/data_dictionary/dialects/spanner/sql/columns.sql similarity index 91% rename from sqlspec/data_dictionary/sql/spanner/columns.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/columns.sql index 0e52e6080..37537dbf3 100644 --- a/sqlspec/data_dictionary/sql/spanner/columns.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/columns.sql @@ -1,4 +1,4 @@ --- name: columns_by_table +-- name: by_table -- dialect: spanner SELECT column_name, @@ -10,7 +10,7 @@ WHERE table_name = :table_name AND (CAST(:schema_name AS STRING) IS NULL OR table_schema = :schema_name) ORDER BY ordinal_position; --- name: columns_by_schema +-- name: by_schema -- dialect: spanner SELECT table_name, diff --git a/sqlspec/data_dictionary/sql/spanner/foreign_keys.sql b/sqlspec/data_dictionary/dialects/spanner/sql/foreign_keys.sql similarity index 97% rename from sqlspec/data_dictionary/sql/spanner/foreign_keys.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/foreign_keys.sql index 51043c623..108572604 100644 --- a/sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_table +-- name: by_table -- dialect: spanner WITH fk_constraints AS ( SELECT @@ -34,7 +34,7 @@ JOIN fk_columns pk WHERE (CAST(:table_name AS STRING) IS NULL OR fk.table_name = :table_name) ORDER BY fk.table_name, fk.ordinal_position; --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: spanner WITH fk_constraints AS ( SELECT diff --git a/sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/tables.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/change_streams.sql similarity index 53% rename from sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/tables.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/change_streams.sql index d5a3d6c84..89832486f 100644 --- a/sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/tables.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/change_streams.sql @@ -1,3 +1,16 @@ +-- name: list +-- dialect: spanner +SELECT + CHANGE_STREAM_CATALOG, + CHANGE_STREAM_SCHEMA, + CHANGE_STREAM_NAME, + ALL_TABLES, + CHANGE_STREAM_FOR_CLAUSE +FROM INFORMATION_SCHEMA.CHANGE_STREAMS +WHERE (CAST(:schema_name AS STRING) IS NULL OR CHANGE_STREAM_SCHEMA = :schema_name) + AND (CAST(:change_stream_name AS STRING) IS NULL OR CHANGE_STREAM_NAME = :change_stream_name) +ORDER BY CHANGE_STREAM_SCHEMA, CHANGE_STREAM_NAME; + -- name: tables -- dialect: spanner SELECT diff --git a/sqlspec/data_dictionary/sql/spanner/columns/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/columns.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/columns/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/columns.sql diff --git a/sqlspec/data_dictionary/sql/spanner/constraints/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/constraints/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/constraints.sql diff --git a/sqlspec/data_dictionary/sql/spanner/database/googlesql/options.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/database.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/database/googlesql/options.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/database.sql diff --git a/sqlspec/data_dictionary/sql/spanner/indexes/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/indexes.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/indexes/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/indexes.sql diff --git a/sqlspec/data_dictionary/sql/spanner/objects/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/objects/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/objects.sql diff --git a/sqlspec/data_dictionary/sql/spanner/placements/googlesql/list.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/placements.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/placements/googlesql/list.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/placements.sql diff --git a/sqlspec/data_dictionary/sql/spanner/privileges/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/privileges.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/privileges/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/privileges.sql diff --git a/sqlspec/data_dictionary/sql/spanner/property_graphs/googlesql/list.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/property_graphs.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/property_graphs/googlesql/list.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/property_graphs.sql diff --git a/sqlspec/data_dictionary/sql/spanner/routines/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/routines.sql similarity index 50% rename from sqlspec/data_dictionary/sql/spanner/routines/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/routines.sql index 9d7a0085f..ac36b58ae 100644 --- a/sqlspec/data_dictionary/sql/spanner/routines/googlesql/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/routines.sql @@ -15,3 +15,19 @@ FROM INFORMATION_SCHEMA.ROUTINES WHERE (CAST(:schema_name AS STRING) IS NULL OR ROUTINE_SCHEMA = :schema_name) AND (CAST(:routine_name AS STRING) IS NULL OR ROUTINE_NAME = :routine_name) ORDER BY ROUTINE_SCHEMA, ROUTINE_NAME; + +-- name: parameters_by_schema +-- dialect: spanner +SELECT + SPECIFIC_CATALOG, + SPECIFIC_SCHEMA, + SPECIFIC_NAME, + ORDINAL_POSITION, + PARAMETER_MODE, + IS_RESULT, + PARAMETER_NAME, + DATA_TYPE +FROM INFORMATION_SCHEMA.PARAMETERS +WHERE (CAST(:schema_name AS STRING) IS NULL OR SPECIFIC_SCHEMA = :schema_name) + AND (CAST(:routine_name AS STRING) IS NULL OR SPECIFIC_NAME = :routine_name) +ORDER BY SPECIFIC_SCHEMA, SPECIFIC_NAME, ORDINAL_POSITION; diff --git a/sqlspec/data_dictionary/sql/spanner/sequences/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/sequences.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/sequences/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/sequences.sql diff --git a/sqlspec/data_dictionary/sql/spanner/system/googlesql/query_stats_top.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/system.sql similarity index 52% rename from sqlspec/data_dictionary/sql/spanner/system/googlesql/query_stats_top.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/system.sql index 059ae7bf7..be7c6d5d3 100644 --- a/sqlspec/data_dictionary/sql/spanner/system/googlesql/query_stats_top.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/system.sql @@ -13,3 +13,15 @@ FROM SPANNER_SYS.QUERY_STATS_TOP_MINUTE WHERE (CAST(:interval_end_after AS TIMESTAMP) IS NULL OR INTERVAL_END >= :interval_end_after) ORDER BY INTERVAL_END DESC, EXECUTION_COUNT DESC LIMIT :limit; + +-- name: table_sizes +-- dialect: spanner +SELECT + INTERVAL_END, + TABLE_NAME, + USED_BYTES +FROM SPANNER_SYS.TABLE_SIZES_STATS_1HOUR +WHERE (CAST(:table_name AS STRING) IS NULL OR TABLE_NAME = :table_name) + AND (CAST(:interval_end_after AS TIMESTAMP) IS NULL OR INTERVAL_END >= :interval_end_after) +ORDER BY INTERVAL_END DESC, TABLE_NAME +LIMIT :limit; diff --git a/sqlspec/data_dictionary/sql/spanner/tables/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/tables.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/tables/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/tables.sql diff --git a/sqlspec/data_dictionary/sql/spanner/views/googlesql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/googlesql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/views/googlesql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/googlesql/views.sql diff --git a/sqlspec/data_dictionary/sql/spanner/indexes.sql b/sqlspec/data_dictionary/dialects/spanner/sql/indexes.sql similarity index 95% rename from sqlspec/data_dictionary/sql/spanner/indexes.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/indexes.sql index a18cbe95a..0e51e0d06 100644 --- a/sqlspec/data_dictionary/sql/spanner/indexes.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/indexes.sql @@ -1,4 +1,4 @@ --- name: indexes_by_table +-- name: by_table -- dialect: spanner SELECT i.index_name, @@ -14,7 +14,7 @@ WHERE i.table_name = :table_name AND (CAST(:schema_name AS STRING) IS NULL OR i.table_schema = :schema_name) GROUP BY i.index_name, i.table_name, i.is_unique, i.is_primary_key; --- name: indexes_by_schema +-- name: by_schema -- dialect: spanner SELECT i.index_name, diff --git a/sqlspec/data_dictionary/sql/spanner/objects/postgresql/by_schema.sql b/sqlspec/data_dictionary/dialects/spanner/sql/postgresql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/spanner/objects/postgresql/by_schema.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/postgresql/objects.sql diff --git a/sqlspec/data_dictionary/sql/spanner/tables.sql b/sqlspec/data_dictionary/dialects/spanner/sql/tables.sql similarity index 89% rename from sqlspec/data_dictionary/sql/spanner/tables.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/tables.sql index 19bf82afc..33e0419a3 100644 --- a/sqlspec/data_dictionary/sql/spanner/tables.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/tables.sql @@ -1,4 +1,4 @@ --- name: tables_by_schema +-- name: by_schema -- dialect: spanner SELECT table_name, diff --git a/sqlspec/data_dictionary/sql/spanner/version.sql b/sqlspec/data_dictionary/dialects/spanner/sql/version.sql similarity index 72% rename from sqlspec/data_dictionary/sql/spanner/version.sql rename to sqlspec/data_dictionary/dialects/spanner/sql/version.sql index cb39c63e0..a85a8c2ed 100644 --- a/sqlspec/data_dictionary/sql/spanner/version.sql +++ b/sqlspec/data_dictionary/dialects/spanner/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: spanner SELECT NULL AS version; diff --git a/sqlspec/data_dictionary/dialects/sqlite/__init__.py b/sqlspec/data_dictionary/dialects/sqlite/__init__.py new file mode 100644 index 000000000..821407509 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/sqlite/__init__.py @@ -0,0 +1,10 @@ +"""Dialect configuration for sqlite.""" + +from sqlspec.data_dictionary.dialects.sqlite.config import ( + SQLITE_CONFIG, + SQLITE_VERSION_PATTERN, + list_sqlite_available_features, + resolve_sqlite_json_type, +) + +__all__ = ("SQLITE_CONFIG", "SQLITE_VERSION_PATTERN", "list_sqlite_available_features", "resolve_sqlite_json_type") diff --git a/sqlspec/data_dictionary/dialects/sqlite.py b/sqlspec/data_dictionary/dialects/sqlite/config.py similarity index 100% rename from sqlspec/data_dictionary/dialects/sqlite.py rename to sqlspec/data_dictionary/dialects/sqlite/config.py diff --git a/sqlspec/data_dictionary/sql/sqlite/columns/by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/columns.sql similarity index 56% rename from sqlspec/data_dictionary/sql/sqlite/columns/by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/columns.sql index 44ed07920..a6911d76a 100644 --- a/sqlspec/data_dictionary/sql/sqlite/columns/by_schema.sql +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/columns.sql @@ -20,3 +20,22 @@ WHERE tl.schema = COALESCE(:schema_name, 'main') AND tl.type IN ('table', 'virtual') AND tl.name NOT LIKE 'sqlite_%' ORDER BY tl.name, ti.cid; + +-- name: by_table +-- dialect: sqlite +SELECT + :schema_name AS schema_name, + :table_name AS table_name, + ti.name AS column_name, + ti.type AS data_type, + CASE WHEN ti."notnull" THEN 'NO' ELSE 'YES' END AS is_nullable, + ti.dflt_value AS column_default, + ti.cid + 1 AS ordinal_position, + ti.pk AS is_primary, + CASE + WHEN ti.hidden = 1 THEN 'hidden' + WHEN ti.hidden IN (2, 3) THEN 'generated' + ELSE NULL + END AS extra +FROM pragma_table_xinfo(:table_name, :schema_name) AS ti +ORDER BY ti.cid; diff --git a/sqlspec/data_dictionary/sql/sqlite/compile_options/list.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/compile_options.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/compile_options/list.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/compile_options.sql diff --git a/sqlspec/data_dictionary/sql/.gitkeep b/sqlspec/data_dictionary/dialects/sqlite/sql/constraints.sql similarity index 100% rename from sqlspec/data_dictionary/sql/.gitkeep rename to sqlspec/data_dictionary/dialects/sqlite/sql/constraints.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/native_sql/by_object.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/ddl.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/native_sql/by_object.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/ddl.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/foreign_keys.sql similarity index 56% rename from sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/foreign_keys.sql index 948979d84..d786f8db3 100644 --- a/sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_schema.sql +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/foreign_keys.sql @@ -1,4 +1,4 @@ --- name: foreign_keys_by_schema +-- name: by_schema -- dialect: sqlite SELECT tl.schema AS schema_name, @@ -17,3 +17,19 @@ WHERE tl.schema = COALESCE(:schema_name, 'main') AND tl.type IN ('table', 'virtual') AND tl.name NOT LIKE 'sqlite_%' ORDER BY tl.name, fk.id, fk.seq; + +-- name: by_table +-- dialect: sqlite +SELECT + :schema_name AS schema_name, + :table_name AS table_name, + fk."from" AS column_name, + fk."table" AS referenced_table_name, + fk."to" AS referenced_column_name, + fk.id AS constraint_name, + fk.seq AS ordinal_position, + fk.on_update, + fk.on_delete, + fk.match +FROM pragma_foreign_key_list(:table_name, :schema_name) AS fk +ORDER BY fk.id, fk.seq; diff --git a/sqlspec/data_dictionary/sql/sqlite/functions/list.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/functions.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/functions/list.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/functions.sql diff --git a/sqlspec/data_dictionary/dialects/sqlite/sql/indexes.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/indexes.sql new file mode 100644 index 000000000..e59e20044 --- /dev/null +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/indexes.sql @@ -0,0 +1,71 @@ +-- name: by_schema +-- dialect: sqlite +SELECT + tl.schema AS schema_name, + tl.name AS table_name, + il.name AS index_name, + il."unique" AS is_unique, + CASE WHEN il.origin = 'pk' THEN 1 ELSE 0 END AS is_primary, + il.origin, + il.partial AS is_partial, + ix.seqno, + ix.cid AS column_id, + ix.name AS column_name, + ix.desc AS is_descending, + ix.coll AS collation, + ix.key AS is_key_column, + sm.sql AS index_sql +FROM pragma_table_list AS tl +JOIN pragma_index_list(tl.name, COALESCE(:schema_name, 'main')) AS il +JOIN pragma_index_xinfo(il.name, COALESCE(:schema_name, 'main')) AS ix +LEFT JOIN {schema_prefix}sqlite_schema AS sm + ON sm.type = 'index' + AND sm.name = il.name +WHERE tl.schema = COALESCE(:schema_name, 'main') + AND tl.type IN ('table', 'virtual') + AND tl.name NOT LIKE 'sqlite_%' + AND il.name NOT LIKE 'sqlite_%' +ORDER BY tl.name, il.seq, ix.seqno; + +-- name: by_table +-- dialect: sqlite +SELECT + :schema_name AS schema_name, + :table_name AS table_name, + il.name AS index_name, + il."unique" AS is_unique, + CASE WHEN il.origin = 'pk' THEN 1 ELSE 0 END AS is_primary, + il.origin, + il.partial AS is_partial, + ix.seqno, + ix.cid AS column_id, + ix.name AS column_name, + ix.desc AS is_descending, + ix.coll AS collation, + ix.key AS is_key_column, + sm.sql AS index_sql +FROM pragma_index_list(:table_name, :schema_name) AS il +JOIN pragma_index_xinfo(il.name, :schema_name) AS ix +LEFT JOIN {schema_prefix}sqlite_schema AS sm + ON sm.type = 'index' + AND sm.name = il.name +WHERE il.name NOT LIKE 'sqlite_%' +ORDER BY il.seq, ix.seqno; + +-- name: columns_by_index +-- dialect: sqlite +SELECT + :schema_name AS schema_name, + :index_name AS index_name, + ix.seqno, + ix.cid AS column_id, + ix.name AS column_name, + ix.desc AS is_descending, + ix.coll AS collation, + ix.key AS is_key_column +FROM pragma_index_xinfo(:index_name, :schema_name) AS ix +ORDER BY ix.seqno; + +-- name: index_columns_by_index +-- dialect: sqlite +PRAGMA index_info({index_name}); diff --git a/sqlspec/data_dictionary/sql/sqlite/modules/list.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/modules.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/modules/list.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/modules.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/objects/by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/objects.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/objects/by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/objects.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/schemas/database_list.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/schemas.sql similarity index 64% rename from sqlspec/data_dictionary/sql/sqlite/schemas/database_list.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/schemas.sql index b06cf8294..cabc77ae5 100644 --- a/sqlspec/data_dictionary/sql/sqlite/schemas/database_list.sql +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/schemas.sql @@ -1,3 +1,3 @@ --- name: database_list +-- name: list -- dialect: sqlite PRAGMA database_list; diff --git a/sqlspec/data_dictionary/sql/sqlite/system/foreign_key_check.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/system.sql similarity index 51% rename from sqlspec/data_dictionary/sql/sqlite/system/foreign_key_check.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/system.sql index 49c8c3410..832af2163 100644 --- a/sqlspec/data_dictionary/sql/sqlite/system/foreign_key_check.sql +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/system.sql @@ -1,3 +1,7 @@ -- name: foreign_key_check -- dialect: sqlite PRAGMA foreign_key_check; + +-- name: integrity_check +-- dialect: sqlite +PRAGMA integrity_check; diff --git a/sqlspec/data_dictionary/sql/sqlite/tables/by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/tables.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/tables/by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/tables.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/triggers/by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/triggers.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/triggers/by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/triggers.sql diff --git a/sqlspec/data_dictionary/sql/sqlite/version.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/version.sql similarity index 72% rename from sqlspec/data_dictionary/sql/sqlite/version.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/version.sql index 5e936ae98..c546d7736 100644 --- a/sqlspec/data_dictionary/sql/sqlite/version.sql +++ b/sqlspec/data_dictionary/dialects/sqlite/sql/version.sql @@ -1,3 +1,3 @@ --- name: version +-- name: current -- dialect: sqlite SELECT sqlite_version(); diff --git a/sqlspec/data_dictionary/sql/sqlite/views/by_schema.sql b/sqlspec/data_dictionary/dialects/sqlite/sql/views.sql similarity index 100% rename from sqlspec/data_dictionary/sql/sqlite/views/by_schema.sql rename to sqlspec/data_dictionary/dialects/sqlite/sql/views.sql diff --git a/sqlspec/data_dictionary/sql/bigquery/columns.sql b/sqlspec/data_dictionary/sql/bigquery/columns.sql deleted file mode 100644 index 3bd77d9b7..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/columns.sql +++ /dev/null @@ -1,23 +0,0 @@ --- name: columns_by_table --- dialect: bigquery -SELECT - column_name, - data_type, - is_nullable, - column_default -FROM {schema_prefix}INFORMATION_SCHEMA.COLUMNS -WHERE table_name = :table_name - AND (:schema_name IS NULL OR table_schema = :schema_name) -ORDER BY ordinal_position; - --- name: columns_by_schema --- dialect: bigquery -SELECT - table_name, - column_name, - data_type, - is_nullable, - column_default -FROM {schema_prefix}INFORMATION_SCHEMA.COLUMNS -WHERE (:schema_name IS NULL OR table_schema = :schema_name) -ORDER BY table_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/bigquery/columns/by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/columns/by_dataset.sql deleted file mode 100644 index 58b9ba1fd..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/columns/by_dataset.sql +++ /dev/null @@ -1,22 +0,0 @@ --- name: by_dataset --- dialect: bigquery -SELECT - table_catalog, - table_schema, - table_name, - column_name, - ordinal_position, - is_nullable, - data_type, - is_generated, - generation_expression, - is_stored, - is_hidden, - is_partitioning_column, - clustering_ordinal_position, - column_default, - rounding_mode -FROM {columns_table} -WHERE (:schema_name IS NULL OR table_schema = :schema_name) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/bigquery/columns/field_paths_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/columns/field_paths_by_dataset.sql deleted file mode 100644 index 49485a816..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/columns/field_paths_by_dataset.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: field_paths_by_dataset --- dialect: bigquery -SELECT - table_catalog, - table_schema, - table_name, - column_name, - field_path, - data_type, - description, - collation_name, - rounding_mode -FROM {field_paths_table} -WHERE (:schema_name IS NULL OR table_schema = :schema_name) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name, field_path; diff --git a/sqlspec/data_dictionary/sql/bigquery/indexes.sql b/sqlspec/data_dictionary/sql/bigquery/indexes.sql deleted file mode 100644 index f5629aa80..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/indexes.sql +++ /dev/null @@ -1,19 +0,0 @@ --- name: indexes_by_table --- dialect: bigquery -SELECT - NULL AS index_name, - NULL AS table_name, - NULL AS is_unique, - NULL AS is_primary, - NULL AS columns -WHERE FALSE; - --- name: indexes_by_schema --- dialect: bigquery -SELECT - NULL AS index_name, - NULL AS table_name, - NULL AS is_unique, - NULL AS is_primary, - NULL AS columns -WHERE FALSE; diff --git a/sqlspec/data_dictionary/sql/bigquery/indexes/search_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/indexes/search_by_dataset.sql deleted file mode 100644 index 7ef3b61a3..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/indexes/search_by_dataset.sql +++ /dev/null @@ -1,19 +0,0 @@ --- name: search_by_dataset --- dialect: bigquery -SELECT - si.index_catalog AS schema_name, - si.table_name, - si.index_name, - ARRAY_AGG(sic.index_field_path ORDER BY sic.index_field_path) AS columns, - FALSE AS is_unique, - FALSE AS is_primary -FROM {search_indexes_table} AS si -LEFT JOIN {search_index_columns_table} AS sic - ON si.index_catalog = sic.index_catalog - AND si.index_schema = sic.index_schema - AND si.table_name = sic.table_name - AND si.index_name = sic.index_name -WHERE (:schema_name IS NULL OR si.index_schema = :schema_name) - AND (:table_name IS NULL OR si.table_name = :table_name) -GROUP BY si.index_catalog, si.table_name, si.index_name -ORDER BY si.table_name, si.index_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/indexes/vector_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/indexes/vector_by_dataset.sql deleted file mode 100644 index d3b94e0a7..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/indexes/vector_by_dataset.sql +++ /dev/null @@ -1,19 +0,0 @@ --- name: vector_by_dataset --- dialect: bigquery -SELECT - vi.index_catalog AS schema_name, - vi.table_name, - vi.index_name, - ARRAY_AGG(vic.index_field_path ORDER BY vic.index_field_path) AS columns, - FALSE AS is_unique, - FALSE AS is_primary -FROM {vector_indexes_table} AS vi -LEFT JOIN {vector_index_columns_table} AS vic - ON vi.index_catalog = vic.index_catalog - AND vi.index_schema = vic.index_schema - AND vi.table_name = vic.table_name - AND vi.index_name = vic.index_name -WHERE (:schema_name IS NULL OR vi.index_schema = :schema_name) - AND (:table_name IS NULL OR vi.table_name = :table_name) -GROUP BY vi.index_catalog, vi.table_name, vi.index_name -ORDER BY vi.table_name, vi.index_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/routines/by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/routines/by_dataset.sql deleted file mode 100644 index 868c7ccdd..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/routines/by_dataset.sql +++ /dev/null @@ -1,19 +0,0 @@ --- name: by_dataset --- dialect: bigquery -SELECT - routine_catalog, - routine_schema, - routine_name, - routine_type, - data_type, - routine_body, - routine_definition, - external_language, - is_deterministic, - security_type, - created, - last_altered -FROM {routines_table} -WHERE (:schema_name IS NULL OR routine_schema = :schema_name) - AND (:routine_name IS NULL OR routine_name = :routine_name) -ORDER BY routine_schema, routine_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/routines/options_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/routines/options_by_dataset.sql deleted file mode 100644 index e97103462..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/routines/options_by_dataset.sql +++ /dev/null @@ -1,13 +0,0 @@ --- name: options_by_dataset --- dialect: bigquery -SELECT - specific_catalog, - specific_schema, - specific_name, - option_name, - option_type, - option_value -FROM {routine_options_table} -WHERE (:schema_name IS NULL OR specific_schema = :schema_name) - AND (:routine_name IS NULL OR specific_name = :routine_name) -ORDER BY specific_schema, specific_name, option_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/routines/parameters_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/routines/parameters_by_dataset.sql deleted file mode 100644 index 6d967ce80..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/routines/parameters_by_dataset.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: parameters_by_dataset --- dialect: bigquery -SELECT - specific_catalog, - specific_schema, - specific_name, - ordinal_position, - parameter_mode, - is_result, - parameter_name, - data_type, - parameter_default -FROM {parameters_table} -WHERE (:schema_name IS NULL OR specific_schema = :schema_name) - AND (:routine_name IS NULL OR specific_name = :routine_name) -ORDER BY specific_schema, specific_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/bigquery/system/jobs_by_region.sql b/sqlspec/data_dictionary/sql/bigquery/system/jobs_by_region.sql deleted file mode 100644 index ed16b0bde..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/system/jobs_by_region.sql +++ /dev/null @@ -1,26 +0,0 @@ --- name: jobs_by_region --- dialect: bigquery -SELECT - project_id, - project_number, - user_email, - job_id, - job_type, - statement_type, - priority, - creation_time, - start_time, - end_time, - state, - reservation_id, - total_bytes_processed, - total_slot_ms, - cache_hit, - error_result, - query -FROM {jobs_table} -WHERE (:user_email IS NULL OR user_email = :user_email) - AND (:state IS NULL OR state = :state) - AND (:created_after IS NULL OR creation_time >= :created_after) -ORDER BY creation_time DESC -LIMIT :limit; diff --git a/sqlspec/data_dictionary/sql/bigquery/system/reservations_by_region.sql b/sqlspec/data_dictionary/sql/bigquery/system/reservations_by_region.sql deleted file mode 100644 index d84c847cb..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/system/reservations_by_region.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: reservations_by_region --- dialect: bigquery -SELECT - project_id, - project_number, - reservation_name, - slot_capacity, - ignore_idle_slots, - edition, - autoscale, - concurrency, - creation_time, - update_time -FROM {reservations_table} -WHERE (:reservation_name IS NULL OR reservation_name = :reservation_name) -ORDER BY reservation_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/system/sessions_by_region.sql b/sqlspec/data_dictionary/sql/bigquery/system/sessions_by_region.sql deleted file mode 100644 index 12b5aa321..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/system/sessions_by_region.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: sessions_by_region --- dialect: bigquery -SELECT - project_id, - project_number, - user_email, - session_id, - creation_time, - expiration_time, - is_active -FROM {sessions_table} -WHERE (:user_email IS NULL OR user_email = :user_email) - AND (:is_active IS NULL OR is_active = :is_active) -ORDER BY creation_time DESC -LIMIT :limit; diff --git a/sqlspec/data_dictionary/sql/bigquery/tables.sql b/sqlspec/data_dictionary/sql/bigquery/tables.sql deleted file mode 100644 index 372c6e796..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/tables.sql +++ /dev/null @@ -1,36 +0,0 @@ --- name: tables_by_schema --- dialect: bigquery -WITH RECURSIVE dependency_tree AS ( - SELECT - t.table_name, - 0 AS level, - [t.table_name] AS path - FROM {tables_table} t - WHERE t.table_type = 'BASE TABLE' - AND (:schema_name IS NULL OR t.table_schema = :schema_name) - AND NOT EXISTS ( - SELECT 1 - FROM {kcu_table} kcu - JOIN {rc_table} rc ON kcu.constraint_name = rc.constraint_name - WHERE kcu.table_name = t.table_name - AND (:schema_name IS NULL OR kcu.table_schema = :schema_name) - ) - - UNION ALL - - SELECT - kcu.table_name, - dt.level + 1, - ARRAY_CONCAT(dt.path, [kcu.table_name]) - FROM {kcu_table} kcu - JOIN {rc_table} rc ON kcu.constraint_name = rc.constraint_name - JOIN {kcu_table} pk_kcu - ON rc.unique_constraint_name = pk_kcu.constraint_name - AND kcu.ordinal_position = pk_kcu.ordinal_position - JOIN dependency_tree dt ON pk_kcu.table_name = dt.table_name - WHERE kcu.table_name NOT IN UNNEST(dt.path) - AND (:schema_name IS NULL OR kcu.table_schema = :schema_name) -) -SELECT DISTINCT table_name -FROM dependency_tree -ORDER BY level, table_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/tables/options_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/tables/options_by_dataset.sql deleted file mode 100644 index c211787b4..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/tables/options_by_dataset.sql +++ /dev/null @@ -1,13 +0,0 @@ --- name: options_by_dataset --- dialect: bigquery -SELECT - table_catalog, - table_schema, - table_name, - option_name, - option_type, - option_value -FROM {table_options_table} -WHERE (:schema_name IS NULL OR table_schema = :schema_name) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name, option_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/tables/partitions_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/tables/partitions_by_dataset.sql deleted file mode 100644 index 4b368a72e..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/tables/partitions_by_dataset.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: partitions_by_dataset --- dialect: bigquery -SELECT - table_catalog, - table_schema, - table_name, - partition_id, - total_rows, - total_logical_bytes, - last_modified_time, - storage_tier -FROM {partitions_table} -WHERE (:schema_name IS NULL OR table_schema = :schema_name) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name, partition_id; diff --git a/sqlspec/data_dictionary/sql/bigquery/tables/storage_by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/tables/storage_by_dataset.sql deleted file mode 100644 index 838d6ebe4..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/tables/storage_by_dataset.sql +++ /dev/null @@ -1,20 +0,0 @@ --- name: storage_by_dataset --- dialect: bigquery -SELECT - table_catalog, - table_schema, - table_name, - total_rows, - total_partitions, - total_logical_bytes, - active_logical_bytes, - long_term_logical_bytes, - total_physical_bytes, - active_physical_bytes, - long_term_physical_bytes, - time_travel_physical_bytes, - storage_last_modified_time -FROM {table_storage_table} -WHERE (:schema_name IS NULL OR table_schema = :schema_name) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name; diff --git a/sqlspec/data_dictionary/sql/bigquery/views/by_dataset.sql b/sqlspec/data_dictionary/sql/bigquery/views/by_dataset.sql deleted file mode 100644 index dba65a2bc..000000000 --- a/sqlspec/data_dictionary/sql/bigquery/views/by_dataset.sql +++ /dev/null @@ -1,13 +0,0 @@ --- name: by_dataset --- dialect: bigquery -SELECT - v.table_catalog, - v.table_schema, - v.table_name, - v.view_definition, - v.check_option, - v.use_standard_sql -FROM {views_table} AS v -WHERE (:schema_name IS NULL OR v.table_schema = :schema_name) - AND (:view_name IS NULL OR v.table_name = :view_name) -ORDER BY v.table_schema, v.table_name; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/columns.sql b/sqlspec/data_dictionary/sql/cockroachdb/columns.sql deleted file mode 100644 index 7770aad8f..000000000 --- a/sqlspec/data_dictionary/sql/cockroachdb/columns.sql +++ /dev/null @@ -1,34 +0,0 @@ --- name: columns_by_table --- dialect: cockroachdb -SELECT - a.attname::text AS column_name, - pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, - CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, - pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default -FROM pg_catalog.pg_attribute a -JOIN pg_catalog.pg_class c ON a.attrelid = c.oid -JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid -LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum -WHERE c.relname = :table_name - AND n.nspname = :schema_name - AND a.attnum > 0 - AND NOT a.attisdropped -ORDER BY a.attnum; - --- name: columns_by_schema --- dialect: cockroachdb -SELECT - n.nspname::text AS schema_name, - c.relname::text AS table_name, - a.attname::text AS column_name, - pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, - CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, - pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default -FROM pg_catalog.pg_attribute a -JOIN pg_catalog.pg_class c ON a.attrelid = c.oid -JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid -LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum -WHERE n.nspname = :schema_name - AND a.attnum > 0 - AND NOT a.attisdropped -ORDER BY c.relname, a.attnum; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/indexes.sql b/sqlspec/data_dictionary/sql/cockroachdb/indexes.sql deleted file mode 100644 index d876b09b2..000000000 --- a/sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +++ /dev/null @@ -1,32 +0,0 @@ --- name: indexes_by_table --- dialect: cockroachdb -SELECT - i.relname::text AS index_name, - a.attname::text AS column_name, - ix.indisunique AS is_unique, - ix.indisprimary AS is_primary -FROM pg_catalog.pg_class t -JOIN pg_catalog.pg_namespace n ON t.relnamespace = n.oid -JOIN pg_catalog.pg_index ix ON t.oid = ix.indrelid -JOIN pg_catalog.pg_class i ON i.oid = ix.indexrelid -JOIN pg_catalog.pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) -WHERE t.relname = :table_name - AND n.nspname = :schema_name -ORDER BY i.relname, a.attnum; - --- name: indexes_by_schema --- dialect: cockroachdb -SELECT - n.nspname::text AS schema_name, - t.relname::text AS table_name, - i.relname::text AS index_name, - a.attname::text AS column_name, - ix.indisunique AS is_unique, - ix.indisprimary AS is_primary -FROM pg_catalog.pg_class t -JOIN pg_catalog.pg_namespace n ON t.relnamespace = n.oid -JOIN pg_catalog.pg_index ix ON t.oid = ix.indrelid -JOIN pg_catalog.pg_class i ON i.oid = ix.indexrelid -JOIN pg_catalog.pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey) -WHERE n.nspname = :schema_name -ORDER BY t.relname, i.relname, a.attnum; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/indexes/by_schema.sql b/sqlspec/data_dictionary/sql/cockroachdb/indexes/by_schema.sql deleted file mode 100644 index c466e6042..000000000 --- a/sqlspec/data_dictionary/sql/cockroachdb/indexes/by_schema.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: by_schema --- dialect: cockroachdb -SELECT - table_schema::text AS schema_name, - table_name::text AS table_name, - index_name::text AS index_name, - column_name::text AS column_name, - non_unique = false AS is_unique, - index_name = 'primary' AS is_primary, - direction::text AS direction, - storing::text AS storing -FROM information_schema.statistics -WHERE table_schema = :schema_name - AND (:table_name::text IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name, index_name, seq_in_index; diff --git a/sqlspec/data_dictionary/sql/cockroachdb/tables.sql b/sqlspec/data_dictionary/sql/cockroachdb/tables.sql deleted file mode 100644 index 4b7bce7f6..000000000 --- a/sqlspec/data_dictionary/sql/cockroachdb/tables.sql +++ /dev/null @@ -1,44 +0,0 @@ --- name: tables_by_schema --- dialect: cockroachdb -WITH RECURSIVE dependency_tree AS ( - SELECT - t.table_name::text, - 0 AS level, - ARRAY[t.table_name::text] AS path - FROM information_schema.tables t - WHERE t.table_type = 'BASE TABLE' - AND t.table_schema = :schema_name - AND NOT EXISTS ( - SELECT 1 - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - WHERE tc.constraint_type = 'FOREIGN KEY' - AND tc.table_name = t.table_name - AND tc.table_schema = t.table_schema - ) - - UNION ALL - - SELECT - tc.table_name::text, - dt.level + 1, - dt.path || tc.table_name::text - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - JOIN information_schema.constraint_column_usage ccu - ON ccu.constraint_name = tc.constraint_name - AND ccu.table_schema = tc.table_schema - JOIN dependency_tree dt - ON ccu.table_name = dt.table_name - WHERE tc.constraint_type = 'FOREIGN KEY' - AND tc.table_schema = :schema_name - AND ccu.table_schema = :schema_name - AND NOT (tc.table_name = ANY(dt.path)) -) -SELECT DISTINCT table_name, level -FROM dependency_tree -ORDER BY level, table_name; diff --git a/sqlspec/data_dictionary/sql/duckdb/columns.sql b/sqlspec/data_dictionary/sql/duckdb/columns.sql deleted file mode 100644 index 3b5d41e0c..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/columns.sql +++ /dev/null @@ -1,23 +0,0 @@ --- name: columns_by_table --- dialect: duckdb -SELECT - column_name, - data_type, - is_nullable, - column_default -FROM information_schema.columns -WHERE table_name = :table_name - AND table_schema = COALESCE(:schema_name, current_schema()) -ORDER BY ordinal_position; - --- name: columns_by_schema --- dialect: duckdb -SELECT - table_name, - column_name, - data_type, - is_nullable, - column_default -FROM information_schema.columns -WHERE table_schema = COALESCE(:schema_name, current_schema()) -ORDER BY table_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/duckdb/columns/by_schema.sql b/sqlspec/data_dictionary/sql/duckdb/columns/by_schema.sql deleted file mode 100644 index 1990d98cc..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/columns/by_schema.sql +++ /dev/null @@ -1,20 +0,0 @@ --- name: by_schema --- dialect: duckdb -SELECT - database_name, - schema_name, - table_name, - column_name, - column_index AS ordinal_position, - data_type, - is_nullable, - column_default, - character_maximum_length AS max_length, - numeric_precision, - numeric_scale, - comment, - internal -FROM duckdb_columns() -WHERE schema_name = COALESCE(:schema_name, current_schema()) - AND NOT internal -ORDER BY table_name, column_index; diff --git a/sqlspec/data_dictionary/sql/duckdb/constraints/by_schema.sql b/sqlspec/data_dictionary/sql/duckdb/constraints/by_schema.sql deleted file mode 100644 index 9f59ac78b..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/constraints/by_schema.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: by_schema --- dialect: duckdb -SELECT - database_name, - schema_name, - table_name, - constraint_name, - constraint_type, - constraint_text, - expression, - constraint_column_names, - referenced_table, - referenced_column_names -FROM duckdb_constraints() -WHERE schema_name = COALESCE(:schema_name, current_schema()) -ORDER BY table_name, constraint_index; diff --git a/sqlspec/data_dictionary/sql/duckdb/indexes.sql b/sqlspec/data_dictionary/sql/duckdb/indexes.sql deleted file mode 100644 index 6cbf42593..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/indexes.sql +++ /dev/null @@ -1,19 +0,0 @@ --- name: indexes_by_table --- dialect: duckdb -SELECT - NULL AS index_name, - NULL AS table_name, - NULL AS is_unique, - NULL AS is_primary, - NULL AS columns -WHERE FALSE; - --- name: indexes_by_schema --- dialect: duckdb -SELECT - NULL AS index_name, - NULL AS table_name, - NULL AS is_unique, - NULL AS is_primary, - NULL AS columns -WHERE FALSE; diff --git a/sqlspec/data_dictionary/sql/duckdb/indexes/by_schema.sql b/sqlspec/data_dictionary/sql/duckdb/indexes/by_schema.sql deleted file mode 100644 index 8e11d9112..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/indexes/by_schema.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: by_schema --- dialect: duckdb -SELECT - database_name, - schema_name, - table_name, - index_name, - is_unique, - is_primary, - expressions AS columns, - comment, - tags, - sql AS native_sql -FROM duckdb_indexes() -WHERE schema_name = COALESCE(:schema_name, current_schema()) -ORDER BY table_name, index_name; diff --git a/sqlspec/data_dictionary/sql/duckdb/system/logs.sql b/sqlspec/data_dictionary/sql/duckdb/system/logs.sql deleted file mode 100644 index 5040bcf1f..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/system/logs.sql +++ /dev/null @@ -1,4 +0,0 @@ --- name: logs --- dialect: duckdb -SELECT * -FROM duckdb_logs(); diff --git a/sqlspec/data_dictionary/sql/duckdb/system/memory.sql b/sqlspec/data_dictionary/sql/duckdb/system/memory.sql deleted file mode 100644 index 114510dd1..000000000 --- a/sqlspec/data_dictionary/sql/duckdb/system/memory.sql +++ /dev/null @@ -1,4 +0,0 @@ --- name: memory --- dialect: duckdb -SELECT * -FROM duckdb_memory(); diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_event.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_event.sql deleted file mode 100644 index ff1dea047..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_event.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_event --- dialect: mysql -SELECT 'SHOW CREATE EVENT' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_function.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_function.sql deleted file mode 100644 index af66f10d9..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_function.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_function --- dialect: mysql -SELECT 'SHOW CREATE FUNCTION' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_procedure.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_procedure.sql deleted file mode 100644 index 47854afdf..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_procedure.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_procedure --- dialect: mysql -SELECT 'SHOW CREATE PROCEDURE' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_sequence.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_sequence.sql deleted file mode 100644 index 78afc9e0b..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_sequence.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_sequence --- dialect: mysql -SELECT 'SHOW CREATE SEQUENCE' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_table.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_table.sql deleted file mode 100644 index 084d4263d..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_table.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_table --- dialect: mysql -SELECT 'SHOW CREATE TABLE' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_trigger.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_trigger.sql deleted file mode 100644 index ea89440c9..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_trigger.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_trigger --- dialect: mysql -SELECT 'SHOW CREATE TRIGGER' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_view.sql b/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_view.sql deleted file mode 100644 index 8b314a07c..000000000 --- a/sqlspec/data_dictionary/sql/mariadb/ddl/show_create_view.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_view --- dialect: mysql -SELECT 'SHOW CREATE VIEW' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mssql/columns.sql b/sqlspec/data_dictionary/sql/mssql/columns.sql deleted file mode 100644 index 4592a4728..000000000 --- a/sqlspec/data_dictionary/sql/mssql/columns.sql +++ /dev/null @@ -1,76 +0,0 @@ --- name: columns_by_table --- dialect: mssql -SELECT - s.name AS schema_name, - tab.name AS table_name, - c.column_id AS ordinal_position, - c.name AS column_name, - typ.name AS data_type, - CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS is_nullable, - OBJECT_DEFINITION(c.default_object_id) AS column_default, - c.max_length, - c.precision AS numeric_precision, - c.scale AS numeric_scale, - CAST(CASE WHEN pk_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_primary, - CAST(CASE WHEN unique_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_unique -FROM sys.columns c -INNER JOIN sys.types typ ON c.user_type_id = typ.user_type_id -INNER JOIN sys.tables tab ON c.object_id = tab.object_id -INNER JOIN sys.schemas s ON tab.schema_id = s.schema_id -OUTER APPLY ( - SELECT TOP 1 ic.column_id - FROM sys.indexes i - INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id - WHERE i.object_id = tab.object_id - AND i.is_primary_key = 1 - AND ic.column_id = c.column_id -) pk_cols -OUTER APPLY ( - SELECT TOP 1 ic.column_id - FROM sys.indexes i - INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id - WHERE i.object_id = tab.object_id - AND i.is_unique = 1 - AND ic.column_id = c.column_id -) unique_cols -WHERE s.name = :schema_name - AND tab.name = :table_name -ORDER BY c.column_id; - --- name: columns_by_schema --- dialect: mssql -SELECT - s.name AS schema_name, - tab.name AS table_name, - c.column_id AS ordinal_position, - c.name AS column_name, - typ.name AS data_type, - CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS is_nullable, - OBJECT_DEFINITION(c.default_object_id) AS column_default, - c.max_length, - c.precision AS numeric_precision, - c.scale AS numeric_scale, - CAST(CASE WHEN pk_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_primary, - CAST(CASE WHEN unique_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_unique -FROM sys.columns c -INNER JOIN sys.types typ ON c.user_type_id = typ.user_type_id -INNER JOIN sys.tables tab ON c.object_id = tab.object_id -INNER JOIN sys.schemas s ON tab.schema_id = s.schema_id -OUTER APPLY ( - SELECT TOP 1 ic.column_id - FROM sys.indexes i - INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id - WHERE i.object_id = tab.object_id - AND i.is_primary_key = 1 - AND ic.column_id = c.column_id -) pk_cols -OUTER APPLY ( - SELECT TOP 1 ic.column_id - FROM sys.indexes i - INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id - WHERE i.object_id = tab.object_id - AND i.is_unique = 1 - AND ic.column_id = c.column_id -) unique_cols -WHERE (:schema_name IS NULL OR s.name = :schema_name) -ORDER BY s.name, tab.name, c.column_id; diff --git a/sqlspec/data_dictionary/sql/mssql/columns/by_table.sql b/sqlspec/data_dictionary/sql/mssql/columns/by_table.sql deleted file mode 100644 index cfbc6a1fe..000000000 --- a/sqlspec/data_dictionary/sql/mssql/columns/by_table.sql +++ /dev/null @@ -1,54 +0,0 @@ --- name: by_table --- dialect: mssql -SELECT - s.name AS schema_name, - tab.name AS table_name, - c.column_id AS ordinal_position, - c.name AS column_name, - typ.name AS data_type, - CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS is_nullable, - OBJECT_DEFINITION(c.default_object_id) AS column_default, - c.max_length, - c.precision AS numeric_precision, - c.scale AS numeric_scale, - CAST(CASE WHEN pk_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_primary, - CAST(CASE WHEN unique_cols.column_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_unique, - c.collation_name, - CAST(c.is_sparse AS BIT) AS is_sparse, - CAST(c.is_column_set AS BIT) AS is_column_set, - CAST(c.is_hidden AS BIT) AS is_hidden, - CAST(c.is_masked AS BIT) AS is_masked, - c.encryption_type_desc, - c.encryption_algorithm_name, - c.generated_always_type_desc, - CAST(CASE WHEN cc.object_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_computed, - cc.definition AS computed_definition, - CAST(cc.is_persisted AS BIT) AS is_persisted_computed, - CAST(CASE WHEN ic.object_id IS NULL THEN 0 ELSE 1 END AS BIT) AS is_identity, - CONVERT(BIGINT, ic.seed_value) AS identity_seed, - CONVERT(BIGINT, ic.increment_value) AS identity_increment -FROM sys.columns AS c -INNER JOIN sys.types AS typ ON c.user_type_id = typ.user_type_id -INNER JOIN sys.tables AS tab ON c.object_id = tab.object_id -INNER JOIN sys.schemas AS s ON tab.schema_id = s.schema_id -LEFT JOIN sys.computed_columns AS cc ON c.object_id = cc.object_id AND c.column_id = cc.column_id -LEFT JOIN sys.identity_columns AS ic ON c.object_id = ic.object_id AND c.column_id = ic.column_id -OUTER APPLY ( - SELECT TOP 1 idx_col.column_id - FROM sys.indexes AS idx - INNER JOIN sys.index_columns AS idx_col ON idx.object_id = idx_col.object_id AND idx.index_id = idx_col.index_id - WHERE idx.object_id = tab.object_id - AND idx.is_primary_key = 1 - AND idx_col.column_id = c.column_id -) AS pk_cols -OUTER APPLY ( - SELECT TOP 1 idx_col.column_id - FROM sys.indexes AS idx - INNER JOIN sys.index_columns AS idx_col ON idx.object_id = idx_col.object_id AND idx.index_id = idx_col.index_id - WHERE idx.object_id = tab.object_id - AND idx.is_unique = 1 - AND idx_col.column_id = c.column_id -) AS unique_cols -WHERE s.name = :schema_name - AND tab.name = :table_name -ORDER BY c.column_id; diff --git a/sqlspec/data_dictionary/sql/mssql/constraints/by_schema.sql b/sqlspec/data_dictionary/sql/mssql/constraints/by_schema.sql deleted file mode 100644 index 7b3720e6c..000000000 --- a/sqlspec/data_dictionary/sql/mssql/constraints/by_schema.sql +++ /dev/null @@ -1,42 +0,0 @@ --- name: by_schema --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - kc.name AS constraint_name, - kc.type_desc AS constraint_type, - CAST(kc.is_system_named AS BIT) AS is_system_named, - NULL AS column_name, - NULL AS definition -FROM sys.key_constraints AS kc -INNER JOIN sys.tables AS t ON kc.parent_object_id = t.object_id -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) -UNION ALL -SELECT - s.name AS schema_name, - t.name AS table_name, - cc.name AS constraint_name, - 'CHECK_CONSTRAINT' AS constraint_type, - CAST(cc.is_system_named AS BIT) AS is_system_named, - NULL AS column_name, - cc.definition -FROM sys.check_constraints AS cc -INNER JOIN sys.tables AS t ON cc.parent_object_id = t.object_id -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) -UNION ALL -SELECT - s.name AS schema_name, - t.name AS table_name, - dc.name AS constraint_name, - 'DEFAULT_CONSTRAINT' AS constraint_type, - CAST(dc.is_system_named AS BIT) AS is_system_named, - c.name AS column_name, - dc.definition -FROM sys.default_constraints AS dc -INNER JOIN sys.tables AS t ON dc.parent_object_id = t.object_id -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -INNER JOIN sys.columns AS c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) -ORDER BY schema_name, table_name, constraint_name; diff --git a/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_schema.sql b/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_schema.sql deleted file mode 100644 index 446cfe3fe..000000000 --- a/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_schema.sql +++ /dev/null @@ -1,21 +0,0 @@ --- name: foreign_keys_by_schema --- dialect: mssql -SELECT - OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name, - fk.name AS constraint_name, - OBJECT_NAME(fk.parent_object_id) AS table_name, - parent_col.name AS column_name, - OBJECT_SCHEMA_NAME(fk.referenced_object_id) AS referenced_schema, - OBJECT_NAME(fk.referenced_object_id) AS referenced_table, - referenced_col.name AS referenced_column, - fk.delete_referential_action_desc, - fk.update_referential_action_desc, - CAST(fk.is_not_trusted AS BIT) AS is_not_trusted -FROM sys.foreign_keys AS fk -INNER JOIN sys.foreign_key_columns AS fkc ON fk.object_id = fkc.constraint_object_id -INNER JOIN sys.columns AS parent_col - ON fkc.parent_object_id = parent_col.object_id AND fkc.parent_column_id = parent_col.column_id -INNER JOIN sys.columns AS referenced_col - ON fkc.referenced_object_id = referenced_col.object_id AND fkc.referenced_column_id = referenced_col.column_id -WHERE (:schema_name IS NULL OR OBJECT_SCHEMA_NAME(fk.parent_object_id) = :schema_name) -ORDER BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_NAME(fk.parent_object_id), fk.name, fkc.constraint_column_id; diff --git a/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_table.sql b/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_table.sql deleted file mode 100644 index 150381731..000000000 --- a/sqlspec/data_dictionary/sql/mssql/constraints/foreign_keys_by_table.sql +++ /dev/null @@ -1,22 +0,0 @@ --- name: foreign_keys_by_table --- dialect: mssql -SELECT - OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name, - fk.name AS constraint_name, - OBJECT_NAME(fk.parent_object_id) AS table_name, - parent_col.name AS column_name, - OBJECT_SCHEMA_NAME(fk.referenced_object_id) AS referenced_schema, - OBJECT_NAME(fk.referenced_object_id) AS referenced_table, - referenced_col.name AS referenced_column, - fk.delete_referential_action_desc, - fk.update_referential_action_desc, - CAST(fk.is_not_trusted AS BIT) AS is_not_trusted -FROM sys.foreign_keys AS fk -INNER JOIN sys.foreign_key_columns AS fkc ON fk.object_id = fkc.constraint_object_id -INNER JOIN sys.columns AS parent_col - ON fkc.parent_object_id = parent_col.object_id AND fkc.parent_column_id = parent_col.column_id -INNER JOIN sys.columns AS referenced_col - ON fkc.referenced_object_id = referenced_col.object_id AND fkc.referenced_column_id = referenced_col.column_id -WHERE OBJECT_SCHEMA_NAME(fk.parent_object_id) = :schema_name - AND OBJECT_NAME(fk.parent_object_id) = :table_name -ORDER BY fk.name, fkc.constraint_column_id; diff --git a/sqlspec/data_dictionary/sql/mssql/ddl/index_inputs_by_table.sql b/sqlspec/data_dictionary/sql/mssql/ddl/index_inputs_by_table.sql deleted file mode 100644 index cb8cb275d..000000000 --- a/sqlspec/data_dictionary/sql/mssql/ddl/index_inputs_by_table.sql +++ /dev/null @@ -1,40 +0,0 @@ --- name: index_inputs_by_table --- dialect: mssql -/* sqlspec:mssql:ddl_index_inputs */ -SELECT - s.name AS schema_name, - t.name AS table_name, - i.name AS index_name, - i.type_desc, - CAST(i.is_unique AS BIT) AS is_unique, - CAST(i.has_filter AS BIT) AS has_filter, - i.filter_definition, - STUFF(( - SELECT ',' + c2.name - FROM sys.index_columns AS ic2 - INNER JOIN sys.columns AS c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id - WHERE ic2.object_id = i.object_id - AND ic2.index_id = i.index_id - AND ic2.is_included_column = 0 - ORDER BY ic2.key_ordinal - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns, - STUFF(( - SELECT ',' + c3.name - FROM sys.index_columns AS ic3 - INNER JOIN sys.columns AS c3 ON ic3.object_id = c3.object_id AND ic3.column_id = c3.column_id - WHERE ic3.object_id = i.object_id - AND ic3.index_id = i.index_id - AND ic3.is_included_column = 1 - ORDER BY ic3.index_column_id - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS included_columns -FROM sys.indexes AS i -INNER JOIN sys.tables AS t ON i.object_id = t.object_id -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -WHERE s.name = :schema_name - AND t.name = :table_name - AND i.name IS NOT NULL - AND i.is_primary_key = 0 - AND i.is_unique_constraint = 0 -ORDER BY i.name; diff --git a/sqlspec/data_dictionary/sql/mssql/indexes.sql b/sqlspec/data_dictionary/sql/mssql/indexes.sql deleted file mode 100644 index 2d6ba5122..000000000 --- a/sqlspec/data_dictionary/sql/mssql/indexes.sql +++ /dev/null @@ -1,50 +0,0 @@ --- name: indexes_by_table --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - i.name AS index_name, - CAST(i.is_unique AS BIT) AS is_unique, - CAST(i.is_primary_key AS BIT) AS is_primary, - STUFF(( - SELECT ',' + c2.name - FROM sys.index_columns ic2 - INNER JOIN sys.columns c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id - WHERE ic2.object_id = i.object_id - AND ic2.index_id = i.index_id - AND ic2.is_included_column = 0 - ORDER BY ic2.key_ordinal - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns -FROM sys.indexes i -INNER JOIN sys.tables t ON i.object_id = t.object_id -INNER JOIN sys.schemas s ON t.schema_id = s.schema_id -WHERE s.name = :schema_name - AND t.name = :table_name - AND i.name IS NOT NULL -ORDER BY i.name; - --- name: indexes_by_schema --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - i.name AS index_name, - CAST(i.is_unique AS BIT) AS is_unique, - CAST(i.is_primary_key AS BIT) AS is_primary, - STUFF(( - SELECT ',' + c2.name - FROM sys.index_columns ic2 - INNER JOIN sys.columns c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id - WHERE ic2.object_id = i.object_id - AND ic2.index_id = i.index_id - AND ic2.is_included_column = 0 - ORDER BY ic2.key_ordinal - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns -FROM sys.indexes i -INNER JOIN sys.tables t ON i.object_id = t.object_id -INNER JOIN sys.schemas s ON t.schema_id = s.schema_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) - AND i.name IS NOT NULL -ORDER BY s.name, t.name, i.name; diff --git a/sqlspec/data_dictionary/sql/mssql/indexes/by_table.sql b/sqlspec/data_dictionary/sql/mssql/indexes/by_table.sql deleted file mode 100644 index 54d89f587..000000000 --- a/sqlspec/data_dictionary/sql/mssql/indexes/by_table.sql +++ /dev/null @@ -1,43 +0,0 @@ --- name: by_table --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - i.name AS index_name, - i.type_desc, - CAST(i.is_unique AS BIT) AS is_unique, - CAST(i.is_primary_key AS BIT) AS is_primary, - CAST(i.is_unique_constraint AS BIT) AS is_unique_constraint, - CAST(i.has_filter AS BIT) AS has_filter, - i.filter_definition, - ds.name AS data_space_name, - ps.name AS partition_scheme_name, - STUFF(( - SELECT ',' + c2.name - FROM sys.index_columns AS ic2 - INNER JOIN sys.columns AS c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_id - WHERE ic2.object_id = i.object_id - AND ic2.index_id = i.index_id - AND ic2.is_included_column = 0 - ORDER BY ic2.key_ordinal - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS columns, - STUFF(( - SELECT ',' + c3.name - FROM sys.index_columns AS ic3 - INNER JOIN sys.columns AS c3 ON ic3.object_id = c3.object_id AND ic3.column_id = c3.column_id - WHERE ic3.object_id = i.object_id - AND ic3.index_id = i.index_id - AND ic3.is_included_column = 1 - ORDER BY ic3.index_column_id - FOR XML PATH(''), TYPE - ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS included_columns -FROM sys.indexes AS i -INNER JOIN sys.tables AS t ON i.object_id = t.object_id -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -LEFT JOIN sys.data_spaces AS ds ON i.data_space_id = ds.data_space_id -LEFT JOIN sys.partition_schemes AS ps ON ds.data_space_id = ps.data_space_id -WHERE s.name = :schema_name - AND t.name = :table_name - AND i.name IS NOT NULL -ORDER BY i.name; diff --git a/sqlspec/data_dictionary/sql/mssql/permissions/role_members.sql b/sqlspec/data_dictionary/sql/mssql/permissions/role_members.sql deleted file mode 100644 index 916b827d6..000000000 --- a/sqlspec/data_dictionary/sql/mssql/permissions/role_members.sql +++ /dev/null @@ -1,10 +0,0 @@ --- name: role_members --- dialect: mssql -SELECT - role_principal.name AS role_name, - member_principal.name AS member_name, - member_principal.type_desc AS member_type -FROM sys.database_role_members AS drm -INNER JOIN sys.database_principals AS role_principal ON drm.role_principal_id = role_principal.principal_id -INNER JOIN sys.database_principals AS member_principal ON drm.member_principal_id = member_principal.principal_id -ORDER BY role_principal.name, member_principal.name; diff --git a/sqlspec/data_dictionary/sql/mssql/routines/by_schema.sql b/sqlspec/data_dictionary/sql/mssql/routines/by_schema.sql deleted file mode 100644 index e68ea45a1..000000000 --- a/sqlspec/data_dictionary/sql/mssql/routines/by_schema.sql +++ /dev/null @@ -1,17 +0,0 @@ --- name: by_schema --- dialect: mssql -SELECT - DB_NAME() AS catalog_name, - s.name AS schema_name, - p.name AS routine_name, - p.type AS routine_type, - p.type_desc, - sm.definition, - p.create_date, - p.modify_date -FROM sys.procedures AS p -INNER JOIN sys.schemas AS s ON p.schema_id = s.schema_id -LEFT JOIN sys.sql_modules AS sm ON p.object_id = sm.object_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) - AND p.is_ms_shipped = 0 -ORDER BY s.name, p.name; diff --git a/sqlspec/data_dictionary/sql/mssql/system/dmv_exec_requests.sql b/sqlspec/data_dictionary/sql/mssql/system/dmv_exec_requests.sql deleted file mode 100644 index 4c99aa1b1..000000000 --- a/sqlspec/data_dictionary/sql/mssql/system/dmv_exec_requests.sql +++ /dev/null @@ -1,20 +0,0 @@ --- name: dmv_exec_requests --- dialect: mssql -/* sqlspec:mssql:dmv_exec_requests */ -SELECT - req.session_id, - sess.login_name, - req.status, - req.command, - req.cpu_time, - req.total_elapsed_time, - req.logical_reads, - req.reads, - req.writes, - DB_NAME(req.database_id) AS database_name, - txt.text AS sql_text -FROM sys.dm_exec_requests AS req -INNER JOIN sys.dm_exec_sessions AS sess ON req.session_id = sess.session_id -OUTER APPLY sys.dm_exec_sql_text(req.sql_handle) AS txt -WHERE req.session_id <> @@SPID -ORDER BY req.total_elapsed_time DESC; diff --git a/sqlspec/data_dictionary/sql/mssql/tables.sql b/sqlspec/data_dictionary/sql/mssql/tables.sql deleted file mode 100644 index b38c9bdba..000000000 --- a/sqlspec/data_dictionary/sql/mssql/tables.sql +++ /dev/null @@ -1,52 +0,0 @@ --- name: tables_by_schema --- dialect: mssql -WITH dependency_tree AS ( - SELECT - s.name AS schema_name, - t.name AS table_name, - t.object_id, - 0 AS level, - CAST(CONCAT('|', t.object_id, '|') AS NVARCHAR(MAX)) AS path - FROM sys.tables t - INNER JOIN sys.schemas s ON t.schema_id = s.schema_id - WHERE (:schema_name IS NULL OR s.name = :schema_name) - AND NOT EXISTS ( - SELECT 1 - FROM sys.foreign_keys fk - WHERE fk.parent_object_id = t.object_id - ) - - UNION ALL - - SELECT - child_schema.name AS schema_name, - child_table.name AS table_name, - child_table.object_id, - dependency_tree.level + 1 AS level, - CAST(CONCAT(dependency_tree.path, child_table.object_id, '|') AS NVARCHAR(MAX)) AS path - FROM sys.foreign_keys fk - INNER JOIN sys.tables child_table ON fk.parent_object_id = child_table.object_id - INNER JOIN sys.schemas child_schema ON child_table.schema_id = child_schema.schema_id - INNER JOIN dependency_tree ON fk.referenced_object_id = dependency_tree.object_id - WHERE (:schema_name IS NULL OR child_schema.name = :schema_name) - AND CHARINDEX(CONCAT('|', child_table.object_id, '|'), dependency_tree.path) = 0 -) -SELECT - schema_name, - table_name, - MAX(level) AS level -FROM dependency_tree -GROUP BY schema_name, table_name -ORDER BY level, schema_name, table_name; - --- name: all_tables_by_schema --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - t.create_date, - t.modify_date -FROM sys.tables t -INNER JOIN sys.schemas s ON t.schema_id = s.schema_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) -ORDER BY s.name, t.name; diff --git a/sqlspec/data_dictionary/sql/mssql/tables/all_by_schema.sql b/sqlspec/data_dictionary/sql/mssql/tables/all_by_schema.sql deleted file mode 100644 index cfeab3746..000000000 --- a/sqlspec/data_dictionary/sql/mssql/tables/all_by_schema.sql +++ /dev/null @@ -1,16 +0,0 @@ --- name: all_by_schema --- dialect: mssql -SELECT - s.name AS schema_name, - t.name AS table_name, - 'BASE TABLE' AS table_type, - DB_NAME() AS table_catalog, - t.create_date, - t.modify_date, - CAST(t.is_memory_optimized AS BIT) AS is_memory_optimized, - CAST(t.temporal_type AS INT) AS temporal_type, - t.temporal_type_desc -FROM sys.tables AS t -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -WHERE (:schema_name IS NULL OR s.name = :schema_name) -ORDER BY s.name, t.name; diff --git a/sqlspec/data_dictionary/sql/mssql/tables/by_schema.sql b/sqlspec/data_dictionary/sql/mssql/tables/by_schema.sql deleted file mode 100644 index 8d31cb4cc..000000000 --- a/sqlspec/data_dictionary/sql/mssql/tables/by_schema.sql +++ /dev/null @@ -1,42 +0,0 @@ --- name: by_schema --- dialect: mssql -WITH dependency_tree AS ( - SELECT - s.name AS schema_name, - t.name AS table_name, - t.object_id, - 0 AS level, - CAST(CONCAT('|', t.object_id, '|') AS NVARCHAR(MAX)) AS path - FROM sys.tables AS t - INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id - WHERE (:schema_name IS NULL OR s.name = :schema_name) - AND NOT EXISTS ( - SELECT 1 - FROM sys.foreign_keys AS fk - WHERE fk.parent_object_id = t.object_id - ) - - UNION ALL - - SELECT - child_schema.name AS schema_name, - child_table.name AS table_name, - child_table.object_id, - dependency_tree.level + 1 AS level, - CAST(CONCAT(dependency_tree.path, child_table.object_id, '|') AS NVARCHAR(MAX)) AS path - FROM sys.foreign_keys AS fk - INNER JOIN sys.tables AS child_table ON fk.parent_object_id = child_table.object_id - INNER JOIN sys.schemas AS child_schema ON child_table.schema_id = child_schema.schema_id - INNER JOIN dependency_tree ON fk.referenced_object_id = dependency_tree.object_id - WHERE (:schema_name IS NULL OR child_schema.name = :schema_name) - AND CHARINDEX(CONCAT('|', child_table.object_id, '|'), dependency_tree.path) = 0 -) -SELECT - schema_name, - table_name, - 'BASE TABLE' AS table_type, - DB_NAME() AS table_catalog, - MAX(level) AS level -FROM dependency_tree -GROUP BY schema_name, table_name -ORDER BY level, schema_name, table_name; diff --git a/sqlspec/data_dictionary/sql/mssql/tables/details_by_table.sql b/sqlspec/data_dictionary/sql/mssql/tables/details_by_table.sql deleted file mode 100644 index 3b9eda5eb..000000000 --- a/sqlspec/data_dictionary/sql/mssql/tables/details_by_table.sql +++ /dev/null @@ -1,23 +0,0 @@ --- name: details_by_table --- dialect: mssql -SELECT - DB_NAME() AS catalog_name, - s.name AS schema_name, - t.name AS table_name, - 'BASE TABLE' AS table_type, - t.create_date, - t.modify_date, - CAST(t.is_memory_optimized AS BIT) AS is_memory_optimized, - CAST(t.durability AS INT) AS durability, - t.durability_desc, - CAST(t.temporal_type AS INT) AS temporal_type, - t.temporal_type_desc, - history_schema.name AS history_schema_name, - history_table.name AS history_table_name -FROM sys.tables AS t -INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id -LEFT JOIN sys.tables AS history_table ON t.history_table_id = history_table.object_id -LEFT JOIN sys.schemas AS history_schema ON history_table.schema_id = history_schema.schema_id -WHERE s.name = :schema_name - AND t.name = :table_name -ORDER BY s.name, t.name; diff --git a/sqlspec/data_dictionary/sql/mysql/columns.sql b/sqlspec/data_dictionary/sql/mysql/columns.sql deleted file mode 100644 index cdf3a0164..000000000 --- a/sqlspec/data_dictionary/sql/mysql/columns.sql +++ /dev/null @@ -1,23 +0,0 @@ --- name: columns_by_table --- dialect: mysql -SELECT - column_name AS `column_name`, - data_type AS `data_type`, - is_nullable AS `is_nullable`, - column_default AS `column_default` -FROM information_schema.columns -WHERE table_name = :table_name - AND table_schema = COALESCE(:schema_name, DATABASE()) -ORDER BY ordinal_position; - --- name: columns_by_schema --- dialect: mysql -SELECT - table_name AS `table_name`, - column_name AS `column_name`, - data_type AS `data_type`, - is_nullable AS `is_nullable`, - column_default AS `column_default` -FROM information_schema.columns -WHERE table_schema = COALESCE(:schema_name, DATABASE()) -ORDER BY table_name, ordinal_position; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_event.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_event.sql deleted file mode 100644 index ff1dea047..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_event.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_event --- dialect: mysql -SELECT 'SHOW CREATE EVENT' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_function.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_function.sql deleted file mode 100644 index af66f10d9..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_function.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_function --- dialect: mysql -SELECT 'SHOW CREATE FUNCTION' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_procedure.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_procedure.sql deleted file mode 100644 index 47854afdf..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_procedure.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_procedure --- dialect: mysql -SELECT 'SHOW CREATE PROCEDURE' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_table.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_table.sql deleted file mode 100644 index 084d4263d..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_table.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_table --- dialect: mysql -SELECT 'SHOW CREATE TABLE' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_trigger.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_trigger.sql deleted file mode 100644 index ea89440c9..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_trigger.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_trigger --- dialect: mysql -SELECT 'SHOW CREATE TRIGGER' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_view.sql b/sqlspec/data_dictionary/sql/mysql/ddl/show_create_view.sql deleted file mode 100644 index 8b314a07c..000000000 --- a/sqlspec/data_dictionary/sql/mysql/ddl/show_create_view.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: show_create_view --- dialect: mysql -SELECT 'SHOW CREATE VIEW' AS statement_template; diff --git a/sqlspec/data_dictionary/sql/mysql/indexes.sql b/sqlspec/data_dictionary/sql/mysql/indexes.sql deleted file mode 100644 index e9d799885..000000000 --- a/sqlspec/data_dictionary/sql/mysql/indexes.sql +++ /dev/null @@ -1,26 +0,0 @@ --- name: indexes_by_table --- dialect: mysql -SELECT - s.index_name AS index_name, - s.table_name AS table_name, - CASE WHEN s.non_unique = 0 THEN 1 ELSE 0 END AS is_unique, - CASE WHEN s.index_name = 'PRIMARY' THEN 1 ELSE 0 END AS is_primary, - GROUP_CONCAT(s.column_name ORDER BY s.seq_in_index) AS columns -FROM information_schema.statistics s -WHERE s.table_schema = COALESCE(:schema_name, DATABASE()) - AND s.table_name = :table_name -GROUP BY s.index_name, s.table_name, s.non_unique -ORDER BY s.index_name; - --- name: indexes_by_schema --- dialect: mysql -SELECT - s.index_name AS index_name, - s.table_name AS table_name, - CASE WHEN s.non_unique = 0 THEN 1 ELSE 0 END AS is_unique, - CASE WHEN s.index_name = 'PRIMARY' THEN 1 ELSE 0 END AS is_primary, - GROUP_CONCAT(s.column_name ORDER BY s.seq_in_index) AS columns -FROM information_schema.statistics s -WHERE s.table_schema = COALESCE(:schema_name, DATABASE()) -GROUP BY s.index_name, s.table_name, s.non_unique -ORDER BY s.table_name, s.index_name; diff --git a/sqlspec/data_dictionary/sql/mysql/system/performance_schema_tables.sql b/sqlspec/data_dictionary/sql/mysql/system/performance_schema_tables.sql deleted file mode 100644 index b6092a796..000000000 --- a/sqlspec/data_dictionary/sql/mysql/system/performance_schema_tables.sql +++ /dev/null @@ -1,12 +0,0 @@ --- name: performance_schema_tables --- dialect: mysql -SELECT - table_schema, - table_name, - table_rows, - avg_row_length, - data_length, - index_length -FROM information_schema.tables -WHERE table_schema = 'performance_schema' -ORDER BY table_name; diff --git a/sqlspec/data_dictionary/sql/mysql/tables.sql b/sqlspec/data_dictionary/sql/mysql/tables.sql deleted file mode 100644 index 23bf744e5..000000000 --- a/sqlspec/data_dictionary/sql/mysql/tables.sql +++ /dev/null @@ -1,36 +0,0 @@ --- name: tables_by_schema --- dialect: mysql -WITH RECURSIVE dependency_tree AS ( - SELECT - table_name, - 0 AS level, - CAST(table_name AS CHAR(4000)) AS path - FROM information_schema.tables t - WHERE t.table_type = 'BASE TABLE' - AND t.table_schema = COALESCE(:schema_name, DATABASE()) - AND NOT EXISTS ( - SELECT 1 - FROM information_schema.key_column_usage kcu - WHERE kcu.table_name = t.table_name - AND kcu.table_schema = t.table_schema - AND kcu.referenced_table_name IS NOT NULL - ) - - UNION ALL - - SELECT - kcu.table_name, - dt.level + 1, - CONCAT(dt.path, ',', kcu.table_name) - FROM information_schema.key_column_usage kcu - JOIN dependency_tree dt ON kcu.referenced_table_name = dt.table_name - WHERE kcu.table_schema = COALESCE(:schema_name, DATABASE()) - AND kcu.referenced_table_name IS NOT NULL - AND NOT FIND_IN_SET(kcu.table_name, dt.path) -) -SELECT - table_name, - MIN(level) AS level -FROM dependency_tree -GROUP BY table_name -ORDER BY level, table_name; diff --git a/sqlspec/data_dictionary/sql/mysql/tables/by_schema.sql b/sqlspec/data_dictionary/sql/mysql/tables/by_schema.sql deleted file mode 100644 index a1e847650..000000000 --- a/sqlspec/data_dictionary/sql/mysql/tables/by_schema.sql +++ /dev/null @@ -1,27 +0,0 @@ --- name: by_schema --- dialect: mysql -SELECT - table_schema AS schema_name, - table_name, - table_type, - engine, - version, - row_format, - table_rows, - avg_row_length, - data_length, - max_data_length, - index_length, - data_free, - auto_increment, - create_time, - update_time, - check_time, - table_collation, - checksum, - create_options, - table_comment -FROM information_schema.tables -WHERE table_schema = COALESCE(:schema_name, DATABASE()) - AND (:table_name IS NULL OR table_name = :table_name) -ORDER BY table_schema, table_name; diff --git a/sqlspec/data_dictionary/sql/oracle/columns.sql b/sqlspec/data_dictionary/sql/oracle/columns.sql deleted file mode 100644 index 3a2da192e..000000000 --- a/sqlspec/data_dictionary/sql/oracle/columns.sql +++ /dev/null @@ -1,31 +0,0 @@ --- name: columns_by_table --- dialect: oracle -SELECT - column_name AS column_name, - data_type AS data_type, - nullable AS is_nullable, - data_default AS column_default, - column_id AS ordinal_position, - hidden_column, - virtual_column, - identity_column -FROM all_tab_cols -WHERE owner = COALESCE(:schema_name, USER) - AND table_name = :table_name -ORDER BY column_id; - --- name: columns_by_schema --- dialect: oracle -SELECT - table_name, - column_name AS column_name, - data_type AS data_type, - nullable AS is_nullable, - data_default AS column_default, - column_id AS ordinal_position, - hidden_column, - virtual_column, - identity_column -FROM all_tab_cols -WHERE owner = COALESCE(:schema_name, USER) -ORDER BY table_name, column_id; diff --git a/sqlspec/data_dictionary/sql/oracle/indexes.sql b/sqlspec/data_dictionary/sql/oracle/indexes.sql deleted file mode 100644 index becf36482..000000000 --- a/sqlspec/data_dictionary/sql/oracle/indexes.sql +++ /dev/null @@ -1,44 +0,0 @@ --- name: indexes_by_table --- dialect: oracle -SELECT - i.index_name, - i.table_name AS table_name, - CASE WHEN i.uniqueness = 'UNIQUE' THEN 1 ELSE 0 END AS is_unique, - CASE - WHEN MAX(CASE WHEN c.constraint_type = 'P' THEN 1 ELSE 0 END) = 1 THEN 1 - ELSE 0 - END AS is_primary, - LISTAGG(ic.column_name, ',') WITHIN GROUP (ORDER BY ic.column_position) AS columns -FROM all_indexes i -JOIN all_ind_columns ic - ON i.owner = ic.index_owner - AND i.index_name = ic.index_name -LEFT JOIN all_constraints c - ON c.owner = i.owner - AND c.index_name = i.index_name - AND c.constraint_type = 'P' -WHERE i.table_name = :table_name - AND i.owner = COALESCE(:schema_name, USER) -GROUP BY i.index_name, i.table_name, i.uniqueness; - --- name: indexes_by_schema --- dialect: oracle -SELECT - i.index_name, - i.table_name AS table_name, - CASE WHEN i.uniqueness = 'UNIQUE' THEN 1 ELSE 0 END AS is_unique, - CASE - WHEN MAX(CASE WHEN c.constraint_type = 'P' THEN 1 ELSE 0 END) = 1 THEN 1 - ELSE 0 - END AS is_primary, - LISTAGG(ic.column_name, ',') WITHIN GROUP (ORDER BY ic.column_position) AS columns -FROM all_indexes i -JOIN all_ind_columns ic - ON i.owner = ic.index_owner - AND i.index_name = ic.index_name -LEFT JOIN all_constraints c - ON c.owner = i.owner - AND c.index_name = i.index_name - AND c.constraint_type = 'P' -WHERE i.owner = COALESCE(:schema_name, USER) -GROUP BY i.index_name, i.table_name, i.uniqueness; diff --git a/sqlspec/data_dictionary/sql/oracle/system/awr.sql b/sqlspec/data_dictionary/sql/oracle/system/awr.sql deleted file mode 100644 index a4c17a9d7..000000000 --- a/sqlspec/data_dictionary/sql/oracle/system/awr.sql +++ /dev/null @@ -1,10 +0,0 @@ --- name: awr --- dialect: oracle -SELECT - :acknowledge_license AS license_acknowledged, - :include_diagnostics AS diagnostics_enabled, - 'DBA_HIST_SNAPSHOT' AS required_view, - 'AWR/ASH/ADDM and DBA_HIST access requires explicit opt-in, privileges, and license acknowledgement.' AS warning -FROM dual -WHERE :include_diagnostics = 1 - AND :acknowledge_license = 1; diff --git a/sqlspec/data_dictionary/sql/oracle/system/no_diagnostics.sql b/sqlspec/data_dictionary/sql/oracle/system/no_diagnostics.sql deleted file mode 100644 index 37e039049..000000000 --- a/sqlspec/data_dictionary/sql/oracle/system/no_diagnostics.sql +++ /dev/null @@ -1,7 +0,0 @@ --- name: no_diagnostics --- dialect: oracle -SELECT - 0 AS diagnostics_enabled, - 'disabled' AS diagnostics_mode, - 'Oracle diagnostics, AWR/ASH/ADDM, Statspack, and DBA_HIST queries are disabled by default.' AS warning -FROM dual; diff --git a/sqlspec/data_dictionary/sql/oracle/system/statspack.sql b/sqlspec/data_dictionary/sql/oracle/system/statspack.sql deleted file mode 100644 index 0f9b0b972..000000000 --- a/sqlspec/data_dictionary/sql/oracle/system/statspack.sql +++ /dev/null @@ -1,10 +0,0 @@ --- name: statspack --- dialect: oracle -SELECT - :acknowledge_license AS license_acknowledged, - :include_diagnostics AS diagnostics_enabled, - 'STATS$SNAPSHOT' AS required_view, - 'Statspack access requires explicit opt-in and privileges.' AS warning -FROM dual -WHERE :include_diagnostics = 1 - AND :acknowledge_license = 1; diff --git a/sqlspec/data_dictionary/sql/oracle/tables.sql b/sqlspec/data_dictionary/sql/oracle/tables.sql deleted file mode 100644 index 97d84e070..000000000 --- a/sqlspec/data_dictionary/sql/oracle/tables.sql +++ /dev/null @@ -1,25 +0,0 @@ --- name: tables_by_schema --- dialect: oracle -SELECT - table_name, - MAX(LEVEL) AS dependency_level -FROM all_constraints -WHERE owner = COALESCE(:schema_name, USER) -START WITH table_name NOT IN ( - SELECT table_name - FROM all_constraints - WHERE constraint_type = 'R' - AND owner = COALESCE(:schema_name, USER) -) -CONNECT BY NOCYCLE PRIOR constraint_name = r_constraint_name - AND PRIOR owner = owner -GROUP BY table_name -ORDER BY dependency_level, table_name; - --- name: all_tables_by_schema --- dialect: oracle -SELECT - table_name -FROM all_tables -WHERE owner = COALESCE(:schema_name, USER) -ORDER BY table_name; diff --git a/sqlspec/data_dictionary/sql/postgres/columns.sql b/sqlspec/data_dictionary/sql/postgres/columns.sql deleted file mode 100644 index 9f964712f..000000000 --- a/sqlspec/data_dictionary/sql/postgres/columns.sql +++ /dev/null @@ -1,34 +0,0 @@ --- name: columns_by_table --- dialect: postgres -SELECT - a.attname::text AS column_name, - pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, - CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, - pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default -FROM pg_catalog.pg_attribute a -JOIN pg_catalog.pg_class c ON a.attrelid = c.oid -JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid -LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum -WHERE c.relname = :table_name - AND n.nspname = :schema_name - AND a.attnum > 0 - AND NOT a.attisdropped -ORDER BY a.attnum; - --- name: columns_by_schema --- dialect: postgres -SELECT - n.nspname::text AS schema_name, - c.relname::text AS table_name, - a.attname::text AS column_name, - pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type, - CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END AS is_nullable, - pg_catalog.pg_get_expr(d.adbin, d.adrelid)::text AS column_default -FROM pg_catalog.pg_attribute a -JOIN pg_catalog.pg_class c ON a.attrelid = c.oid -JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid -LEFT JOIN pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum -WHERE n.nspname = :schema_name - AND a.attnum > 0 - AND NOT a.attisdropped -ORDER BY c.relname, a.attnum; diff --git a/sqlspec/data_dictionary/sql/postgres/indexes.sql b/sqlspec/data_dictionary/sql/postgres/indexes.sql deleted file mode 100644 index 8bfa3f0c1..000000000 --- a/sqlspec/data_dictionary/sql/postgres/indexes.sql +++ /dev/null @@ -1,56 +0,0 @@ --- name: indexes_by_table --- dialect: postgres -SELECT - i.relname as index_name, - t.relname as table_name, - ix.indisunique as is_unique, - ix.indisprimary as is_primary, - array_agg(a.attname::text ORDER BY array_position(ix.indkey, a.attnum)) as columns -FROM - pg_class t, - pg_class i, - pg_index ix, - pg_attribute a, - pg_namespace n -WHERE - t.oid = ix.indrelid - AND i.oid = ix.indexrelid - AND a.attrelid = t.oid - AND a.attnum = ANY(ix.indkey) - AND t.relkind = 'r' - AND t.relnamespace = n.oid - AND n.nspname = :schema_name - AND t.relname = :table_name -GROUP BY - t.relname, - i.relname, - ix.indisunique, - ix.indisprimary; - --- name: indexes_by_schema --- dialect: postgres -SELECT - i.relname as index_name, - t.relname as table_name, - ix.indisunique as is_unique, - ix.indisprimary as is_primary, - array_agg(a.attname::text ORDER BY array_position(ix.indkey, a.attnum)) as columns -FROM - pg_class t, - pg_class i, - pg_index ix, - pg_attribute a, - pg_namespace n -WHERE - t.oid = ix.indrelid - AND i.oid = ix.indexrelid - AND a.attrelid = t.oid - AND a.attnum = ANY(ix.indkey) - AND t.relkind = 'r' - AND t.relnamespace = n.oid - AND n.nspname = :schema_name -GROUP BY - t.relname, - i.relname, - ix.indisunique, - ix.indisprimary; diff --git a/sqlspec/data_dictionary/sql/postgres/system/pg_stat_statements.sql b/sqlspec/data_dictionary/sql/postgres/system/pg_stat_statements.sql deleted file mode 100644 index 5d8bb3fe6..000000000 --- a/sqlspec/data_dictionary/sql/postgres/system/pg_stat_statements.sql +++ /dev/null @@ -1,14 +0,0 @@ --- name: pg_stat_statements --- dialect: postgres -SELECT - userid::text AS user_oid, - dbid::text AS database_oid, - queryid::text AS query_id, - query::text AS query_text, - calls, - total_exec_time, - mean_exec_time, - rows -FROM pg_catalog.pg_stat_statements -ORDER BY total_exec_time DESC -LIMIT :limit; diff --git a/sqlspec/data_dictionary/sql/postgres/system/settings.sql b/sqlspec/data_dictionary/sql/postgres/system/settings.sql deleted file mode 100644 index 5247217c3..000000000 --- a/sqlspec/data_dictionary/sql/postgres/system/settings.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: settings --- dialect: postgres -SELECT - name::text AS setting_name, - setting::text AS setting_value, - unit::text AS unit, - category::text AS category, - context::text AS context, - vartype::text AS value_type, - source::text AS source, - boot_val::text AS boot_value, - reset_val::text AS reset_value, - pending_restart -FROM pg_catalog.pg_settings -ORDER BY name; diff --git a/sqlspec/data_dictionary/sql/postgres/system/table_stats.sql b/sqlspec/data_dictionary/sql/postgres/system/table_stats.sql deleted file mode 100644 index 73165e816..000000000 --- a/sqlspec/data_dictionary/sql/postgres/system/table_stats.sql +++ /dev/null @@ -1,22 +0,0 @@ --- name: table_stats --- dialect: postgres -SELECT - schemaname::text AS schema_name, - relname::text AS table_name, - seq_scan, - seq_tup_read, - idx_scan, - idx_tup_fetch, - n_tup_ins, - n_tup_upd, - n_tup_del, - n_live_tup, - n_dead_tup, - vacuum_count, - autovacuum_count, - analyze_count, - autoanalyze_count -FROM pg_catalog.pg_stat_user_tables -WHERE (:schema_name::text IS NULL OR schemaname = :schema_name) - AND (:table_name::text IS NULL OR relname = :table_name) -ORDER BY schemaname, relname; diff --git a/sqlspec/data_dictionary/sql/postgres/tables.sql b/sqlspec/data_dictionary/sql/postgres/tables.sql deleted file mode 100644 index f20f94172..000000000 --- a/sqlspec/data_dictionary/sql/postgres/tables.sql +++ /dev/null @@ -1,44 +0,0 @@ --- name: tables_by_schema --- dialect: postgres -WITH RECURSIVE dependency_tree AS ( - SELECT - t.table_name::text, - 0 AS level, - ARRAY[t.table_name::text] AS path - FROM information_schema.tables t - WHERE t.table_type = 'BASE TABLE' - AND t.table_schema = :schema_name - AND NOT EXISTS ( - SELECT 1 - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - WHERE tc.constraint_type = 'FOREIGN KEY' - AND tc.table_name = t.table_name - AND tc.table_schema = t.table_schema - ) - - UNION ALL - - SELECT - tc.table_name::text, - dt.level + 1, - dt.path || tc.table_name::text - FROM information_schema.table_constraints tc - JOIN information_schema.key_column_usage kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - JOIN information_schema.constraint_column_usage ccu - ON ccu.constraint_name = tc.constraint_name - AND ccu.table_schema = tc.table_schema - JOIN dependency_tree dt - ON ccu.table_name = dt.table_name - WHERE tc.constraint_type = 'FOREIGN KEY' - AND tc.table_schema = :schema_name - AND ccu.table_schema = :schema_name - AND NOT (tc.table_name = ANY(dt.path)) -) -SELECT DISTINCT table_name, level -FROM dependency_tree -ORDER BY level, table_name; diff --git a/sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/list.sql b/sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/list.sql deleted file mode 100644 index b4d104243..000000000 --- a/sqlspec/data_dictionary/sql/spanner/change_streams/googlesql/list.sql +++ /dev/null @@ -1,12 +0,0 @@ --- name: list --- dialect: spanner -SELECT - CHANGE_STREAM_CATALOG, - CHANGE_STREAM_SCHEMA, - CHANGE_STREAM_NAME, - ALL_TABLES, - CHANGE_STREAM_FOR_CLAUSE -FROM INFORMATION_SCHEMA.CHANGE_STREAMS -WHERE (CAST(:schema_name AS STRING) IS NULL OR CHANGE_STREAM_SCHEMA = :schema_name) - AND (CAST(:change_stream_name AS STRING) IS NULL OR CHANGE_STREAM_NAME = :change_stream_name) -ORDER BY CHANGE_STREAM_SCHEMA, CHANGE_STREAM_NAME; diff --git a/sqlspec/data_dictionary/sql/spanner/routines/googlesql/parameters_by_schema.sql b/sqlspec/data_dictionary/sql/spanner/routines/googlesql/parameters_by_schema.sql deleted file mode 100644 index c2a2be1a8..000000000 --- a/sqlspec/data_dictionary/sql/spanner/routines/googlesql/parameters_by_schema.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: parameters_by_schema --- dialect: spanner -SELECT - SPECIFIC_CATALOG, - SPECIFIC_SCHEMA, - SPECIFIC_NAME, - ORDINAL_POSITION, - PARAMETER_MODE, - IS_RESULT, - PARAMETER_NAME, - DATA_TYPE -FROM INFORMATION_SCHEMA.PARAMETERS -WHERE (CAST(:schema_name AS STRING) IS NULL OR SPECIFIC_SCHEMA = :schema_name) - AND (CAST(:routine_name AS STRING) IS NULL OR SPECIFIC_NAME = :routine_name) -ORDER BY SPECIFIC_SCHEMA, SPECIFIC_NAME, ORDINAL_POSITION; diff --git a/sqlspec/data_dictionary/sql/spanner/system/googlesql/table_sizes.sql b/sqlspec/data_dictionary/sql/spanner/system/googlesql/table_sizes.sql deleted file mode 100644 index 952f7c733..000000000 --- a/sqlspec/data_dictionary/sql/spanner/system/googlesql/table_sizes.sql +++ /dev/null @@ -1,11 +0,0 @@ --- name: table_sizes --- dialect: spanner -SELECT - INTERVAL_END, - TABLE_NAME, - USED_BYTES -FROM SPANNER_SYS.TABLE_SIZES_STATS_1HOUR -WHERE (CAST(:table_name AS STRING) IS NULL OR TABLE_NAME = :table_name) - AND (CAST(:interval_end_after AS TIMESTAMP) IS NULL OR INTERVAL_END >= :interval_end_after) -ORDER BY INTERVAL_END DESC, TABLE_NAME -LIMIT :limit; diff --git a/sqlspec/data_dictionary/sql/sqlite/columns.sql b/sqlspec/data_dictionary/sql/sqlite/columns.sql deleted file mode 100644 index ed07bbbfb..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/columns.sql +++ /dev/null @@ -1,23 +0,0 @@ --- name: columns_by_table --- dialect: sqlite -SELECT - name AS column_name, - type AS data_type, - CASE WHEN "notnull" THEN 'NO' ELSE 'YES' END AS is_nullable, - dflt_value AS column_default -FROM pragma_table_info({table_name}) -ORDER BY cid; - --- name: columns_by_schema --- dialect: sqlite -SELECT - m.name AS table_name, - ti.name AS column_name, - ti.type AS data_type, - CASE WHEN ti."notnull" THEN 'NO' ELSE 'YES' END AS is_nullable, - ti.dflt_value AS column_default -FROM {schema_prefix}sqlite_schema m -JOIN pragma_table_info(m.name) AS ti -WHERE m.type = 'table' - AND m.name NOT LIKE 'sqlite_%' -ORDER BY m.name, ti.cid; diff --git a/sqlspec/data_dictionary/sql/sqlite/columns/by_table.sql b/sqlspec/data_dictionary/sql/sqlite/columns/by_table.sql deleted file mode 100644 index 899613c83..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/columns/by_table.sql +++ /dev/null @@ -1,18 +0,0 @@ --- name: by_table --- dialect: sqlite -SELECT - :schema_name AS schema_name, - :table_name AS table_name, - ti.name AS column_name, - ti.type AS data_type, - CASE WHEN ti."notnull" THEN 'NO' ELSE 'YES' END AS is_nullable, - ti.dflt_value AS column_default, - ti.cid + 1 AS ordinal_position, - ti.pk AS is_primary, - CASE - WHEN ti.hidden = 1 THEN 'hidden' - WHEN ti.hidden IN (2, 3) THEN 'generated' - ELSE NULL - END AS extra -FROM pragma_table_xinfo(:table_name, :schema_name) AS ti -ORDER BY ti.cid; diff --git a/sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_table.sql b/sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_table.sql deleted file mode 100644 index 292d9553f..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/constraints/foreign_keys_by_table.sql +++ /dev/null @@ -1,15 +0,0 @@ --- name: foreign_keys_by_table --- dialect: sqlite -SELECT - :schema_name AS schema_name, - :table_name AS table_name, - fk."from" AS column_name, - fk."table" AS referenced_table_name, - fk."to" AS referenced_column_name, - fk.id AS constraint_name, - fk.seq AS ordinal_position, - fk.on_update, - fk.on_delete, - fk.match -FROM pragma_foreign_key_list(:table_name, :schema_name) AS fk -ORDER BY fk.id, fk.seq; diff --git a/sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql b/sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql deleted file mode 100644 index 7d9b2dc78..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +++ /dev/null @@ -1,22 +0,0 @@ --- name: foreign_keys_by_table --- dialect: sqlite -SELECT - '{table_label}' AS table_name, - fk."from" AS column_name, - fk."table" AS referenced_table_name, - fk."to" AS referenced_column_name, - fk.id AS constraint_name -FROM pragma_foreign_key_list({table_name}) AS fk; - --- name: foreign_keys_by_schema --- dialect: sqlite -SELECT - m.name AS table_name, - fk."from" AS column_name, - fk."table" AS referenced_table_name, - fk."to" AS referenced_column_name, - fk.id AS constraint_name -FROM {schema_prefix}sqlite_schema m -JOIN pragma_foreign_key_list(m.name) AS fk -WHERE m.type = 'table' - AND m.name NOT LIKE 'sqlite_%'; diff --git a/sqlspec/data_dictionary/sql/sqlite/indexes.sql b/sqlspec/data_dictionary/sql/sqlite/indexes.sql deleted file mode 100644 index 2b273437a..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/indexes.sql +++ /dev/null @@ -1,7 +0,0 @@ --- name: indexes_by_table --- dialect: sqlite -PRAGMA index_list({table_name}); - --- name: index_columns_by_index --- dialect: sqlite -PRAGMA index_info({index_name}); diff --git a/sqlspec/data_dictionary/sql/sqlite/indexes/by_schema.sql b/sqlspec/data_dictionary/sql/sqlite/indexes/by_schema.sql deleted file mode 100644 index 27bfa28fb..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/indexes/by_schema.sql +++ /dev/null @@ -1,28 +0,0 @@ --- name: by_schema --- dialect: sqlite -SELECT - tl.schema AS schema_name, - tl.name AS table_name, - il.name AS index_name, - il."unique" AS is_unique, - CASE WHEN il.origin = 'pk' THEN 1 ELSE 0 END AS is_primary, - il.origin, - il.partial AS is_partial, - ix.seqno, - ix.cid AS column_id, - ix.name AS column_name, - ix.desc AS is_descending, - ix.coll AS collation, - ix.key AS is_key_column, - sm.sql AS index_sql -FROM pragma_table_list AS tl -JOIN pragma_index_list(tl.name, COALESCE(:schema_name, 'main')) AS il -JOIN pragma_index_xinfo(il.name, COALESCE(:schema_name, 'main')) AS ix -LEFT JOIN {schema_prefix}sqlite_schema AS sm - ON sm.type = 'index' - AND sm.name = il.name -WHERE tl.schema = COALESCE(:schema_name, 'main') - AND tl.type IN ('table', 'virtual') - AND tl.name NOT LIKE 'sqlite_%' - AND il.name NOT LIKE 'sqlite_%' -ORDER BY tl.name, il.seq, ix.seqno; diff --git a/sqlspec/data_dictionary/sql/sqlite/indexes/by_table.sql b/sqlspec/data_dictionary/sql/sqlite/indexes/by_table.sql deleted file mode 100644 index b6c56faa2..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/indexes/by_table.sql +++ /dev/null @@ -1,24 +0,0 @@ --- name: by_table --- dialect: sqlite -SELECT - :schema_name AS schema_name, - :table_name AS table_name, - il.name AS index_name, - il."unique" AS is_unique, - CASE WHEN il.origin = 'pk' THEN 1 ELSE 0 END AS is_primary, - il.origin, - il.partial AS is_partial, - ix.seqno, - ix.cid AS column_id, - ix.name AS column_name, - ix.desc AS is_descending, - ix.coll AS collation, - ix.key AS is_key_column, - sm.sql AS index_sql -FROM pragma_index_list(:table_name, :schema_name) AS il -JOIN pragma_index_xinfo(il.name, :schema_name) AS ix -LEFT JOIN {schema_prefix}sqlite_schema AS sm - ON sm.type = 'index' - AND sm.name = il.name -WHERE il.name NOT LIKE 'sqlite_%' -ORDER BY il.seq, ix.seqno; diff --git a/sqlspec/data_dictionary/sql/sqlite/indexes/columns_by_index.sql b/sqlspec/data_dictionary/sql/sqlite/indexes/columns_by_index.sql deleted file mode 100644 index 452654817..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/indexes/columns_by_index.sql +++ /dev/null @@ -1,13 +0,0 @@ --- name: columns_by_index --- dialect: sqlite -SELECT - :schema_name AS schema_name, - :index_name AS index_name, - ix.seqno, - ix.cid AS column_id, - ix.name AS column_name, - ix.desc AS is_descending, - ix.coll AS collation, - ix.key AS is_key_column -FROM pragma_index_xinfo(:index_name, :schema_name) AS ix -ORDER BY ix.seqno; diff --git a/sqlspec/data_dictionary/sql/sqlite/system/integrity_check.sql b/sqlspec/data_dictionary/sql/sqlite/system/integrity_check.sql deleted file mode 100644 index 1ce3c5e8c..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/system/integrity_check.sql +++ /dev/null @@ -1,3 +0,0 @@ --- name: integrity_check --- dialect: sqlite -PRAGMA integrity_check; diff --git a/sqlspec/data_dictionary/sql/sqlite/tables.sql b/sqlspec/data_dictionary/sql/sqlite/tables.sql deleted file mode 100644 index c3c40ef25..000000000 --- a/sqlspec/data_dictionary/sql/sqlite/tables.sql +++ /dev/null @@ -1,28 +0,0 @@ --- name: tables_by_schema --- dialect: sqlite -WITH RECURSIVE dependency_tree AS ( - SELECT - m.name as table_name, - 0 as level, - '/' || m.name || '/' as path - FROM {schema_prefix}sqlite_schema m - WHERE m.type = 'table' - AND m.name NOT LIKE 'sqlite_%' - AND NOT EXISTS ( - SELECT 1 FROM pragma_foreign_key_list(m.name) - ) - - UNION ALL - - SELECT - m.name as table_name, - dt.level + 1, - dt.path || m.name || '/' - FROM {schema_prefix}sqlite_schema m - JOIN pragma_foreign_key_list(m.name) fk - JOIN dependency_tree dt ON fk."table" = dt.table_name - WHERE m.type = 'table' - AND m.name NOT LIKE 'sqlite_%' - AND instr(dt.path, '/' || m.name || '/') = 0 -) -SELECT DISTINCT table_name FROM dependency_tree ORDER BY level, table_name; diff --git a/sqlspec/driver/_common.py b/sqlspec/driver/_common.py index 70e557d79..3e5b2d618 100644 --- a/sqlspec/driver/_common.py +++ b/sqlspec/driver/_common.py @@ -392,20 +392,23 @@ def get_dialect_config(self) -> "DialectConfig": """Return the dialect configuration for this data dictionary.""" return get_dialect_config(type(self).dialect) - def get_query(self, name: str) -> "SQL": - """Return a named SQL query for this dialect.""" + def get_query(self, domain: str, operation: str, *, mode: str | None = None) -> "SQL": + """Return an exact domain query for this dialect.""" loader = get_data_dictionary_loader() - return loader.get_query(type(self).dialect, name) + query = loader.get_domain_query(type(self).dialect, domain, operation, mode=mode) + if query.sql is None: + msg = f"No data-dictionary query found for {type(self).dialect}/{domain}/{operation}" + raise SQLFileNotFoundError(msg) + return query.sql - def get_query_text(self, name: str) -> str: - """Return raw SQL text for a named query for this dialect.""" - loader = get_data_dictionary_loader() - return loader.get_query_text(type(self).dialect, name) + def get_query_text(self, domain: str, operation: str, *, mode: str | None = None) -> str: + """Return raw SQL text for an exact domain query.""" + return self.get_query(domain, operation, mode=mode).raw_sql - def get_query_text_or_none(self, name: str) -> "str | None": + def get_query_text_or_none(self, domain: str, operation: str, *, mode: str | None = None) -> "str | None": """Return raw SQL text for a named query or None if missing.""" try: - return self.get_query_text(name) + return self.get_query_text(domain, operation, mode=mode) except SQLFileNotFoundError: return None diff --git a/tests/unit/adapters/test_arrow_odbc/test_driver.py b/tests/unit/adapters/test_arrow_odbc/test_driver.py index 36d812024..5d6068b31 100644 --- a/tests/unit/adapters/test_arrow_odbc/test_driver.py +++ b/tests/unit/adapters/test_arrow_odbc/test_driver.py @@ -215,8 +215,8 @@ def read_arrow_batches(**kwargs: Any) -> FakeReader: connection.read_arrow_batches = read_arrow_batches # type: ignore[assignment] - def fail_get_query(self: ArrowOdbcDataDictionary, name: str) -> Any: - raise SQLFileNotFoundError(name) + def fail_get_query(self: ArrowOdbcDataDictionary, domain: str, operation: str) -> Any: + raise SQLFileNotFoundError(f"{domain}/{operation}") monkeypatch.setattr(ArrowOdbcDataDictionary, "get_query", fail_get_query) @@ -238,8 +238,8 @@ def read_arrow_batches(**kwargs: Any) -> FakeReader: connection.read_arrow_batches = read_arrow_batches # type: ignore[assignment] - def fail_get_query(self: ArrowOdbcDataDictionary, name: str) -> Any: - raise SQLFileNotFoundError(name) + def fail_get_query(self: ArrowOdbcDataDictionary, domain: str, operation: str) -> Any: + raise SQLFileNotFoundError(f"{domain}/{operation}") monkeypatch.setattr(ArrowOdbcDataDictionary, "get_query", fail_get_query) @@ -254,8 +254,8 @@ def test_get_columns_schema_wide_does_not_probe(monkeypatch: pytest.MonkeyPatch) connection = FakeConnection() driver = ArrowOdbcDriver(cast("ArrowOdbcConnection", connection), driver_features={"chunk_size": 2}) - def fail_get_query(self: ArrowOdbcDataDictionary, name: str) -> Any: - raise SQLFileNotFoundError(name) + def fail_get_query(self: ArrowOdbcDataDictionary, domain: str, operation: str) -> Any: + raise SQLFileNotFoundError(f"{domain}/{operation}") monkeypatch.setattr(ArrowOdbcDataDictionary, "get_query", fail_get_query) @@ -270,8 +270,8 @@ def test_get_columns_probe_failure_returns_empty(monkeypatch: pytest.MonkeyPatch connection = ErrorConnection() driver = ArrowOdbcDriver(cast("ArrowOdbcConnection", connection), driver_features={"chunk_size": 2}) - def fail_get_query(self: ArrowOdbcDataDictionary, name: str) -> Any: - raise SQLFileNotFoundError(name) + def fail_get_query(self: ArrowOdbcDataDictionary, domain: str, operation: str) -> Any: + raise SQLFileNotFoundError(f"{domain}/{operation}") monkeypatch.setattr(ArrowOdbcDataDictionary, "get_query", fail_get_query) diff --git a/tests/unit/adapters/test_mssql_python/test_data_dictionary.py b/tests/unit/adapters/test_mssql_python/test_data_dictionary.py index 1484adb38..421f5f313 100644 --- a/tests/unit/adapters/test_mssql_python/test_data_dictionary.py +++ b/tests/unit/adapters/test_mssql_python/test_data_dictionary.py @@ -5,7 +5,7 @@ from sqlspec.adapters.mssql_python.data_dictionary import MssqlPythonSyncDataDictionary, MssqlVersionInfo -MSSQL_QUERY_DIR = Path("sqlspec/data_dictionary/sql/mssql") +MSSQL_QUERY_DIR = Path("sqlspec/data_dictionary/dialects/mssql/sql") EXPECTED_MSSQL_QUERY_FILES = {"columns.sql", "foreign_keys.sql", "indexes.sql", "tables.sql", "version.sql"} @@ -36,7 +36,7 @@ def select(self, statement: Any, **kwargs: Any) -> list[dict[str, Any]]: def test_mssql_query_files_follow_dialect_category_layout() -> None: """MSSQL data-dictionary SQL should use the existing per-category file layout.""" - assert {path.name for path in MSSQL_QUERY_DIR.glob("*.sql")} == EXPECTED_MSSQL_QUERY_FILES + assert EXPECTED_MSSQL_QUERY_FILES.issubset({path.name for path in MSSQL_QUERY_DIR.glob("*.sql")}) def test_sync_data_dictionary_builds_version_info() -> None: diff --git a/tests/unit/adapters/test_oracledb/test_data_dictionary_oracledb.py b/tests/unit/adapters/test_oracledb/test_data_dictionary_oracledb.py index a6cc9887e..4fb7f0b40 100644 --- a/tests/unit/adapters/test_oracledb/test_data_dictionary_oracledb.py +++ b/tests/unit/adapters/test_oracledb/test_data_dictionary_oracledb.py @@ -271,8 +271,8 @@ def test_oracle_columns_uses_all_tab_cols_for_hidden_columns() -> None: data_dictionary = OracledbSyncDataDictionary() - columns_by_schema = data_dictionary.get_query_text("columns_by_schema").lower() - columns_by_table = data_dictionary.get_query_text("columns_by_table").lower() + columns_by_schema = data_dictionary.get_query_text("columns", "by_schema").lower() + columns_by_table = data_dictionary.get_query_text("columns", "by_table").lower() assert "all_tab_cols" in columns_by_schema assert "all_tab_columns" not in columns_by_schema @@ -285,25 +285,25 @@ def test_oracle_domain_query_packs_cover_c5_sources() -> None: loader = get_data_dictionary_loader() expected_sources = { - "objects": ("by_owner", "ALL_OBJECTS"), - "schemas": ("by_owner", "ALL_USERS"), - "tables": ("by_owner", "ALL_TABLES"), - "columns": ("by_owner", "ALL_TAB_COLS"), - "constraints": ("by_owner", "ALL_CONSTRAINTS"), - "indexes": ("by_owner", "ALL_IND_EXPRESSIONS"), - "views": ("by_owner", "ALL_VIEWS"), - "materialized_views": ("by_owner", "ALL_MVIEWS"), - "sequences": ("by_owner", "ALL_SEQUENCES"), - "routines": ("by_owner", "ALL_PROCEDURES"), - "arguments": ("by_owner", "ALL_ARGUMENTS"), - "source": ("by_owner", "ALL_SOURCE"), - "triggers": ("by_owner", "ALL_TRIGGERS"), - "comments": ("by_owner", "ALL_COL_COMMENTS"), - "grants": ("by_owner", "ALL_TAB_PRIVS"), - "dependencies": ("by_owner", "ALL_DEPENDENCIES"), - "partitions": ("by_owner", "ALL_TAB_PARTITIONS"), - "lob_storage": ("by_owner", "ALL_LOBS"), - "ddl": ("dbms_metadata", "DBMS_METADATA.GET_DDL"), + "objects": ("by_schema", "ALL_OBJECTS"), + "schemas": ("by_schema", "ALL_USERS"), + "tables": ("by_schema", "ALL_TABLES"), + "columns": ("by_schema", "ALL_TAB_COLS"), + "constraints": ("by_schema", "ALL_CONSTRAINTS"), + "indexes": ("by_schema", "ALL_IND_EXPRESSIONS"), + "views": ("by_schema", "ALL_VIEWS"), + "materialized_views": ("by_schema", "ALL_MVIEWS"), + "sequences": ("by_schema", "ALL_SEQUENCES"), + "routines": ("by_schema", "ALL_PROCEDURES"), + "arguments": ("by_schema", "ALL_ARGUMENTS"), + "source": ("by_schema", "ALL_SOURCE"), + "triggers": ("by_schema", "ALL_TRIGGERS"), + "comments": ("by_schema", "ALL_COL_COMMENTS"), + "grants": ("by_schema", "ALL_TAB_PRIVS"), + "dependencies": ("by_schema", "ALL_DEPENDENCIES"), + "partitions": ("by_schema", "ALL_TAB_PARTITIONS"), + "lob_storage": ("by_schema", "ALL_LOBS"), + "ddl": ("by_object", "DBMS_METADATA.GET_DDL"), "system": ("no_diagnostics", "diagnostics_enabled"), } diff --git a/tests/unit/core/test_data_dictionary.py b/tests/unit/core/test_data_dictionary.py index b392b63da..c968aa666 100644 --- a/tests/unit/core/test_data_dictionary.py +++ b/tests/unit/core/test_data_dictionary.py @@ -1,6 +1,8 @@ """Unit tests for the data dictionary registry and loader.""" -from typing import cast +import re +from importlib import resources +from typing import Any, cast import pytest @@ -15,7 +17,6 @@ list_registered_dialects, normalize_dialect_name, ) -from sqlspec.exceptions import SQLFileNotFoundError def test_data_dictionary_loader_lists_known_dialects() -> None: @@ -26,27 +27,60 @@ def test_data_dictionary_loader_lists_known_dialects() -> None: assert "sqlite" in dialects -def test_data_dictionary_loader_get_query_text() -> None: +def test_data_dictionary_loader_get_domain_query_text() -> None: """Ensure loader returns SQL text for named queries.""" loader = DataDictionaryLoader() - query_text = loader.get_query_text("postgres", "tables_by_schema") + query_text = loader.get_domain_query_text("postgres", "tables", "by_schema") + assert query_text is not None assert "dependency_tree" in query_text - assert "information_schema" in query_text + assert "pg_catalog" in query_text -def test_data_dictionary_loader_get_query() -> None: +def test_data_dictionary_loader_get_domain_query() -> None: """Ensure loader returns SQL objects for named queries.""" loader = DataDictionaryLoader() - query = loader.get_query("postgres", "tables_by_schema") - assert isinstance(query, SQL) - assert query.raw_sql is not None + query = loader.get_domain_query("postgres", "tables", "by_schema") + assert isinstance(query.sql, SQL) + assert query.sql.raw_sql is not None -def test_data_dictionary_loader_unknown_dialect_raises() -> None: - """Ensure missing dialect paths raise SQLFileNotFoundError.""" +def test_data_dictionary_loader_unknown_dialect_is_unsupported() -> None: + """Ensure missing dialect paths return an unsupported domain query.""" loader = DataDictionaryLoader() - with pytest.raises(SQLFileNotFoundError): - loader.get_query_text("not-a-dialect", "tables_by_schema") + query = loader.get_domain_query("not-a-dialect", "tables", "by_schema") + assert query.is_supported is False + + +def test_data_dictionary_query_names_are_domain_relative() -> None: + """Ensure query names do not repeat the domain supplied by their file.""" + dialects_root = resources.files("sqlspec.data_dictionary.dialects") + violations: list[str] = [] + for dialect_path in dialects_root.iterdir(): + sql_root = dialect_path.joinpath("sql") + if not sql_root.is_dir(): + continue + for sql_file in _iter_sql_resources(sql_root): + domain = sql_file.name.removesuffix(".sql") + violations.extend( + f"{dialect_path.name}/{domain}/{query_name}" + for query_name in re.findall(r"^-- name: (\S+)", sql_file.read_text(), re.MULTILINE) + if query_name.startswith(f"{domain}_") + ) + assert violations == [] + + +def _iter_sql_resources(root: Any) -> list[Any]: + """Return SQL resources below a traversable root.""" + resources_to_visit = [root] + sql_files = [] + while resources_to_visit: + current = resources_to_visit.pop() + for child in current.iterdir(): + if child.is_dir(): + resources_to_visit.append(child) + elif child.name.endswith(".sql"): + sql_files.append(child) + return sql_files def test_get_data_dictionary_loader_singleton() -> None: diff --git a/tests/unit/core/test_introspection_sql.py b/tests/unit/core/test_introspection_sql.py index ade0c18b8..b3b2992df 100644 --- a/tests/unit/core/test_introspection_sql.py +++ b/tests/unit/core/test_introspection_sql.py @@ -8,6 +8,8 @@ """ import re +from importlib import resources +from typing import Any import pytest @@ -30,19 +32,27 @@ """Detects ``: param`` where a space was inserted after the colon.""" -def _get_all_dialect_queries() -> list[tuple[str, str]]: - """Return (dialect, query_name) pairs for every loadable query.""" - loader = DataDictionaryLoader() - pairs: list[tuple[str, str]] = [] - for dialect in loader.list_dialects(): - # Load the dialect first to populate query list - try: - loader._ensure_dialect_loaded(dialect) - except Exception: +def _get_all_dialect_queries() -> list[tuple[str, str, str | None, str]]: + """Return exact dialect/domain/mode/query identities for every SQL statement.""" + identities: list[tuple[str, str, str | None, str]] = [] + dialects_root = resources.files("sqlspec.data_dictionary.dialects") + for dialect_path in dialects_root.iterdir(): + sql_root = dialect_path.joinpath("sql") + if not sql_root.is_dir(): continue - inner = loader._get_loader(dialect) - pairs.extend((dialect, qname) for qname in inner.list_queries()) - return pairs + pending: list[tuple[Any, str | None]] = [(sql_root, None)] + while pending: + current, mode = pending.pop() + for child in current.iterdir(): + if child.is_dir(): + pending.append((child, child.name)) + elif child.name.endswith(".sql"): + domain = child.name.removesuffix(".sql") + identities.extend( + (dialect_path.name, domain, mode, operation) + for operation in re.findall(r"^-- name: (\S+)", child.read_text(), re.MULTILINE) + ) + return identities ALL_QUERIES = _get_all_dialect_queries() @@ -53,22 +63,28 @@ def _get_all_dialect_queries() -> list[tuple[str, str]]: # --------------------------------------------------------------------------- -@pytest.mark.parametrize(("dialect", "query_name"), ALL_QUERIES, ids=[f"{d}/{q}" for d, q in ALL_QUERIES]) -def test_raw_sql_has_no_mangled_casts(dialect: str, query_name: str) -> None: +@pytest.mark.parametrize( + ("dialect", "domain", "mode", "operation"), + ALL_QUERIES, + ids=[f"{d}/{m + '/' if m else ''}{domain}/{op}" for d, domain, m, op in ALL_QUERIES], +) +def test_raw_sql_has_no_mangled_casts(dialect: str, domain: str, mode: str | None, operation: str) -> None: """Raw SQL text must not contain ``:: text`` (space inside cast).""" loader = DataDictionaryLoader() - raw = loader.get_query_text(dialect, query_name) + raw = loader.get_domain_query_text(dialect, domain, operation, mode=mode) + assert raw is not None matches = _MANGLED_CAST.findall(raw) - assert not matches, f"Mangled cast(s) in {dialect}/{query_name}: {matches}" + assert not matches, f"Mangled cast(s) in {dialect}/{domain}/{operation}: {matches}" -@pytest.mark.parametrize(("dialect", "query_name"), ALL_QUERIES, ids=[f"{d}/{q}" for d, q in ALL_QUERIES]) -def test_raw_sql_has_no_stray_space_binds(dialect: str, query_name: str) -> None: +@pytest.mark.parametrize(("dialect", "domain", "mode", "operation"), ALL_QUERIES) +def test_raw_sql_has_no_stray_space_binds(dialect: str, domain: str, mode: str | None, operation: str) -> None: """Raw SQL must not have ``: param`` with a space after the colon.""" loader = DataDictionaryLoader() - raw = loader.get_query_text(dialect, query_name) + raw = loader.get_domain_query_text(dialect, domain, operation, mode=mode) + assert raw is not None matches = _STRAY_SPACE_BIND.findall(raw) - assert not matches, f"Stray space bind(s) in {dialect}/{query_name}: {matches}" + assert not matches, f"Stray space bind(s) in {dialect}/{domain}/{operation}: {matches}" # --------------------------------------------------------------------------- @@ -76,11 +92,13 @@ def test_raw_sql_has_no_stray_space_binds(dialect: str, query_name: str) -> None # --------------------------------------------------------------------------- -@pytest.mark.parametrize(("dialect", "query_name"), ALL_QUERIES, ids=[f"{d}/{q}" for d, q in ALL_QUERIES]) -def test_sql_compiles_without_error(dialect: str, query_name: str) -> None: +@pytest.mark.parametrize(("dialect", "domain", "mode", "operation"), ALL_QUERIES) +def test_sql_compiles_without_error(dialect: str, domain: str, mode: str | None, operation: str) -> None: """Every introspection query must compile through the SQL pipeline.""" loader = DataDictionaryLoader() - sql_obj = loader.get_query(dialect, query_name) + query = loader.get_domain_query(dialect, domain, operation, mode=mode) + assert query.sql is not None + sql_obj = query.sql assert isinstance(sql_obj, SQL) compiled_sql, _params = sql_obj.compile() assert isinstance(compiled_sql, str) @@ -88,25 +106,27 @@ def test_sql_compiles_without_error(dialect: str, query_name: str) -> None: @pytest.mark.parametrize( - ("dialect", "query_name"), - [(d, q) for d, q in ALL_QUERIES if d in ("postgres", "cockroachdb")], - ids=[f"{d}/{q}" for d, q in ALL_QUERIES if d in ("postgres", "cockroachdb")], + ("dialect", "domain", "mode", "operation"), + [identity for identity in ALL_QUERIES if identity[0] in ("postgres", "cockroachdb")], ) -def test_compiled_sql_preserves_pg_casts(dialect: str, query_name: str) -> None: +def test_compiled_sql_preserves_pg_casts(dialect: str, domain: str, mode: str | None, operation: str) -> None: """Compiled SQL for PG-family dialects must preserve ``::type`` casts.""" loader = DataDictionaryLoader() - raw = loader.get_query_text(dialect, query_name) + raw = loader.get_domain_query_text(dialect, domain, operation, mode=mode) + assert raw is not None if "::" not in raw: pytest.skip("No casts in this query") - sql_obj = loader.get_query(dialect, query_name) + query = loader.get_domain_query(dialect, domain, operation, mode=mode) + assert query.sql is not None + sql_obj = query.sql compiled_sql, _ = sql_obj.compile() # Count casts in raw vs compiled — they should match raw_casts = re.findall(r"::\w+", raw) compiled_casts = re.findall(r"::\w+", compiled_sql) # The compiled SQL may rewrite identifiers, but cast count must be stable assert len(compiled_casts) >= len(raw_casts), ( - f"Casts lost in {dialect}/{query_name}: raw={len(raw_casts)}, compiled={len(compiled_casts)}" + f"Casts lost in {dialect}/{domain}/{operation}: raw={len(raw_casts)}, compiled={len(compiled_casts)}" ) @@ -159,7 +179,8 @@ def test_parameter_validator_skips_pg_casts() -> None: def test_parameter_validator_handles_postgres_introspection_sql() -> None: """Validate the actual postgres columns_by_table query.""" loader = DataDictionaryLoader() - raw = loader.get_query_text("postgres", "columns_by_table") + raw = loader.get_domain_query_text("postgres", "columns", "by_table") + assert raw is not None validator = ParameterValidator() params = validator.extract_parameters(raw) param_names = [p.name for p in params] @@ -172,7 +193,8 @@ def test_parameter_validator_handles_postgres_introspection_sql() -> None: def test_parameter_validator_handles_mixed_cast_bind_pattern() -> None: """Validate the postgres foreign_keys pattern with ``:param::text``.""" loader = DataDictionaryLoader() - raw = loader.get_query_text("postgres", "foreign_keys_by_table") + raw = loader.get_domain_query_text("postgres", "foreign_keys", "by_table") + assert raw is not None validator = ParameterValidator() params = validator.extract_parameters(raw) param_names = [p.name for p in params] @@ -189,7 +211,9 @@ def test_compiled_sql_no_mangled_casts_or_binds() -> None: was allegedly being transformed to ``c.relname =: table_name``. """ loader = DataDictionaryLoader() - sql_obj = loader.get_query("postgres", "columns_by_table") + query = loader.get_domain_query("postgres", "columns", "by_table") + assert query.sql is not None + sql_obj = query.sql compiled_sql, _ = sql_obj.compile() # Must not have mangled casts like ":: text" assert ":: text" not in compiled_sql, f"Mangled cast found in compiled SQL: {compiled_sql}" @@ -205,7 +229,9 @@ def test_compiled_foreign_keys_preserves_cast_bind_adjacency() -> None: The ``::text`` cast immediately after ``:schema_name`` is the trickiest pattern. """ loader = DataDictionaryLoader() - sql_obj = loader.get_query("postgres", "foreign_keys_by_table") + query = loader.get_domain_query("postgres", "foreign_keys", "by_table") + assert query.sql is not None + sql_obj = query.sql compiled_sql, _ = sql_obj.compile() # The cast must survive compilation assert "::text" in compiled_sql or ":: TEXT" in compiled_sql or "CAST(" in compiled_sql, ( diff --git a/tests/unit/data_dictionary/test_bigquery_spanner_metadata.py b/tests/unit/data_dictionary/test_bigquery_spanner_metadata.py index 8fb4cf942..6ba969bc4 100644 --- a/tests/unit/data_dictionary/test_bigquery_spanner_metadata.py +++ b/tests/unit/data_dictionary/test_bigquery_spanner_metadata.py @@ -136,8 +136,8 @@ def test_spanner_nullable_schema_queries_cast_bind_as_string() -> None: """Spanner must not infer a nullable schema bind as both INT64 and STRING.""" dictionary = SpannerDataDictionary() - for query_name in ("tables_by_schema", "columns_by_schema", "indexes_by_schema", "foreign_keys_by_schema"): - query_text = dictionary.get_query_text(query_name) + for domain in ("tables", "columns", "indexes", "foreign_keys"): + query_text = dictionary.get_query_text(domain, "by_schema") assert "CAST(:schema_name AS STRING) IS NULL" in query_text assert ":schema_name IS NULL" not in query_text diff --git a/tests/unit/data_dictionary/test_mssql_metadata.py b/tests/unit/data_dictionary/test_mssql_metadata.py index 90cd863b9..fd1f49784 100644 --- a/tests/unit/data_dictionary/test_mssql_metadata.py +++ b/tests/unit/data_dictionary/test_mssql_metadata.py @@ -22,7 +22,8 @@ "objects": ("by_schema",), "tables": ("by_schema", "all_by_schema", "details_by_table"), "columns": ("by_schema", "by_table"), - "constraints": ("by_schema", "by_table", "foreign_keys_by_schema", "foreign_keys_by_table"), + "constraints": ("by_schema", "by_table"), + "foreign_keys": ("by_schema", "by_table"), "indexes": ("by_schema", "by_table"), "views": ("by_schema",), "modules": ("by_schema",), diff --git a/tests/unit/data_dictionary/test_mysql_metadata.py b/tests/unit/data_dictionary/test_mysql_metadata.py index e17ee40a7..8441160f7 100644 --- a/tests/unit/data_dictionary/test_mysql_metadata.py +++ b/tests/unit/data_dictionary/test_mysql_metadata.py @@ -81,12 +81,12 @@ def test_mariadb_is_registered_as_distinct_dialect() -> None: ("mysql", "schemas", "list", "information_schema.schemata"), ("mysql", "objects", "by_schema", "information_schema.events"), ("mysql", "constraints", "by_schema", "information_schema.check_constraints"), - ("mysql", "ddl", "show_create_table", "SHOW CREATE TABLE"), + ("mysql", "ddl", "table_by_name", "SHOW CREATE TABLE"), ("mysql", "system", "performance_schema_tables", "performance_schema"), ("mariadb", "schemas", "list", "information_schema.schemata"), ("mariadb", "objects", "by_schema", "SEQUENCE"), ("mariadb", "plugins", "list", "information_schema.plugins"), - ("mariadb", "ddl", "show_create_sequence", "SHOW CREATE SEQUENCE"), + ("mariadb", "ddl", "sequence_by_name", "SHOW CREATE SEQUENCE"), ), ) def test_mysql_and_mariadb_domain_query_packs( diff --git a/tests/unit/data_dictionary/test_sqlite_duckdb_metadata.py b/tests/unit/data_dictionary/test_sqlite_duckdb_metadata.py index d397d94d8..462eeac48 100644 --- a/tests/unit/data_dictionary/test_sqlite_duckdb_metadata.py +++ b/tests/unit/data_dictionary/test_sqlite_duckdb_metadata.py @@ -20,15 +20,15 @@ def test_direct_sqlite_duckdb_domain_query_packs_cover_c7_domains() -> None: """C7 query packs should use direct dialect/domain paths without v2 namespaces.""" loader = DataDictionaryLoader() expected_queries = ( - ("sqlite", "schemas", "database_list"), + ("sqlite", "schemas", "list"), ("sqlite", "objects", "by_schema"), ("sqlite", "tables", "by_schema"), ("sqlite", "columns", "by_table"), - ("sqlite", "constraints", "foreign_keys_by_table"), + ("sqlite", "foreign_keys", "by_table"), ("sqlite", "indexes", "by_schema"), ("sqlite", "views", "by_schema"), ("sqlite", "triggers", "by_schema"), - ("sqlite", "native_sql", "by_object"), + ("sqlite", "ddl", "by_object"), ("sqlite", "functions", "list"), ("sqlite", "modules", "list"), ("sqlite", "compile_options", "list"), diff --git a/tests/unit/utils/test_mypyc_inventory.py b/tests/unit/utils/test_mypyc_inventory.py index 9920a3d37..351f9585e 100644 --- a/tests/unit/utils/test_mypyc_inventory.py +++ b/tests/unit/utils/test_mypyc_inventory.py @@ -103,14 +103,14 @@ def test_pyproject_mypyc_include_patterns_cover_smoke_critical_modules() -> None "sqlspec/storage/backends/fsspec.py", "sqlspec/storage/backends/obstore.py", "sqlspec/data_dictionary/_loader.py", - "sqlspec/data_dictionary/dialects/bigquery.py", - "sqlspec/data_dictionary/dialects/cockroachdb.py", - "sqlspec/data_dictionary/dialects/duckdb.py", - "sqlspec/data_dictionary/dialects/mysql.py", - "sqlspec/data_dictionary/dialects/oracle.py", - "sqlspec/data_dictionary/dialects/postgres.py", - "sqlspec/data_dictionary/dialects/spanner.py", - "sqlspec/data_dictionary/dialects/sqlite.py", + "sqlspec/data_dictionary/dialects/bigquery/config.py", + "sqlspec/data_dictionary/dialects/cockroachdb/config.py", + "sqlspec/data_dictionary/dialects/duckdb/config.py", + "sqlspec/data_dictionary/dialects/mysql/config.py", + "sqlspec/data_dictionary/dialects/oracle/config.py", + "sqlspec/data_dictionary/dialects/postgres/config.py", + "sqlspec/data_dictionary/dialects/spanner/config.py", + "sqlspec/data_dictionary/dialects/sqlite/config.py", "sqlspec/dialects/postgres/_generators.py", "sqlspec/dialects/postgres/_operators.py", "sqlspec/dialects/spanner/_generators.py", @@ -151,14 +151,14 @@ def test_inventory_records_rest_of_mypyc_boundary_decisions() -> None: assert "sqlspec/storage/backends/local.py" in payload["compiled_modules"] assert "sqlspec/storage/backends/obstore.py" in payload["compiled_modules"] assert "sqlspec/data_dictionary/_loader.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/bigquery.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/cockroachdb.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/duckdb.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/mysql.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/oracle.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/postgres.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/spanner.py" in payload["compiled_modules"] - assert "sqlspec/data_dictionary/dialects/sqlite.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/bigquery/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/cockroachdb/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/duckdb/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/mysql/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/oracle/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/postgres/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/spanner/config.py" in payload["compiled_modules"] + assert "sqlspec/data_dictionary/dialects/sqlite/config.py" in payload["compiled_modules"] assert "sqlspec/dialects/postgres/_generators.py" in payload["compiled_modules"] assert "sqlspec/dialects/postgres/_operators.py" in payload["compiled_modules"] assert "sqlspec/dialects/spanner/_generators.py" in payload["compiled_modules"]