sqlspec 0.16.1__py3-none-any.whl → 0.17.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (32) hide show
  1. sqlspec/__init__.py +11 -1
  2. sqlspec/_sql.py +18 -412
  3. sqlspec/adapters/aiosqlite/__init__.py +11 -1
  4. sqlspec/adapters/aiosqlite/config.py +137 -165
  5. sqlspec/adapters/aiosqlite/driver.py +21 -10
  6. sqlspec/adapters/aiosqlite/pool.py +492 -0
  7. sqlspec/adapters/duckdb/__init__.py +2 -0
  8. sqlspec/adapters/duckdb/config.py +11 -235
  9. sqlspec/adapters/duckdb/pool.py +243 -0
  10. sqlspec/adapters/sqlite/__init__.py +2 -0
  11. sqlspec/adapters/sqlite/config.py +4 -115
  12. sqlspec/adapters/sqlite/pool.py +140 -0
  13. sqlspec/base.py +147 -26
  14. sqlspec/builder/__init__.py +6 -0
  15. sqlspec/builder/_insert.py +177 -12
  16. sqlspec/builder/_parsing_utils.py +53 -2
  17. sqlspec/builder/mixins/_join_operations.py +148 -7
  18. sqlspec/builder/mixins/_merge_operations.py +102 -16
  19. sqlspec/builder/mixins/_select_operations.py +311 -6
  20. sqlspec/builder/mixins/_update_operations.py +49 -34
  21. sqlspec/builder/mixins/_where_clause.py +85 -13
  22. sqlspec/core/compiler.py +7 -5
  23. sqlspec/driver/_common.py +9 -1
  24. sqlspec/loader.py +27 -54
  25. sqlspec/storage/registry.py +2 -2
  26. sqlspec/typing.py +53 -99
  27. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/METADATA +1 -1
  28. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/RECORD +32 -29
  29. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/WHEEL +0 -0
  30. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/entry_points.txt +0 -0
  31. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/licenses/LICENSE +0 -0
  32. {sqlspec-0.16.1.dist-info → sqlspec-0.17.0.dist-info}/licenses/NOTICE +0 -0
sqlspec/loader.py CHANGED
@@ -14,9 +14,13 @@ from pathlib import Path
14
14
  from typing import Any, Optional, Union
15
15
 
16
16
  from sqlspec.core.cache import CacheKey, get_cache_config, get_default_cache
17
- from sqlspec.core.parameters import ParameterStyleConfig, ParameterValidator
18
- from sqlspec.core.statement import SQL, StatementConfig
19
- from sqlspec.exceptions import SQLFileNotFoundError, SQLFileParseError, StorageOperationFailedError
17
+ from sqlspec.core.statement import SQL
18
+ from sqlspec.exceptions import (
19
+ MissingDependencyError,
20
+ SQLFileNotFoundError,
21
+ SQLFileParseError,
22
+ StorageOperationFailedError,
23
+ )
20
24
  from sqlspec.storage import storage_registry
21
25
  from sqlspec.storage.registry import StorageRegistry
22
26
  from sqlspec.utils.correlation import CorrelationContext
@@ -29,7 +33,7 @@ logger = get_logger("loader")
29
33
  # Matches: -- name: query_name (supports hyphens and special suffixes)
30
34
  # We capture the name plus any trailing special characters
31
35
  QUERY_NAME_PATTERN = re.compile(r"^\s*--\s*name\s*:\s*([\w-]+[^\w\s]*)\s*$", re.MULTILINE | re.IGNORECASE)
32
- TRIM_SPECIAL_CHARS = re.compile(r"[^\w-]")
36
+ TRIM_SPECIAL_CHARS = re.compile(r"[^\w.-]")
33
37
 
34
38
  # Matches: -- dialect: dialect_name (optional dialect specification)
35
39
  DIALECT_PATTERN = re.compile(r"^\s*--\s*dialect\s*:\s*(?P<dialect>[a-zA-Z0-9_]+)\s*$", re.IGNORECASE | re.MULTILINE)
@@ -304,6 +308,12 @@ class SQLFileLoader:
304
308
  return backend.read_text(path_str, encoding=self.encoding)
305
309
  except KeyError as e:
306
310
  raise SQLFileNotFoundError(path_str) from e
311
+ except MissingDependencyError:
312
+ # Fall back to standard file reading when no storage backend is available
313
+ try:
314
+ return path.read_text(encoding=self.encoding) # type: ignore[union-attr]
315
+ except FileNotFoundError as e:
316
+ raise SQLFileNotFoundError(path_str) from e
307
317
  except StorageOperationFailedError as e:
308
318
  if "not found" in str(e).lower() or "no such file" in str(e).lower():
309
319
  raise SQLFileNotFoundError(path_str) from e
@@ -570,8 +580,11 @@ class SQLFileLoader:
570
580
  Raises:
571
581
  ValueError: If query name already exists.
572
582
  """
573
- if name in self._queries:
574
- existing_source = self._query_to_file.get(name, "<directly added>")
583
+ # Normalize the name for consistency with file-loaded queries
584
+ normalized_name = _normalize_query_name(name)
585
+
586
+ if normalized_name in self._queries:
587
+ existing_source = self._query_to_file.get(normalized_name, "<directly added>")
575
588
  msg = f"Query name '{name}' already exists (source: {existing_source})"
576
589
  raise ValueError(msg)
577
590
 
@@ -588,21 +601,16 @@ class SQLFileLoader:
588
601
  else:
589
602
  dialect = normalized_dialect
590
603
 
591
- statement = NamedStatement(name=name, sql=sql.strip(), dialect=dialect, start_line=0)
592
- self._queries[name] = statement
593
- self._query_to_file[name] = "<directly added>"
604
+ statement = NamedStatement(name=normalized_name, sql=sql.strip(), dialect=dialect, start_line=0)
605
+ self._queries[normalized_name] = statement
606
+ self._query_to_file[normalized_name] = "<directly added>"
594
607
 
595
- def get_sql(
596
- self, name: str, parameters: "Optional[Any]" = None, dialect: "Optional[str]" = None, **kwargs: "Any"
597
- ) -> "SQL":
598
- """Get a SQL object by statement name with dialect support.
608
+ def get_sql(self, name: str) -> "SQL":
609
+ """Get a SQL object by statement name.
599
610
 
600
611
  Args:
601
612
  name: Name of the statement (from -- name: in SQL file).
602
613
  Hyphens in names are converted to underscores.
603
- parameters: Parameters for the SQL statement.
604
- dialect: Optional dialect override.
605
- **kwargs: Additional parameters to pass to the SQL object.
606
614
 
607
615
  Returns:
608
616
  SQL object ready for execution.
@@ -629,46 +637,11 @@ class SQLFileLoader:
629
637
  raise SQLFileNotFoundError(name, path=f"Statement '{name}' not found. Available statements: {available}")
630
638
 
631
639
  parsed_statement = self._queries[safe_name]
632
-
633
- effective_dialect = dialect or parsed_statement.dialect
634
-
635
- if dialect is not None:
636
- normalized_dialect = _normalize_dialect(dialect)
637
- if normalized_dialect not in SUPPORTED_DIALECTS:
638
- suggestions = _get_dialect_suggestions(normalized_dialect)
639
- warning_msg = f"Unknown dialect '{dialect}'"
640
- if suggestions:
641
- warning_msg += f". Did you mean: {', '.join(suggestions)}?"
642
- warning_msg += f". Supported dialects: {', '.join(sorted(SUPPORTED_DIALECTS))}. Using dialect as-is."
643
- logger.warning(warning_msg)
644
- effective_dialect = dialect.lower()
645
- else:
646
- effective_dialect = normalized_dialect
647
-
648
- sql_kwargs = dict(kwargs)
649
- if parameters is not None:
650
- sql_kwargs["parameters"] = parameters
651
-
652
640
  sqlglot_dialect = None
653
- if effective_dialect:
654
- sqlglot_dialect = _normalize_dialect_for_sqlglot(effective_dialect)
655
-
656
- if not effective_dialect and "statement_config" not in sql_kwargs:
657
- validator = ParameterValidator()
658
- param_info = validator.extract_parameters(parsed_statement.sql)
659
- if param_info:
660
- styles = {p.style for p in param_info}
661
- if styles:
662
- detected_style = next(iter(styles))
663
- sql_kwargs["statement_config"] = StatementConfig(
664
- parameter_config=ParameterStyleConfig(
665
- default_parameter_style=detected_style,
666
- supported_parameter_styles=styles,
667
- preserve_parameter_format=True,
668
- )
669
- )
641
+ if parsed_statement.dialect:
642
+ sqlglot_dialect = _normalize_dialect_for_sqlglot(parsed_statement.dialect)
670
643
 
671
- return SQL(parsed_statement.sql, dialect=sqlglot_dialect, **sql_kwargs)
644
+ return SQL(parsed_statement.sql, dialect=sqlglot_dialect)
672
645
 
673
646
  def get_file(self, path: Union[str, Path]) -> "Optional[SQLFile]":
674
647
  """Get a loaded SQLFile object by path.
@@ -151,8 +151,8 @@ class StorageRegistry:
151
151
  return self._create_backend("fsspec", uri, **kwargs)
152
152
  except (ValueError, ImportError, NotImplementedError):
153
153
  pass
154
- msg = f"No storage backend available for scheme '{scheme}'. Install obstore or fsspec."
155
- raise MissingDependencyError(msg)
154
+ msg = "obstore"
155
+ raise MissingDependencyError(msg, "fsspec")
156
156
 
157
157
  def _determine_backend_class(self, uri: str) -> type[ObjectStoreProtocol]:
158
158
  """Determine the backend class for a URI based on availability."""
sqlspec/typing.py CHANGED
@@ -18,88 +18,50 @@ from sqlspec._typing import (
18
18
  PROMETHEUS_INSTALLED,
19
19
  PYARROW_INSTALLED,
20
20
  PYDANTIC_INSTALLED,
21
+ UNSET,
22
+ AiosqlAsyncProtocol,
23
+ AiosqlParamType,
24
+ AiosqlProtocol,
25
+ AiosqlSQLOperationType,
26
+ AiosqlSyncProtocol,
27
+ ArrowRecordBatch,
28
+ ArrowTable,
29
+ AttrsInstance,
30
+ AttrsInstanceStub,
31
+ BaseModel,
32
+ BaseModelStub,
33
+ Counter,
21
34
  DataclassProtocol,
35
+ DTOData,
22
36
  Empty,
23
37
  EmptyEnum,
24
38
  EmptyType,
39
+ FailFast,
40
+ Gauge,
41
+ Histogram,
42
+ Span,
43
+ Status,
44
+ StatusCode,
45
+ Struct,
46
+ StructStub,
47
+ Tracer,
48
+ TypeAdapter,
49
+ UnsetType,
50
+ aiosql,
51
+ attrs_asdict,
52
+ attrs_define,
53
+ attrs_field,
54
+ attrs_fields,
55
+ attrs_has,
56
+ cattrs_structure,
57
+ cattrs_unstructure,
58
+ convert,
59
+ trace,
25
60
  )
26
61
 
27
62
  if TYPE_CHECKING:
28
63
  from collections.abc import Sequence
29
64
 
30
- from sqlspec._typing import (
31
- UNSET,
32
- AiosqlAsyncProtocol,
33
- AiosqlParamType,
34
- AiosqlProtocol,
35
- AiosqlSQLOperationType,
36
- AiosqlSyncProtocol,
37
- ArrowRecordBatch,
38
- ArrowTable,
39
- AttrsInstance,
40
- AttrsInstanceStub,
41
- BaseModel,
42
- BaseModelStub,
43
- Counter,
44
- DTOData,
45
- FailFast,
46
- Gauge,
47
- Histogram,
48
- Span,
49
- Status,
50
- StatusCode,
51
- Struct,
52
- StructStub,
53
- Tracer,
54
- TypeAdapter,
55
- UnsetType,
56
- aiosql,
57
- attrs_asdict,
58
- attrs_define,
59
- attrs_field,
60
- attrs_fields,
61
- attrs_has,
62
- cattrs_structure,
63
- cattrs_unstructure,
64
- convert,
65
- trace,
66
- )
67
- else:
68
- from sqlspec._typing import (
69
- UNSET,
70
- AiosqlAsyncProtocol,
71
- AiosqlParamType,
72
- AiosqlProtocol,
73
- AiosqlSQLOperationType,
74
- AiosqlSyncProtocol,
75
- ArrowRecordBatch,
76
- ArrowTable,
77
- AttrsInstance,
78
- BaseModel,
79
- Counter,
80
- DTOData,
81
- FailFast,
82
- Gauge,
83
- Histogram,
84
- Span,
85
- Status,
86
- StatusCode,
87
- Struct,
88
- Tracer,
89
- TypeAdapter,
90
- UnsetType,
91
- aiosql,
92
- attrs_asdict,
93
- attrs_define,
94
- attrs_field,
95
- attrs_fields,
96
- attrs_has,
97
- cattrs_structure,
98
- cattrs_unstructure,
99
- convert,
100
- trace,
101
- )
102
-
103
65
 
104
66
  class DictLike(Protocol):
105
67
  """A protocol for objects that behave like a dictionary for reading."""
@@ -112,36 +74,28 @@ class DictLike(Protocol):
112
74
  PYDANTIC_USE_FAILFAST = False
113
75
 
114
76
 
115
- if TYPE_CHECKING:
116
- T = TypeVar("T")
117
- ConnectionT = TypeVar("ConnectionT")
118
- """Type variable for connection types.
77
+ T = TypeVar("T")
78
+ ConnectionT = TypeVar("ConnectionT")
79
+ """Type variable for connection types.
119
80
 
120
- :class:`~sqlspec.typing.ConnectionT`
121
- """
122
- PoolT = TypeVar("PoolT")
123
- """Type variable for pool types.
81
+ :class:`~sqlspec.typing.ConnectionT`
82
+ """
83
+ PoolT = TypeVar("PoolT")
84
+ """Type variable for pool types.
124
85
 
125
- :class:`~sqlspec.typing.PoolT`
126
- """
127
- PoolT_co = TypeVar("PoolT_co", covariant=True)
128
- """Type variable for covariant pool types.
86
+ :class:`~sqlspec.typing.PoolT`
87
+ """
88
+ PoolT_co = TypeVar("PoolT_co", covariant=True)
89
+ """Type variable for covariant pool types.
129
90
 
130
- :class:`~sqlspec.typing.PoolT_co`
131
- """
132
- ModelT = TypeVar("ModelT", bound="Union[DictLike, StructStub, BaseModelStub, DataclassProtocol, AttrsInstanceStub]")
133
- """Type variable for model types.
91
+ :class:`~sqlspec.typing.PoolT_co`
92
+ """
93
+ ModelT = TypeVar("ModelT", bound="Union[DictLike, StructStub, BaseModelStub, DataclassProtocol, AttrsInstanceStub]")
94
+ """Type variable for model types.
134
95
 
135
- :class:`DictLike` | :class:`msgspec.Struct` | :class:`pydantic.BaseModel` | :class:`DataclassProtocol` | :class:`AttrsInstance`
136
- """
137
- RowT = TypeVar("RowT", bound="dict[str, Any]")
138
- else:
139
- T = Any
140
- ConnectionT = Any
141
- PoolT = Any
142
- PoolT_co = Any
143
- ModelT = Any
144
- RowT = dict[str, Any]
96
+ :class:`DictLike` | :class:`msgspec.Struct` | :class:`pydantic.BaseModel` | :class:`DataclassProtocol` | :class:`AttrsInstance`
97
+ """
98
+ RowT = TypeVar("RowT", bound="dict[str, Any]")
145
99
 
146
100
 
147
101
  DictRow: TypeAlias = "dict[str, Any]"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlspec
3
- Version: 0.16.1
3
+ Version: 0.17.0
4
4
  Summary: SQL Experiments in Python
5
5
  Project-URL: Discord, https://discord.gg/litestar
6
6
  Project-URL: Issue, https://github.com/litestar-org/sqlspec/issues/
@@ -1,26 +1,27 @@
1
- sqlspec/__init__.py,sha256=8_TR9bXd7bkA4qBGCzTHNawH7KXaJ4YlnCJzJwvgud8,2066
1
+ sqlspec/__init__.py,sha256=wy9ZqukBvr2WZkUmrljRHPGFjpUKWkEXxFWlTLuciJc,2123
2
2
  sqlspec/__main__.py,sha256=lXBKZMOXA1uY735Rnsb-GS7aXy0nt22tYmd2X9FcxrY,253
3
3
  sqlspec/__metadata__.py,sha256=IUw6MCTy1oeUJ1jAVYbuJLkOWbiAWorZ5W-E-SAD9N4,395
4
4
  sqlspec/_serialization.py,sha256=6U5-smk2h2yl0i6am2prtOLJTdu4NJQdcLlSfSUMaUQ,2590
5
- sqlspec/_sql.py,sha256=pIRc-jp_qkXSFvsZISlVRR_n8c3FYg7kY5oPJ_jYKbs,60372
5
+ sqlspec/_sql.py,sha256=UrJCc_iriWw9Dm1eeGswWoFvkeRtfueuTG_f01O7CAk,46623
6
6
  sqlspec/_typing.py,sha256=jv-7QHGLrJLfnP86bR-Xcmj3PDoddNZEKDz_vYRBiAU,22684
7
- sqlspec/base.py,sha256=lVLzFD-nzEU6QnwnU0kRWh3XWjbvXWX0XnnUViYBoQk,21767
7
+ sqlspec/base.py,sha256=OhFSpDaweCjZEabpTtl95pg91WzMko76d7sFOjyZSoo,25730
8
8
  sqlspec/cli.py,sha256=3ZxPwl4neNWyrAkM9J9ccC_gaFigDJbhuZfx15JVE7E,9903
9
9
  sqlspec/config.py,sha256=s7csxGK0SlTvB9jOvHlKKm4Y272RInQrUd6hGXwy31Q,14974
10
10
  sqlspec/exceptions.py,sha256=mCqNJ0JSPA-TUPpAfdctwwqJWbiNsWap5ATNNRdczwU,6159
11
- sqlspec/loader.py,sha256=sIK4I8L1Qe6hyoi6OHuaaAUUTdj4UrsRca16fuMs8HM,27259
11
+ sqlspec/loader.py,sha256=KSL5OsjPsuZZJrgohdhdmimwDqVPj_BvHqHIpP2Fq_0,25818
12
12
  sqlspec/protocols.py,sha256=iwwy7zdIBV7TcoxIYpKuTvN5fGiULQac2f4a-saxyKU,12937
13
13
  sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- sqlspec/typing.py,sha256=JEq2VsTaLdNZ1HAqj3n_HgQgdwlQQOCcZx3VBiPs0UA,7393
14
+ sqlspec/typing.py,sha256=yj8D8O-pkfUVZDfVHEgQaB95-5alwgQbp_sqNJOVhvQ,6301
15
15
  sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  sqlspec/adapters/adbc/__init__.py,sha256=CqBaEahvHbQ5NxmBJuuCtZ8v5wuaPgbqSSe9WUhglWY,336
17
17
  sqlspec/adapters/adbc/_types.py,sha256=htTZ20qVo6Iod_ooUTLGd0xAL8AUYA4qeOexTaLQG3Q,351
18
18
  sqlspec/adapters/adbc/config.py,sha256=UdS_4q5tsXKPEilD2dLtk9H1BI02CTSvhIWEDChrPEs,13871
19
19
  sqlspec/adapters/adbc/driver.py,sha256=nYS6e6DXxZ8lHzUFvXvC8qtcGSBTvK8IF_NlBbw56pg,20217
20
- sqlspec/adapters/aiosqlite/__init__.py,sha256=q2YXU9WCL2RSYFvd0DiXz5PeCaezCRmrqmQVd86V2so,577
20
+ sqlspec/adapters/aiosqlite/__init__.py,sha256=rgooFeHm7IsnC9fOnRQwMvbJdgkTvhnNTYphayVz9q8,869
21
21
  sqlspec/adapters/aiosqlite/_types.py,sha256=M8VqaW6iCigfExhdJM2yPAN09Ue2yBoBL59-QXGBObo,355
22
- sqlspec/adapters/aiosqlite/config.py,sha256=F_trn-H2KcB1sH1fXdGKYNLcDFwu28WszTBoESK8D0c,9036
23
- sqlspec/adapters/aiosqlite/driver.py,sha256=pU6uyvZSDrUsgkLkBW1guq6wno5FOyqt9Tg8dg6L7HM,9644
22
+ sqlspec/adapters/aiosqlite/config.py,sha256=tSw4zN9fdq0T7cWFmxtw1FGVDsGWWnblxUNhZb3wVRM,8504
23
+ sqlspec/adapters/aiosqlite/driver.py,sha256=qy1O3QBCuuM-M-O0j4DRHtPShU5Ngbm24UpgfFrbnQE,10286
24
+ sqlspec/adapters/aiosqlite/pool.py,sha256=3DzbAD2bKw45fFiChnV-RzgHnTQJEoSX3SOP3A4SmE8,16905
24
25
  sqlspec/adapters/asyncmy/__init__.py,sha256=wBgak4MA3ySaGQHUxrnv3HdSVQKKRWf1_DmENL0LkWs,531
25
26
  sqlspec/adapters/asyncmy/_types.py,sha256=WbwREzJkLYmqd4c7A7cu04WaD5g7-n35ZETHZvbP1Z8,250
26
27
  sqlspec/adapters/asyncmy/config.py,sha256=8fGiiFjIaT_y6OcVj_7dTK9sSuLqucMRsGcRPoYigy8,6557
@@ -33,10 +34,11 @@ sqlspec/adapters/bigquery/__init__.py,sha256=1nzkWubO4ZObuK27QoeGfS05ed5v02NU4Ga
33
34
  sqlspec/adapters/bigquery/_types.py,sha256=gECmbiSmZmnR-xJpmznhnva4SbhhdcYQ09jBdqMAmOs,255
34
35
  sqlspec/adapters/bigquery/config.py,sha256=KYVvhcd4MyU2ak0t1mX3bd3EXlVMEciO7YPaDtZsPc8,11975
35
36
  sqlspec/adapters/bigquery/driver.py,sha256=3y8gwrYTt6ktPKE0ihGk5Dj7yvL52Gc8uT1b1ynaCuA,24016
36
- sqlspec/adapters/duckdb/__init__.py,sha256=iovQlYGfizYpIZpbc1YymK2xt6pZ4ApQj6I0Q0lHc3I,603
37
+ sqlspec/adapters/duckdb/__init__.py,sha256=c5GCYxhTFhvB8fUTt_d-dipaQfM8X5kv4GsU47SwJ6E,693
37
38
  sqlspec/adapters/duckdb/_types.py,sha256=4p5nuD1yNs0fmQ5sGxKFx2ru6jUCPrpsYgqfh-uZHM8,270
38
- sqlspec/adapters/duckdb/config.py,sha256=krVy5BsS7f2Uv4vmZrwpxlXzbe-MweS6JbHm809NJqE,18610
39
+ sqlspec/adapters/duckdb/config.py,sha256=ISQb8-I3MK08CGXKnsQy1f1qNmm8_m7kBwbi0AS-v4g,10496
39
40
  sqlspec/adapters/duckdb/driver.py,sha256=HDRPYh1k0JnnnaPpyv8oONn7UAYDCQyTK4fsgFDv6uk,15003
41
+ sqlspec/adapters/duckdb/pool.py,sha256=F_f_liV4nPLPJFYzHF3bWB13RHS5XYbrD8XUPE5fS08,8686
40
42
  sqlspec/adapters/oracledb/__init__.py,sha256=AUsZ8m9tDgNwxv9m4LtkIs9Ib6hOtBrGNm-Ee4HWNq0,843
41
43
  sqlspec/adapters/oracledb/_types.py,sha256=yPJTQE37HYVgvxI3USonWvFJ2VcfaNnXqfgKNVphmcQ,400
42
44
  sqlspec/adapters/oracledb/config.py,sha256=yZITXSWuHKwrjVcuaTLyR9RtVb3WtzmWlBQTjvyUtPo,11383
@@ -49,35 +51,36 @@ sqlspec/adapters/psycopg/__init__.py,sha256=swmTz8xlj6LvB-i78tBSE_T-sez2e6lFJW2c
49
51
  sqlspec/adapters/psycopg/_types.py,sha256=UJBKDWgARoSR6UxSy8zcIP7HSHTpXU5moJTsjDj0M4M,563
50
52
  sqlspec/adapters/psycopg/config.py,sha256=tyxP1WbLQlwvdWdykG_iluIaQg0O6GLUwMLtfaRQ3sE,16268
51
53
  sqlspec/adapters/psycopg/driver.py,sha256=qMRaoUI1RF0JLGEEIWzZJTyPd5jEaRFq6ZY0dkukrCQ,33434
52
- sqlspec/adapters/sqlite/__init__.py,sha256=wDN0StuJxCy0VX1fVYDngTFUP5Cx8d0-foeJeJaEVOw,484
54
+ sqlspec/adapters/sqlite/__init__.py,sha256=hGZX0D6vHJMSah60_hgWHoLmcqKGm1lYcz2r02wc0p0,574
53
55
  sqlspec/adapters/sqlite/_types.py,sha256=4Nqolhk8s4mwLw13BwUjuyhAbM9BsKwJCvcmjMWkhaY,246
54
- sqlspec/adapters/sqlite/config.py,sha256=jTomeuHahwMN9huOnQclAuJyiFL1m8hoexQxWCn0Ckg,9166
56
+ sqlspec/adapters/sqlite/config.py,sha256=-t7NkBRJHQQ7jeq5zD5KL8yb0RlJwP1vUkw7xc1F37k,5058
55
57
  sqlspec/adapters/sqlite/driver.py,sha256=uAhasoCNOV30gTvl1EUpofRcm8YiEW5RnVy07XyypzI,12103
56
- sqlspec/builder/__init__.py,sha256=E3UGimdSOUK_ZGxFEOsCduwWWwTxcqoLe3Rvh4KbGNY,1429
58
+ sqlspec/adapters/sqlite/pool.py,sha256=FxlnBksmiPDLyMB0C7j3wjfc45PU_RrukTwNAzN3DDQ,4977
59
+ sqlspec/builder/__init__.py,sha256=AY_D6TlSpYFJ7sU39S9xubq-eXZTpuNDlisoeK0LojU,1675
57
60
  sqlspec/builder/_base.py,sha256=yz-6e-x66vrNne6z5zq4Ae0C3p0mHEEIe1Y8er-A0pg,17812
58
61
  sqlspec/builder/_column.py,sha256=46baZj403BKfGjZcMc9LtQfMLeMQ7ROPyFL64V7dDM0,13124
59
62
  sqlspec/builder/_ddl.py,sha256=A_fV4d92o2ZOhX150YMSsQDm3veQTQrwlxgLdFMBBfg,48184
60
63
  sqlspec/builder/_ddl_utils.py,sha256=1mFSNe9w5rZXA1Ud4CTuca7eibi0XayHrIPcnEgRB7s,4034
61
64
  sqlspec/builder/_delete.py,sha256=xWA5nQB3UB8kpEGXN2k5ynt4cGZ7blkNoURpI0bKoeg,2264
62
- sqlspec/builder/_insert.py,sha256=L3BiVOcbSbRGscqINU2LCoKn7G6FqDCONGq3D-xS4JY,9522
65
+ sqlspec/builder/_insert.py,sha256=rARWh5olbur6oPP_3FoAuJp8irj5cRLW0mKdWEx2cqU,16896
63
66
  sqlspec/builder/_merge.py,sha256=95PLQSKA3zjk0wTZG3m817fTZpsS95PrS2qF34iLAP8,2004
64
- sqlspec/builder/_parsing_utils.py,sha256=d8zpI3rVdDhA_BfSP9NMHCayS4-Ve83YiAnlYX-bkBE,5644
67
+ sqlspec/builder/_parsing_utils.py,sha256=RH8OFBFAetalEgHW5JLcEyyCdW_awVdy07MjboOkqL4,8383
65
68
  sqlspec/builder/_select.py,sha256=m5sfyuAssjlNimLLNBAeFooVIfM2FgKN1boPfdsOkaA,5785
66
69
  sqlspec/builder/_update.py,sha256=UFHM_uWVY5RnZQ6winiyjKNtBryKRAXJlXtCVQdifyw,6015
67
70
  sqlspec/builder/mixins/__init__.py,sha256=YXhAzKmQbQtne5j26SKWY8PUxwosl0RhlhLoahAdkj0,1885
68
71
  sqlspec/builder/mixins/_cte_and_set_ops.py,sha256=p5O9m_jvpaWxv1XP9Ys2DRI-qOTq30rr2EwYjAbIT8o,9088
69
72
  sqlspec/builder/mixins/_delete_operations.py,sha256=l0liajnoAfRgtWtyStuAIfxreEFRkNO4DtBwyGqAfic,1198
70
73
  sqlspec/builder/mixins/_insert_operations.py,sha256=3ZuVNAPgJG0fzOPaprwUPa0Un3NP7erHwtCg8AGZWD8,9500
71
- sqlspec/builder/mixins/_join_operations.py,sha256=jbJlNifGqxjsTfskrpUdW7wLjJtT7U3sNCfZKUQewRI,5597
72
- sqlspec/builder/mixins/_merge_operations.py,sha256=9y07xis3WfE2nAm1jsSHu2dea4SM6Zy5fr0aAYkz6yw,19741
74
+ sqlspec/builder/mixins/_join_operations.py,sha256=8o_aApK5cmJbNCNfWa4bs5fR2zgQUjon5p-oyiW41Qw,11440
75
+ sqlspec/builder/mixins/_merge_operations.py,sha256=e9QDv1s84-2F2ZAZrr7UJtKXhy3X0NDN7AZ--8mOTKw,24193
73
76
  sqlspec/builder/mixins/_order_limit_operations.py,sha256=ABPuFSqHRv7XaS9-3HNZO3Jn0QovhJrkYT158xxduns,4835
74
77
  sqlspec/builder/mixins/_pivot_operations.py,sha256=j5vdzXuEqB1Jn3Ie_QjVwSH2_OEi65oZ64bQJHd3jXo,6108
75
- sqlspec/builder/mixins/_select_operations.py,sha256=jJmrZEg0dbC1BRjmZnImkxGgiy7S2TgAePC0zLEPzuk,24946
76
- sqlspec/builder/mixins/_update_operations.py,sha256=0QblziF4NAKx8IwAOXUAvXOv-zrvf1C8LgTDlwmRD14,8085
77
- sqlspec/builder/mixins/_where_clause.py,sha256=LcZh2ZqAHP_lX3tZIALVkXFaDngldDYsP4CjMD4qqWc,32475
78
+ sqlspec/builder/mixins/_select_operations.py,sha256=m7iejdCw04mfxohNiHWeQSKQyI94vrhJ_JcYRhUPYw8,35314
79
+ sqlspec/builder/mixins/_update_operations.py,sha256=lk9VRM0KGmYhofbWChemJxSZF6I0LhrRgqMXVmXZMeU,8650
80
+ sqlspec/builder/mixins/_where_clause.py,sha256=1iz7Y2x_ooG2bOCu2zX0v5_bkGFpAckVQKvnyrR1JNQ,36373
78
81
  sqlspec/core/__init__.py,sha256=rU_xGsXhqIOnBbyB2InhJknYePm5NQ2DSWdBigror4g,1775
79
82
  sqlspec/core/cache.py,sha256=cLL9bd5wn1oeMzn5E5Ym0sAemA8U4QP6B55x4L9-26I,27044
80
- sqlspec/core/compiler.py,sha256=pfBRrMFvrNuCwQgzKNljNTYH3imARlek3Ja5mJkHI88,14652
83
+ sqlspec/core/compiler.py,sha256=XEAeKZhoVxfyvoDFozCGNe2CuwLpXFPltOQ87IBO5Cg,14712
81
84
  sqlspec/core/filters.py,sha256=X0wRd0vNOFgeOK98ReeTyKt408GCnnmE9p45Bvur3kw,31351
82
85
  sqlspec/core/hashing.py,sha256=4KyAFWtFDMYreoBGGPQppEuMWO6_NrRYlw9Lm-qeJqo,10429
83
86
  sqlspec/core/parameters.py,sha256=yLnGt_tqqpb28xrgnq3oQ-1mcf45Pjf6uE3c0ag5JJ4,54265
@@ -86,7 +89,7 @@ sqlspec/core/splitter.py,sha256=cb2P1B0q5vvALHi3SEJ7VdbRHH2GWsftrmJi9PYMbeE,2808
86
89
  sqlspec/core/statement.py,sha256=HsbSu0qnfJzpL_s1kwfxtWnyuCfAq8WjYRc3YQqxkDw,25700
87
90
  sqlspec/driver/__init__.py,sha256=QVpDRQGd1GreIP199en6qDbq-cZJcEF5go68DINagUk,569
88
91
  sqlspec/driver/_async.py,sha256=29XYWjeIuIwElO3QFUtEqQZq1ss2Ulueh0UD-aX2x-E,19636
89
- sqlspec/driver/_common.py,sha256=bjJCBfM5YaU-98vEnEc5qFcjWvaUVEcQS6v3gGC0UKw,26313
92
+ sqlspec/driver/_common.py,sha256=Y2aOyIkHYGhQ8NadDmJ3gqtHAVS0Ivv99a0eliTZEDk,26728
90
93
  sqlspec/driver/_sync.py,sha256=pCKNHj46HcZYn9292FWyoWkNc6gj4ArUT8ttik4YyRQ,19408
91
94
  sqlspec/driver/mixins/__init__.py,sha256=gN4pQyJXxNy0xi91dcMJGA7DQ7TbjGjQI24SSpZc6Go,248
92
95
  sqlspec/driver/mixins/_result_tools.py,sha256=8z-W4py3BOtn3WB7ElpsVAEjGRozgHsfymTE_oXqcnw,7576
@@ -110,7 +113,7 @@ sqlspec/migrations/tracker.py,sha256=-gfHgvcYo1uBdr9FKrIxaU_0v734K5gpdLMuoaX29nQ
110
113
  sqlspec/migrations/utils.py,sha256=gWnCOdr8pwfkgG-FSUJgRz4q9TlCgOXY_B7n59NrgVA,3746
111
114
  sqlspec/storage/__init__.py,sha256=bLrUfW_E41HH-Pi5kqFTPVYZiSsxlG7OZO1xP23nDSI,691
112
115
  sqlspec/storage/capabilities.py,sha256=vyousxls9jISsykgoybpNHlGWN6Hq_pKcsZ5DmKGWvU,3045
113
- sqlspec/storage/registry.py,sha256=NV-NdAcMdGqU5bHbXbkMuU_HRYuEgii7B4ldXnVSIo4,9529
116
+ sqlspec/storage/registry.py,sha256=Bt7M7pyxaPP0_bK-VqOWzQL0V0dlNAE1Od4CSgjQbKQ,9467
114
117
  sqlspec/storage/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
118
  sqlspec/storage/backends/base.py,sha256=KS2JRZILoH_R_xsfKtYkqQ5a1r5OOBDSE5KbibTmhGY,5730
116
119
  sqlspec/storage/backends/fsspec.py,sha256=YVr8X_q5F4Xrr9SyfUDve1dZ9E6KppuM8w6tvLwPKpc,16050
@@ -126,9 +129,9 @@ sqlspec/utils/singleton.py,sha256=SKnszJi1NPeERgX7IjVIGYAYx4XqR1E_rph3bU6olAU,10
126
129
  sqlspec/utils/sync_tools.py,sha256=WRuk1ZEhb_0CRrumAdnmi-i-dV6qVd3cgJyZw8RY9QQ,7390
127
130
  sqlspec/utils/text.py,sha256=n5K0gvXvyCc8jNteNKsBOymwf_JnQ65f3lu0YaYq4Ys,2898
128
131
  sqlspec/utils/type_guards.py,sha256=9C4SRebO4JiQrMzcJZFUA0KjSU48G26RmX6lbijyjBg,30476
129
- sqlspec-0.16.1.dist-info/METADATA,sha256=1qzVVweBzJeGdf5YDTy23s4hBBH8ePnHU09sfi_IzAc,16822
130
- sqlspec-0.16.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
131
- sqlspec-0.16.1.dist-info/entry_points.txt,sha256=G-ZqY1Nuuw3Iys7nXw23f6ILenk_Lt47VdK2mhJCWHg,53
132
- sqlspec-0.16.1.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
133
- sqlspec-0.16.1.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
134
- sqlspec-0.16.1.dist-info/RECORD,,
132
+ sqlspec-0.17.0.dist-info/METADATA,sha256=3VTksHJXA8Azr2boYZpQtPO27y_QXZq_jYk-zuftYzE,16822
133
+ sqlspec-0.17.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
+ sqlspec-0.17.0.dist-info/entry_points.txt,sha256=G-ZqY1Nuuw3Iys7nXw23f6ILenk_Lt47VdK2mhJCWHg,53
135
+ sqlspec-0.17.0.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
136
+ sqlspec-0.17.0.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
137
+ sqlspec-0.17.0.dist-info/RECORD,,