sqlspec 0.16.0__py3-none-any.whl → 0.16.1__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 (39) hide show
  1. sqlspec/_sql.py +448 -15
  2. sqlspec/builder/_base.py +77 -44
  3. sqlspec/builder/_column.py +0 -4
  4. sqlspec/builder/_ddl.py +15 -52
  5. sqlspec/builder/_ddl_utils.py +0 -1
  6. sqlspec/builder/_delete.py +4 -5
  7. sqlspec/builder/_insert.py +59 -44
  8. sqlspec/builder/_merge.py +17 -2
  9. sqlspec/builder/_parsing_utils.py +11 -11
  10. sqlspec/builder/_select.py +29 -33
  11. sqlspec/builder/_update.py +4 -2
  12. sqlspec/builder/mixins/_cte_and_set_ops.py +47 -20
  13. sqlspec/builder/mixins/_delete_operations.py +6 -1
  14. sqlspec/builder/mixins/_insert_operations.py +126 -34
  15. sqlspec/builder/mixins/_join_operations.py +11 -4
  16. sqlspec/builder/mixins/_merge_operations.py +81 -21
  17. sqlspec/builder/mixins/_order_limit_operations.py +15 -3
  18. sqlspec/builder/mixins/_pivot_operations.py +11 -2
  19. sqlspec/builder/mixins/_select_operations.py +12 -8
  20. sqlspec/builder/mixins/_update_operations.py +37 -14
  21. sqlspec/builder/mixins/_where_clause.py +55 -43
  22. sqlspec/core/cache.py +26 -28
  23. sqlspec/core/compiler.py +58 -37
  24. sqlspec/core/parameters.py +80 -52
  25. sqlspec/core/result.py +30 -17
  26. sqlspec/core/statement.py +31 -21
  27. sqlspec/driver/_async.py +76 -46
  28. sqlspec/driver/_common.py +25 -6
  29. sqlspec/driver/_sync.py +73 -43
  30. sqlspec/driver/mixins/_result_tools.py +51 -22
  31. sqlspec/driver/mixins/_sql_translator.py +61 -11
  32. sqlspec/protocols.py +7 -0
  33. sqlspec/utils/type_guards.py +7 -3
  34. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/METADATA +1 -1
  35. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/RECORD +39 -39
  36. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/WHEEL +0 -0
  37. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/entry_points.txt +0 -0
  38. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/licenses/LICENSE +0 -0
  39. {sqlspec-0.16.0.dist-info → sqlspec-0.16.1.dist-info}/licenses/NOTICE +0 -0
@@ -5,12 +5,12 @@ from collections.abc import Sequence
5
5
  from enum import Enum
6
6
  from functools import partial
7
7
  from pathlib import Path, PurePath
8
- from typing import Any, Callable, Optional, overload
8
+ from typing import Any, Callable, Final, Optional, overload
9
9
  from uuid import UUID
10
10
 
11
11
  from mypy_extensions import trait
12
12
 
13
- from sqlspec.exceptions import SQLSpecError, wrap_exceptions
13
+ from sqlspec.exceptions import SQLSpecError
14
14
  from sqlspec.typing import (
15
15
  CATTRS_INSTALLED,
16
16
  ModelDTOT,
@@ -27,7 +27,12 @@ __all__ = ("_DEFAULT_TYPE_DECODERS", "_default_msgspec_deserializer")
27
27
 
28
28
 
29
29
  logger = logging.getLogger(__name__)
30
- _DEFAULT_TYPE_DECODERS: list[tuple[Callable[[Any], bool], Callable[[Any, Any], Any]]] = [
30
+
31
+ # Constants for performance optimization
32
+ _DATETIME_TYPES: Final[set[type]] = {datetime.datetime, datetime.date, datetime.time}
33
+ _PATH_TYPES: Final[tuple[type, ...]] = (Path, PurePath, UUID)
34
+
35
+ _DEFAULT_TYPE_DECODERS: Final[list[tuple[Callable[[Any], bool], Callable[[Any, Any], Any]]]] = [
31
36
  (lambda x: x is UUID, lambda t, v: t(v.hex)),
32
37
  (lambda x: x is datetime.datetime, lambda t, v: t(v.isoformat())),
33
38
  (lambda x: x is datetime.date, lambda t, v: t(v.isoformat())),
@@ -48,17 +53,32 @@ def _default_msgspec_deserializer(
48
53
  for predicate, decoder in type_decoders:
49
54
  if predicate(target_type):
50
55
  return decoder(target_type, value)
56
+
57
+ # Fast path checks using type identity and isinstance
51
58
  if target_type is UUID and isinstance(value, UUID):
52
59
  return value.hex
53
- if target_type in {datetime.datetime, datetime.date, datetime.time}:
54
- with wrap_exceptions(suppress=AttributeError):
60
+
61
+ # Use pre-computed set for faster lookup
62
+ if target_type in _DATETIME_TYPES:
63
+ try:
55
64
  return value.isoformat()
65
+ except AttributeError:
66
+ pass
67
+
56
68
  if isinstance(target_type, type) and issubclass(target_type, Enum) and isinstance(value, Enum):
57
69
  return value.value
70
+
58
71
  if isinstance(value, target_type):
59
72
  return value
60
- if issubclass(target_type, (Path, PurePath, UUID)):
61
- return target_type(value)
73
+
74
+ # Check for path types using pre-computed tuple
75
+ if isinstance(target_type, type):
76
+ try:
77
+ if issubclass(target_type, (Path, PurePath)) or issubclass(target_type, UUID):
78
+ return target_type(str(value))
79
+ except (TypeError, ValueError):
80
+ pass
81
+
62
82
  return value
63
83
 
64
84
 
@@ -119,46 +139,55 @@ class ToSchemaMixin:
119
139
  return data
120
140
  if is_dataclass(schema_type):
121
141
  if isinstance(data, list):
122
- return [schema_type(**dict(item) if hasattr(item, "keys") else item) for item in data] # type: ignore[operator]
142
+ result: list[Any] = []
143
+ for item in data:
144
+ if hasattr(item, "keys"):
145
+ result.append(schema_type(**dict(item))) # type: ignore[operator]
146
+ else:
147
+ result.append(item)
148
+ return result
123
149
  if hasattr(data, "keys"):
124
150
  return schema_type(**dict(data)) # type: ignore[operator]
125
151
  if isinstance(data, dict):
126
152
  return schema_type(**data) # type: ignore[operator]
127
- # Fallback for other types
128
153
  return data
129
154
  if is_msgspec_struct(schema_type):
155
+ # Cache the deserializer to avoid repeated partial() calls
156
+ deserializer = partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS)
130
157
  if not isinstance(data, Sequence):
131
- return convert(
132
- obj=data,
133
- type=schema_type,
134
- from_attributes=True,
135
- dec_hook=partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS),
136
- )
158
+ return convert(obj=data, type=schema_type, from_attributes=True, dec_hook=deserializer)
137
159
  return convert(
138
160
  obj=data,
139
161
  type=list[schema_type], # type: ignore[valid-type] # pyright: ignore
140
162
  from_attributes=True,
141
- dec_hook=partial(_default_msgspec_deserializer, type_decoders=_DEFAULT_TYPE_DECODERS),
163
+ dec_hook=deserializer,
142
164
  )
143
165
  if is_pydantic_model(schema_type):
144
166
  if not isinstance(data, Sequence):
145
- return get_type_adapter(schema_type).validate_python(data, from_attributes=True) # pyright: ignore
146
- return get_type_adapter(list[schema_type]).validate_python(data, from_attributes=True) # type: ignore[valid-type] # pyright: ignore
167
+ adapter = get_type_adapter(schema_type)
168
+ return adapter.validate_python(data, from_attributes=True) # pyright: ignore
169
+ list_adapter = get_type_adapter(list[schema_type]) # type: ignore[valid-type] # pyright: ignore
170
+ return list_adapter.validate_python(data, from_attributes=True)
147
171
  if is_attrs_schema(schema_type):
148
172
  if CATTRS_INSTALLED:
149
173
  if isinstance(data, Sequence):
150
174
  return cattrs_structure(data, list[schema_type]) # type: ignore[valid-type] # pyright: ignore
151
- # If data is already structured (attrs instance), unstructure it first
152
175
  if hasattr(data, "__attrs_attrs__"):
153
- data = cattrs_unstructure(data)
176
+ unstructured_data = cattrs_unstructure(data)
177
+ return cattrs_structure(unstructured_data, schema_type) # pyright: ignore
154
178
  return cattrs_structure(data, schema_type) # pyright: ignore
155
179
  if isinstance(data, list):
156
- return [schema_type(**dict(item) if hasattr(item, "keys") else attrs_asdict(item)) for item in data]
180
+ attrs_result: list[Any] = []
181
+ for item in data:
182
+ if hasattr(item, "keys"):
183
+ attrs_result.append(schema_type(**dict(item)))
184
+ else:
185
+ attrs_result.append(schema_type(**attrs_asdict(item)))
186
+ return attrs_result
157
187
  if hasattr(data, "keys"):
158
188
  return schema_type(**dict(data))
159
189
  if isinstance(data, dict):
160
190
  return schema_type(**data)
161
- # Fallback for other types
162
191
  return data
163
192
  msg = "`schema_type` should be a valid Dataclass, Pydantic model, Msgspec struct, or Attrs class"
164
193
  raise SQLSpecError(msg)
@@ -1,3 +1,5 @@
1
+ from typing import Final, NoReturn, Optional
2
+
1
3
  from mypy_extensions import trait
2
4
  from sqlglot import exp, parse_one
3
5
  from sqlglot.dialects.dialect import DialectType
@@ -7,6 +9,9 @@ from sqlspec.exceptions import SQLConversionError
7
9
 
8
10
  __all__ = ("SQLTranslatorMixin",)
9
11
 
12
+ # Constants for better performance
13
+ _DEFAULT_PRETTY: Final[bool] = True
14
+
10
15
 
11
16
  @trait
12
17
  class SQLTranslatorMixin:
@@ -14,23 +19,68 @@ class SQLTranslatorMixin:
14
19
 
15
20
  __slots__ = ()
16
21
 
17
- def convert_to_dialect(self, statement: "Statement", to_dialect: DialectType = None, pretty: bool = True) -> str:
22
+ def convert_to_dialect(
23
+ self, statement: "Statement", to_dialect: "Optional[DialectType]" = None, pretty: bool = _DEFAULT_PRETTY
24
+ ) -> str:
25
+ """Convert a statement to a target SQL dialect.
26
+
27
+ Args:
28
+ statement: SQL statement to convert
29
+ to_dialect: Target dialect (defaults to current dialect)
30
+ pretty: Whether to format the output SQL
31
+
32
+ Returns:
33
+ SQL string in target dialect
34
+
35
+ Raises:
36
+ SQLConversionError: If parsing or conversion fails
37
+ """
38
+ # Fast path: get the parsed expression with minimal allocations
39
+ parsed_expression: Optional[exp.Expression] = None
40
+
18
41
  if statement is not None and isinstance(statement, SQL):
19
42
  if statement.expression is None:
20
- msg = "Statement could not be parsed"
21
- raise SQLConversionError(msg)
43
+ self._raise_statement_parse_error()
22
44
  parsed_expression = statement.expression
23
45
  elif isinstance(statement, exp.Expression):
24
46
  parsed_expression = statement
25
47
  else:
26
- try:
27
- parsed_expression = parse_one(statement, dialect=self.dialect) # type: ignore[attr-defined]
28
- except Exception as e:
29
- error_msg = f"Failed to parse SQL statement: {e!s}"
30
- raise SQLConversionError(error_msg) from e
48
+ parsed_expression = self._parse_statement_safely(statement)
49
+
50
+ # Get target dialect with fallback
31
51
  target_dialect = to_dialect or self.dialect # type: ignore[attr-defined]
52
+
53
+ # Generate SQL with error handling
54
+ return self._generate_sql_safely(parsed_expression, target_dialect, pretty)
55
+
56
+ def _parse_statement_safely(self, statement: "Statement") -> "exp.Expression":
57
+ """Parse statement with copy=False optimization and proper error handling."""
58
+ try:
59
+ # Convert statement to string if needed
60
+ sql_string = str(statement)
61
+ # Use copy=False for better performance
62
+ return parse_one(sql_string, dialect=self.dialect, copy=False) # type: ignore[attr-defined]
63
+ except Exception as e:
64
+ self._raise_parse_error(e)
65
+
66
+ def _generate_sql_safely(self, expression: "exp.Expression", dialect: DialectType, pretty: bool) -> str:
67
+ """Generate SQL with proper error handling."""
32
68
  try:
33
- return parsed_expression.sql(dialect=target_dialect, pretty=pretty)
69
+ return expression.sql(dialect=dialect, pretty=pretty)
34
70
  except Exception as e:
35
- error_msg = f"Failed to convert SQL expression to {target_dialect}: {e!s}"
36
- raise SQLConversionError(error_msg) from e
71
+ self._raise_conversion_error(dialect, e)
72
+
73
+ def _raise_statement_parse_error(self) -> NoReturn:
74
+ """Raise error for unparsable statements."""
75
+ msg = "Statement could not be parsed"
76
+ raise SQLConversionError(msg)
77
+
78
+ def _raise_parse_error(self, e: Exception) -> NoReturn:
79
+ """Raise error for parsing failures."""
80
+ error_msg = f"Failed to parse SQL statement: {e!s}"
81
+ raise SQLConversionError(error_msg) from e
82
+
83
+ def _raise_conversion_error(self, dialect: DialectType, e: Exception) -> NoReturn:
84
+ """Raise error for conversion failures."""
85
+ error_msg = f"Failed to convert SQL expression to {dialect}: {e!s}"
86
+ raise SQLConversionError(error_msg) from e
sqlspec/protocols.py CHANGED
@@ -371,6 +371,9 @@ class SQLBuilderProtocol(Protocol):
371
371
  _expression: "Optional[exp.Expression]"
372
372
  _parameters: dict[str, Any]
373
373
  _parameter_counter: int
374
+ _columns: Any # Optional attribute for some builders
375
+ _table: Any # Optional attribute for some builders
376
+ _with_ctes: Any # Optional attribute for some builders
374
377
  dialect: Any
375
378
  dialect_name: "Optional[str]"
376
379
 
@@ -383,6 +386,10 @@ class SQLBuilderProtocol(Protocol):
383
386
  """Add a parameter to the builder."""
384
387
  ...
385
388
 
389
+ def _generate_unique_parameter_name(self, base_name: str) -> str:
390
+ """Generate a unique parameter name."""
391
+ ...
392
+
386
393
  def _parameterize_expression(self, expression: "exp.Expression") -> "exp.Expression":
387
394
  """Replace literal values in an expression with bound parameters."""
388
395
  ...
@@ -841,9 +841,13 @@ def has_sql_method(obj: Any) -> "TypeGuard[HasSQLMethodProtocol]":
841
841
 
842
842
  def has_query_builder_parameters(obj: Any) -> "TypeGuard[SQLBuilderProtocol]":
843
843
  """Check if an object is a query builder with parameters property."""
844
- from sqlspec.protocols import SQLBuilderProtocol
845
-
846
- return isinstance(obj, SQLBuilderProtocol)
844
+ return (
845
+ hasattr(obj, "build")
846
+ and callable(getattr(obj, "build", None))
847
+ and hasattr(obj, "parameters")
848
+ and hasattr(obj, "add_parameter")
849
+ and callable(getattr(obj, "add_parameter", None))
850
+ )
847
851
 
848
852
 
849
853
  def is_object_store_item(obj: Any) -> "TypeGuard[ObjectStoreItemProtocol]":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlspec
3
- Version: 0.16.0
3
+ Version: 0.16.1
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/
@@ -2,14 +2,14 @@ sqlspec/__init__.py,sha256=8_TR9bXd7bkA4qBGCzTHNawH7KXaJ4YlnCJzJwvgud8,2066
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=HbJYrs9NCEUQhFermrcS5fDhm3aRxbabLLESHf2aMQg,45544
5
+ sqlspec/_sql.py,sha256=pIRc-jp_qkXSFvsZISlVRR_n8c3FYg7kY5oPJ_jYKbs,60372
6
6
  sqlspec/_typing.py,sha256=jv-7QHGLrJLfnP86bR-Xcmj3PDoddNZEKDz_vYRBiAU,22684
7
7
  sqlspec/base.py,sha256=lVLzFD-nzEU6QnwnU0kRWh3XWjbvXWX0XnnUViYBoQk,21767
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
11
  sqlspec/loader.py,sha256=sIK4I8L1Qe6hyoi6OHuaaAUUTdj4UrsRca16fuMs8HM,27259
12
- sqlspec/protocols.py,sha256=nWj5DwWGBkY3i5KV5MsXSSALBbbR8vV_i17YoWNpW4U,12632
12
+ sqlspec/protocols.py,sha256=iwwy7zdIBV7TcoxIYpKuTvN5fGiULQac2f4a-saxyKU,12937
13
13
  sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  sqlspec/typing.py,sha256=JEq2VsTaLdNZ1HAqj3n_HgQgdwlQQOCcZx3VBiPs0UA,7393
15
15
  sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -54,43 +54,43 @@ sqlspec/adapters/sqlite/_types.py,sha256=4Nqolhk8s4mwLw13BwUjuyhAbM9BsKwJCvcmjMW
54
54
  sqlspec/adapters/sqlite/config.py,sha256=jTomeuHahwMN9huOnQclAuJyiFL1m8hoexQxWCn0Ckg,9166
55
55
  sqlspec/adapters/sqlite/driver.py,sha256=uAhasoCNOV30gTvl1EUpofRcm8YiEW5RnVy07XyypzI,12103
56
56
  sqlspec/builder/__init__.py,sha256=E3UGimdSOUK_ZGxFEOsCduwWWwTxcqoLe3Rvh4KbGNY,1429
57
- sqlspec/builder/_base.py,sha256=vApAFc9-Vw4DsiQP7iQhtfIEjGy10mvi-6DjJnulZiM,17234
58
- sqlspec/builder/_column.py,sha256=sGDoRhgeqNv69M2jIcNDWxTsMV3TKRNtktpDwl_ssSI,13224
59
- sqlspec/builder/_ddl.py,sha256=6TvCMiJAuPBtwXbAupGKnrJ9Wb9-VK5P6cfEFbE9CT8,50284
60
- sqlspec/builder/_ddl_utils.py,sha256=qlKT9TqlaymwZLiZjHXIVvFofiWekCLNu-AvPFzUiac,4115
61
- sqlspec/builder/_delete.py,sha256=YCAV7GUutY-j1Z6tQ9Q0CE4K4Z5LbZXldMOpS2uxAi4,2301
62
- sqlspec/builder/_insert.py,sha256=ozqnpsQUcqzjvGvcgaUKzvrH9GKisY2DGYR7EwXdi_E,9089
63
- sqlspec/builder/_merge.py,sha256=pabh0G7DsMZoOG8cGep0qLLdgnyoxQFRUUglhE5yScE,1570
64
- sqlspec/builder/_parsing_utils.py,sha256=3XRrL2T2eG_aHfF1kQID9dZpxIgVAkB4u8Mzl1Nm-Cs,5617
65
- sqlspec/builder/_select.py,sha256=oxi-5ezjsAt7n6OQm1FNCSO_wFo8djWBPL9f-kiUo9g,5992
66
- sqlspec/builder/_update.py,sha256=l9tHwC96VSmk8zGMhzB_S4YuD2_6q4cBXMboqoqvLJ0,5969
57
+ sqlspec/builder/_base.py,sha256=yz-6e-x66vrNne6z5zq4Ae0C3p0mHEEIe1Y8er-A0pg,17812
58
+ sqlspec/builder/_column.py,sha256=46baZj403BKfGjZcMc9LtQfMLeMQ7ROPyFL64V7dDM0,13124
59
+ sqlspec/builder/_ddl.py,sha256=A_fV4d92o2ZOhX150YMSsQDm3veQTQrwlxgLdFMBBfg,48184
60
+ sqlspec/builder/_ddl_utils.py,sha256=1mFSNe9w5rZXA1Ud4CTuca7eibi0XayHrIPcnEgRB7s,4034
61
+ sqlspec/builder/_delete.py,sha256=xWA5nQB3UB8kpEGXN2k5ynt4cGZ7blkNoURpI0bKoeg,2264
62
+ sqlspec/builder/_insert.py,sha256=L3BiVOcbSbRGscqINU2LCoKn7G6FqDCONGq3D-xS4JY,9522
63
+ sqlspec/builder/_merge.py,sha256=95PLQSKA3zjk0wTZG3m817fTZpsS95PrS2qF34iLAP8,2004
64
+ sqlspec/builder/_parsing_utils.py,sha256=d8zpI3rVdDhA_BfSP9NMHCayS4-Ve83YiAnlYX-bkBE,5644
65
+ sqlspec/builder/_select.py,sha256=m5sfyuAssjlNimLLNBAeFooVIfM2FgKN1boPfdsOkaA,5785
66
+ sqlspec/builder/_update.py,sha256=UFHM_uWVY5RnZQ6winiyjKNtBryKRAXJlXtCVQdifyw,6015
67
67
  sqlspec/builder/mixins/__init__.py,sha256=YXhAzKmQbQtne5j26SKWY8PUxwosl0RhlhLoahAdkj0,1885
68
- sqlspec/builder/mixins/_cte_and_set_ops.py,sha256=BPPkDTFo2Feja7Vers0BrC_JIYcpfOYSTZ9GIV_UOZ4,8317
69
- sqlspec/builder/mixins/_delete_operations.py,sha256=0f8ZZMFx5b53EUx1oF264owLb6aWP45naeB6g-BZQys,1068
70
- sqlspec/builder/mixins/_insert_operations.py,sha256=O2Au5gnoPXTsLtPrlqtHwonIKgY4MV6nkIdzXr3gySk,6340
71
- sqlspec/builder/mixins/_join_operations.py,sha256=5qloj7JmRWBi7pFBpAY1acwg_O_1CpcHeYMbzkBKfBE,5507
72
- sqlspec/builder/mixins/_merge_operations.py,sha256=AnbZ53hXNsfCXdfOvZvSSLW-359R3XwaQD8y_-EBpZc,17642
73
- sqlspec/builder/mixins/_order_limit_operations.py,sha256=NuNUb_DJKTdnbjasjOh27zLtbr1JZ4ygS0NH76G4foI,4514
74
- sqlspec/builder/mixins/_pivot_operations.py,sha256=nkV9kG15rSoX0IWRAmaZjxyY8J7_5sScgxrRtYjddqE,5886
75
- sqlspec/builder/mixins/_select_operations.py,sha256=VvmMUmz2Fyhsv-J5O-3iLxMi59tupmgekPLCYxACJSg,24896
76
- sqlspec/builder/mixins/_update_operations.py,sha256=j4jN1gJnFu-9PG14xgoqXOW1-9GMb__1yLs_GXExWMA,7649
77
- sqlspec/builder/mixins/_where_clause.py,sha256=tQ3n48tOwlI67oqtY2BV0Tuv-TDNP8N9ceyxKL_92yQ,33289
68
+ sqlspec/builder/mixins/_cte_and_set_ops.py,sha256=p5O9m_jvpaWxv1XP9Ys2DRI-qOTq30rr2EwYjAbIT8o,9088
69
+ sqlspec/builder/mixins/_delete_operations.py,sha256=l0liajnoAfRgtWtyStuAIfxreEFRkNO4DtBwyGqAfic,1198
70
+ 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
73
+ sqlspec/builder/mixins/_order_limit_operations.py,sha256=ABPuFSqHRv7XaS9-3HNZO3Jn0QovhJrkYT158xxduns,4835
74
+ 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
78
  sqlspec/core/__init__.py,sha256=rU_xGsXhqIOnBbyB2InhJknYePm5NQ2DSWdBigror4g,1775
79
- sqlspec/core/cache.py,sha256=CQ_xTBQVJaBxB5-ipiw4Oj6JObrcMFtXYRLMSvbXGnE,27130
80
- sqlspec/core/compiler.py,sha256=we_ifDr7JOAu3EycmWDxynOYq8ufjwcZl9MDXFTf5cQ,13959
79
+ sqlspec/core/cache.py,sha256=cLL9bd5wn1oeMzn5E5Ym0sAemA8U4QP6B55x4L9-26I,27044
80
+ sqlspec/core/compiler.py,sha256=pfBRrMFvrNuCwQgzKNljNTYH3imARlek3Ja5mJkHI88,14652
81
81
  sqlspec/core/filters.py,sha256=X0wRd0vNOFgeOK98ReeTyKt408GCnnmE9p45Bvur3kw,31351
82
82
  sqlspec/core/hashing.py,sha256=4KyAFWtFDMYreoBGGPQppEuMWO6_NrRYlw9Lm-qeJqo,10429
83
- sqlspec/core/parameters.py,sha256=X5e9SKGS1gkn7Sv6qAkzZtllIQDmhuUxAnLFlxBkAns,52833
84
- sqlspec/core/result.py,sha256=vdPXLApkS0F2Jz-Bq7-A-bKf7g4JIs5_57nAI4O4tC0,21100
83
+ sqlspec/core/parameters.py,sha256=yLnGt_tqqpb28xrgnq3oQ-1mcf45Pjf6uE3c0ag5JJ4,54265
84
+ sqlspec/core/result.py,sha256=VnxiTW7m6QfQkKRA8U_WtX198HelX2TCHd4aKPmKHHo,21340
85
85
  sqlspec/core/splitter.py,sha256=cb2P1B0q5vvALHi3SEJ7VdbRHH2GWsftrmJi9PYMbeE,28089
86
- sqlspec/core/statement.py,sha256=XdS8YUMEVR1qVjE48a0dIh8554Tm8lTLsa4z7sgM2vE,25117
86
+ sqlspec/core/statement.py,sha256=HsbSu0qnfJzpL_s1kwfxtWnyuCfAq8WjYRc3YQqxkDw,25700
87
87
  sqlspec/driver/__init__.py,sha256=QVpDRQGd1GreIP199en6qDbq-cZJcEF5go68DINagUk,569
88
- sqlspec/driver/_async.py,sha256=0P3VlBYXfythkh9c1wCE3oZMwQa0NtbW_6SljPxpcAw,18858
89
- sqlspec/driver/_common.py,sha256=go-SZRYlx_qEh8A9BGFl_BVByEdnLvtSXi6bqA6wOmU,25553
90
- sqlspec/driver/_sync.py,sha256=UZKCTrKh48lzRONk-eX5q6qKBLZOawODaPN_28ObACE,18586
88
+ sqlspec/driver/_async.py,sha256=29XYWjeIuIwElO3QFUtEqQZq1ss2Ulueh0UD-aX2x-E,19636
89
+ sqlspec/driver/_common.py,sha256=bjJCBfM5YaU-98vEnEc5qFcjWvaUVEcQS6v3gGC0UKw,26313
90
+ sqlspec/driver/_sync.py,sha256=pCKNHj46HcZYn9292FWyoWkNc6gj4ArUT8ttik4YyRQ,19408
91
91
  sqlspec/driver/mixins/__init__.py,sha256=gN4pQyJXxNy0xi91dcMJGA7DQ7TbjGjQI24SSpZc6Go,248
92
- sqlspec/driver/mixins/_result_tools.py,sha256=s1NWsE_Tiq7R_f6rSqjbPm6SFVYpRBdSdCb0ejlX66c,6733
93
- sqlspec/driver/mixins/_sql_translator.py,sha256=zpaJsS0_-zVvm3u2yCQ8VkILrZ7j28925SyZe1ChvlM,1491
92
+ sqlspec/driver/mixins/_result_tools.py,sha256=8z-W4py3BOtn3WB7ElpsVAEjGRozgHsfymTE_oXqcnw,7576
93
+ sqlspec/driver/mixins/_sql_translator.py,sha256=jmwlocjSqj-ZMfssMva6GR8t-CRlDVwU3ec2ve0l3JE,3322
94
94
  sqlspec/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  sqlspec/extensions/aiosql/__init__.py,sha256=-9cefc9pYPf9vCgALoB-y1DtmcgRjKe2azfl6RIarAA,414
96
96
  sqlspec/extensions/aiosql/adapter.py,sha256=CXkNZaZq86ZhfYFGx4IFbkHmbIFQKMd9CS6Q2jkMCok,16009
@@ -125,10 +125,10 @@ sqlspec/utils/serializers.py,sha256=TKsRryRcYMnb8Z8MGkYGClIxcYvC8CW7MsrPQTJqEcY,
125
125
  sqlspec/utils/singleton.py,sha256=SKnszJi1NPeERgX7IjVIGYAYx4XqR1E_rph3bU6olAU,1047
126
126
  sqlspec/utils/sync_tools.py,sha256=WRuk1ZEhb_0CRrumAdnmi-i-dV6qVd3cgJyZw8RY9QQ,7390
127
127
  sqlspec/utils/text.py,sha256=n5K0gvXvyCc8jNteNKsBOymwf_JnQ65f3lu0YaYq4Ys,2898
128
- sqlspec/utils/type_guards.py,sha256=AJKSQ323mNfhRbytI2e4N2cy2P6MMG7fp75foVnz328,30339
129
- sqlspec-0.16.0.dist-info/METADATA,sha256=YmaZ4D_0DDG-phbhQMQFcP0lEYVPCpTtd7rJdzEL0BU,16822
130
- sqlspec-0.16.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
131
- sqlspec-0.16.0.dist-info/entry_points.txt,sha256=G-ZqY1Nuuw3Iys7nXw23f6ILenk_Lt47VdK2mhJCWHg,53
132
- sqlspec-0.16.0.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
133
- sqlspec-0.16.0.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
134
- sqlspec-0.16.0.dist-info/RECORD,,
128
+ 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,,