sqlspec 0.13.1__py3-none-any.whl → 0.14.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 (112) hide show
  1. sqlspec/__init__.py +39 -1
  2. sqlspec/__main__.py +12 -0
  3. sqlspec/adapters/adbc/config.py +16 -40
  4. sqlspec/adapters/adbc/driver.py +43 -16
  5. sqlspec/adapters/adbc/transformers.py +108 -0
  6. sqlspec/adapters/aiosqlite/config.py +2 -20
  7. sqlspec/adapters/aiosqlite/driver.py +36 -18
  8. sqlspec/adapters/asyncmy/config.py +2 -33
  9. sqlspec/adapters/asyncmy/driver.py +23 -16
  10. sqlspec/adapters/asyncpg/config.py +5 -39
  11. sqlspec/adapters/asyncpg/driver.py +41 -18
  12. sqlspec/adapters/bigquery/config.py +2 -43
  13. sqlspec/adapters/bigquery/driver.py +26 -14
  14. sqlspec/adapters/duckdb/config.py +2 -49
  15. sqlspec/adapters/duckdb/driver.py +35 -16
  16. sqlspec/adapters/oracledb/config.py +4 -83
  17. sqlspec/adapters/oracledb/driver.py +54 -27
  18. sqlspec/adapters/psqlpy/config.py +2 -55
  19. sqlspec/adapters/psqlpy/driver.py +28 -8
  20. sqlspec/adapters/psycopg/config.py +4 -73
  21. sqlspec/adapters/psycopg/driver.py +69 -24
  22. sqlspec/adapters/sqlite/config.py +3 -21
  23. sqlspec/adapters/sqlite/driver.py +50 -26
  24. sqlspec/cli.py +248 -0
  25. sqlspec/config.py +18 -20
  26. sqlspec/driver/_async.py +28 -10
  27. sqlspec/driver/_common.py +5 -4
  28. sqlspec/driver/_sync.py +28 -10
  29. sqlspec/driver/mixins/__init__.py +6 -0
  30. sqlspec/driver/mixins/_cache.py +114 -0
  31. sqlspec/driver/mixins/_pipeline.py +0 -4
  32. sqlspec/{service/base.py → driver/mixins/_query_tools.py} +86 -421
  33. sqlspec/driver/mixins/_result_utils.py +0 -2
  34. sqlspec/driver/mixins/_sql_translator.py +0 -2
  35. sqlspec/driver/mixins/_storage.py +4 -18
  36. sqlspec/driver/mixins/_type_coercion.py +0 -2
  37. sqlspec/driver/parameters.py +4 -4
  38. sqlspec/extensions/aiosql/adapter.py +4 -4
  39. sqlspec/extensions/litestar/__init__.py +2 -1
  40. sqlspec/extensions/litestar/cli.py +48 -0
  41. sqlspec/extensions/litestar/plugin.py +3 -0
  42. sqlspec/loader.py +1 -1
  43. sqlspec/migrations/__init__.py +23 -0
  44. sqlspec/migrations/base.py +390 -0
  45. sqlspec/migrations/commands.py +525 -0
  46. sqlspec/migrations/runner.py +215 -0
  47. sqlspec/migrations/tracker.py +153 -0
  48. sqlspec/migrations/utils.py +89 -0
  49. sqlspec/protocols.py +37 -3
  50. sqlspec/statement/builder/__init__.py +8 -8
  51. sqlspec/statement/builder/{column.py → _column.py} +82 -52
  52. sqlspec/statement/builder/{ddl.py → _ddl.py} +5 -5
  53. sqlspec/statement/builder/_ddl_utils.py +1 -1
  54. sqlspec/statement/builder/{delete.py → _delete.py} +1 -1
  55. sqlspec/statement/builder/{insert.py → _insert.py} +1 -1
  56. sqlspec/statement/builder/{merge.py → _merge.py} +1 -1
  57. sqlspec/statement/builder/_parsing_utils.py +5 -3
  58. sqlspec/statement/builder/{select.py → _select.py} +59 -61
  59. sqlspec/statement/builder/{update.py → _update.py} +2 -2
  60. sqlspec/statement/builder/mixins/__init__.py +24 -30
  61. sqlspec/statement/builder/mixins/{_set_ops.py → _cte_and_set_ops.py} +86 -2
  62. sqlspec/statement/builder/mixins/{_delete_from.py → _delete_operations.py} +2 -0
  63. sqlspec/statement/builder/mixins/{_insert_values.py → _insert_operations.py} +70 -1
  64. sqlspec/statement/builder/mixins/{_merge_clauses.py → _merge_operations.py} +2 -0
  65. sqlspec/statement/builder/mixins/_order_limit_operations.py +123 -0
  66. sqlspec/statement/builder/mixins/{_pivot.py → _pivot_operations.py} +71 -2
  67. sqlspec/statement/builder/mixins/_select_operations.py +612 -0
  68. sqlspec/statement/builder/mixins/{_update_set.py → _update_operations.py} +73 -2
  69. sqlspec/statement/builder/mixins/_where_clause.py +536 -0
  70. sqlspec/statement/cache.py +50 -0
  71. sqlspec/statement/filters.py +37 -8
  72. sqlspec/statement/parameters.py +143 -54
  73. sqlspec/statement/pipelines/__init__.py +1 -1
  74. sqlspec/statement/pipelines/context.py +4 -10
  75. sqlspec/statement/pipelines/transformers/_expression_simplifier.py +3 -3
  76. sqlspec/statement/pipelines/validators/_parameter_style.py +22 -22
  77. sqlspec/statement/pipelines/validators/_performance.py +1 -5
  78. sqlspec/statement/sql.py +246 -176
  79. sqlspec/utils/__init__.py +2 -1
  80. sqlspec/utils/statement_hashing.py +203 -0
  81. sqlspec/utils/type_guards.py +32 -0
  82. {sqlspec-0.13.1.dist-info → sqlspec-0.14.1.dist-info}/METADATA +1 -1
  83. sqlspec-0.14.1.dist-info/RECORD +145 -0
  84. sqlspec-0.14.1.dist-info/entry_points.txt +2 -0
  85. sqlspec/service/__init__.py +0 -4
  86. sqlspec/service/_util.py +0 -147
  87. sqlspec/service/pagination.py +0 -26
  88. sqlspec/statement/builder/mixins/_aggregate_functions.py +0 -250
  89. sqlspec/statement/builder/mixins/_case_builder.py +0 -91
  90. sqlspec/statement/builder/mixins/_common_table_expr.py +0 -90
  91. sqlspec/statement/builder/mixins/_from.py +0 -63
  92. sqlspec/statement/builder/mixins/_group_by.py +0 -118
  93. sqlspec/statement/builder/mixins/_having.py +0 -35
  94. sqlspec/statement/builder/mixins/_insert_from_select.py +0 -47
  95. sqlspec/statement/builder/mixins/_insert_into.py +0 -36
  96. sqlspec/statement/builder/mixins/_limit_offset.py +0 -53
  97. sqlspec/statement/builder/mixins/_order_by.py +0 -46
  98. sqlspec/statement/builder/mixins/_returning.py +0 -37
  99. sqlspec/statement/builder/mixins/_select_columns.py +0 -61
  100. sqlspec/statement/builder/mixins/_unpivot.py +0 -77
  101. sqlspec/statement/builder/mixins/_update_from.py +0 -55
  102. sqlspec/statement/builder/mixins/_update_table.py +0 -29
  103. sqlspec/statement/builder/mixins/_where.py +0 -401
  104. sqlspec/statement/builder/mixins/_window_functions.py +0 -86
  105. sqlspec/statement/parameter_manager.py +0 -220
  106. sqlspec/statement/sql_compiler.py +0 -140
  107. sqlspec-0.13.1.dist-info/RECORD +0 -150
  108. /sqlspec/statement/builder/{base.py → _base.py} +0 -0
  109. /sqlspec/statement/builder/mixins/{_join.py → _join_operations.py} +0 -0
  110. {sqlspec-0.13.1.dist-info → sqlspec-0.14.1.dist-info}/WHEEL +0 -0
  111. {sqlspec-0.13.1.dist-info → sqlspec-0.14.1.dist-info}/licenses/LICENSE +0 -0
  112. {sqlspec-0.13.1.dist-info → sqlspec-0.14.1.dist-info}/licenses/NOTICE +0 -0
@@ -1,220 +0,0 @@
1
- """Parameter management for SQL objects."""
2
-
3
- from typing import Any, Optional
4
-
5
- from sqlspec.statement.filters import StatementFilter
6
- from sqlspec.statement.parameters import ParameterConverter, ParameterStyle
7
-
8
- __all__ = ("ParameterManager",)
9
-
10
-
11
- class ParameterManager:
12
- """Manages parameter processing and conversion for SQL objects."""
13
-
14
- def __init__(
15
- self,
16
- parameters: "Optional[tuple[Any, ...]]" = None,
17
- kwargs: "Optional[dict[str, Any]]" = None,
18
- converter: "Optional[ParameterConverter]" = None,
19
- ) -> None:
20
- self.converter = converter or ParameterConverter()
21
- self.named_params: dict[str, Any] = {}
22
- self.filters: list[StatementFilter] = []
23
- self._positional_parameters = parameters or ()
24
- self._named_parameters = kwargs or {}
25
- if parameters:
26
- for i, param in enumerate(parameters):
27
- self.named_params[f"pos_param_{i}"] = param
28
- if kwargs:
29
- self.process_parameters(**kwargs)
30
-
31
- def process_parameters(self, *parameters: Any, **kwargs: Any) -> None:
32
- """Process positional parameters and kwargs into named parameters."""
33
- for i, param in enumerate(parameters):
34
- if isinstance(param, StatementFilter):
35
- self.filters.append(param)
36
- pos_params, named_params = param.extract_parameters()
37
- for j, p_param in enumerate(pos_params):
38
- self.named_params[f"pos_param_{i}_{j}"] = p_param
39
- self.named_params.update(named_params)
40
- elif isinstance(param, (list, tuple)):
41
- for j, p_param in enumerate(param):
42
- self.named_params[f"pos_param_{i}_{j}"] = p_param
43
- elif isinstance(param, dict):
44
- self.named_params.update(param)
45
- else:
46
- self.named_params[f"pos_param_{i}"] = param
47
- if "parameters" in kwargs:
48
- param_value = kwargs.pop("parameters")
49
- if isinstance(param_value, (list, tuple)):
50
- for i, p_param in enumerate(param_value):
51
- self.named_params[f"kw_pos_param_{i}"] = p_param
52
- elif isinstance(param_value, dict):
53
- self.named_params.update(param_value)
54
- else:
55
- self.named_params["kw_single_param"] = param_value
56
-
57
- for key, value in kwargs.items():
58
- if not key.startswith("_"):
59
- self.named_params[key] = value
60
-
61
- def get_compiled_parameters(self, param_info: list[Any], target_style: ParameterStyle) -> Any:
62
- """Compile internal named parameters into the target style."""
63
- if target_style == ParameterStyle.POSITIONAL_COLON:
64
- return self._convert_to_positional_colon_format(self.named_params, param_info)
65
- if target_style in {ParameterStyle.QMARK, ParameterStyle.NUMERIC, ParameterStyle.POSITIONAL_PYFORMAT}:
66
- return self._convert_to_positional_format(self.named_params, param_info)
67
- if target_style == ParameterStyle.NAMED_COLON:
68
- return self._convert_to_named_colon_format(self.named_params, param_info)
69
- if target_style == ParameterStyle.NAMED_PYFORMAT:
70
- return self._convert_to_named_pyformat_format(self.named_params, param_info)
71
- return self.named_params
72
-
73
- def copy_from(self, other: "ParameterManager") -> None:
74
- """Copy parameters and filters from another parameter manager."""
75
- self.named_params.update(other.named_params)
76
- self.filters.extend(other.filters)
77
-
78
- def add_named_parameter(self, name: str, value: Any) -> None:
79
- """Add a named parameter."""
80
- self.named_params[name] = value
81
- self._named_parameters[name] = value
82
-
83
- def get_unique_parameter_name(
84
- self, base_name: str, namespace: Optional[str] = None, preserve_original: bool = False
85
- ) -> str:
86
- """Generate a unique parameter name."""
87
- all_param_names = set(self.named_params.keys())
88
- candidate = f"{namespace}_{base_name}" if namespace else base_name
89
-
90
- if preserve_original and candidate not in all_param_names:
91
- return candidate
92
-
93
- if candidate not in all_param_names:
94
- return candidate
95
-
96
- counter = 1
97
- while True:
98
- new_candidate = f"{candidate}_{counter}"
99
- if new_candidate not in all_param_names:
100
- return new_candidate
101
- counter += 1
102
-
103
- def _convert_to_positional_format(self, params: dict[str, Any], param_info: list[Any]) -> list[Any]:
104
- """Convert to positional format (list).
105
-
106
- This is used for parameter styles like QMARK (?), NUMERIC ($1), and POSITIONAL_PYFORMAT (%s).
107
- """
108
- if not param_info:
109
- return list(params.values())
110
-
111
- result = []
112
- for i, info in enumerate(param_info):
113
- if info.name and info.name in params:
114
- result.append(params[info.name])
115
- elif f"pos_param_{i}" in params:
116
- result.append(params[f"pos_param_{i}"])
117
- elif f"kw_pos_param_{i}" in params:
118
- result.append(params[f"kw_pos_param_{i}"])
119
- elif f"arg_{i}" in params:
120
- result.append(params[f"arg_{i}"])
121
- else:
122
- result.append(None)
123
- return result
124
-
125
- def _convert_to_positional_colon_format(self, params: dict[str, Any], param_info: list[Any]) -> dict[str, Any]:
126
- """Convert to positional colon format (Oracle :1, :2 style).
127
-
128
- Oracle's positional parameters are 1-indexed and are accessed by string keys.
129
- Returns a dict with string keys "1", "2", etc.
130
- """
131
- digit_keys = {k: v for k, v in params.items() if k.isdigit()}
132
- if (
133
- digit_keys
134
- and param_info
135
- and all(hasattr(info, "style") and info.style == ParameterStyle.POSITIONAL_COLON for info in param_info)
136
- ):
137
- required_nums = {info.name for info in param_info if hasattr(info, "name")}
138
- if required_nums.issubset(digit_keys.keys()):
139
- return digit_keys
140
-
141
- # This handles cases like :0, :1, :3 (with gaps) where we should preserve the actual numbers
142
- if param_info and all(
143
- hasattr(info, "style")
144
- and info.style == ParameterStyle.POSITIONAL_COLON
145
- and hasattr(info, "name")
146
- and info.name.isdigit()
147
- for info in param_info
148
- ):
149
- result = {}
150
- positional_values = self._convert_to_positional_format(params, param_info)
151
- for i, value in enumerate(positional_values):
152
- if value is not None:
153
- numeric_key = str(i)
154
- if any(info.name == numeric_key for info in param_info):
155
- result[numeric_key] = value
156
- else:
157
- result[str(i + 1)] = value
158
-
159
- return result
160
-
161
- positional_list = self._convert_to_positional_format(params, param_info)
162
- return {str(i + 1): value for i, value in enumerate(positional_list)}
163
-
164
- def _convert_to_named_colon_format(self, params: dict[str, Any], param_info: list[Any]) -> dict[str, Any]:
165
- """Convert to named colon format (:name style).
166
-
167
- This format expects a dictionary with parameter names as keys.
168
- We need to ensure all placeholders have corresponding values.
169
- """
170
- result = {}
171
- for info in param_info:
172
- if info.name:
173
- if info.name in params:
174
- result[info.name] = params[info.name]
175
- else:
176
- for key, value in params.items():
177
- if key.endswith(f"_{info.ordinal}") or key == f"arg_{info.ordinal}":
178
- result[info.name] = value
179
- break
180
- else:
181
- gen_name = f"arg_{info.ordinal}"
182
- if f"pos_param_{info.ordinal}" in params:
183
- result[gen_name] = params[f"pos_param_{info.ordinal}"]
184
- elif f"kw_pos_param_{info.ordinal}" in params:
185
- result[gen_name] = params[f"kw_pos_param_{info.ordinal}"]
186
- elif gen_name in params:
187
- result[gen_name] = params[gen_name]
188
- for key, value in params.items():
189
- if not key.startswith(("pos_param_", "kw_pos_param_", "arg_")) and key not in result:
190
- result[key] = value
191
-
192
- return result
193
-
194
- def _convert_to_named_pyformat_format(self, params: dict[str, Any], param_info: list[Any]) -> dict[str, Any]:
195
- """Convert to named pyformat format (%(name)s style).
196
-
197
- This is similar to named colon format but uses Python string formatting syntax.
198
- """
199
- return self._convert_to_named_colon_format(params, param_info)
200
-
201
- @property
202
- def positional_parameters(self) -> tuple[Any, ...]:
203
- """Get the original positional parameters."""
204
- return self._positional_parameters
205
-
206
- @property
207
- def named_parameters(self) -> dict[str, Any]:
208
- """Get the combined named parameters."""
209
- return self.named_params
210
-
211
- def get_parameter_info(self) -> tuple[tuple[Any, ...], dict[str, Any]]:
212
- """Get parameter information in the legacy format.
213
-
214
- This method provides backward compatibility for code expecting
215
- the old parameter_info format.
216
-
217
- Returns:
218
- Tuple of (positional_parameters, named_parameters)
219
- """
220
- return (self._positional_parameters, self._named_parameters)
@@ -1,140 +0,0 @@
1
- """SQL compilation logic separated from the main SQL class."""
2
-
3
- from typing import TYPE_CHECKING, Any, Optional, Union, cast
4
-
5
- import sqlglot.expressions as exp
6
-
7
- from sqlspec.exceptions import SQLCompilationError
8
- from sqlspec.statement.parameters import ParameterConverter, ParameterStyle
9
- from sqlspec.statement.pipelines import SQLProcessingContext, StatementPipeline
10
- from sqlspec.statement.sql import SQLConfig
11
- from sqlspec.utils.cached_property import CachedProperty
12
-
13
- if TYPE_CHECKING:
14
- from sqlglot.dialects.dialect import DialectType
15
-
16
- from sqlspec.protocols import ProcessorProtocol
17
- from sqlspec.statement.parameter_manager import ParameterManager
18
-
19
-
20
- __all__ = ("SQLCompiler",)
21
-
22
-
23
- class SQLCompiler:
24
- """Handles SQL compilation and pipeline processing."""
25
-
26
- def __init__(
27
- self,
28
- expression: exp.Expression,
29
- dialect: "Optional[DialectType]" = None,
30
- parameter_manager: "Optional[ParameterManager]" = None,
31
- is_script: bool = False,
32
- original_sql: Optional[str] = None,
33
- config: Optional[SQLConfig] = None,
34
- ) -> None:
35
- self.expression = expression
36
- self.dialect = dialect
37
- self.parameter_manager = parameter_manager
38
- self.is_script = is_script
39
- self._original_sql = original_sql
40
- self.config = config or SQLConfig(dialect=dialect)
41
-
42
- @CachedProperty
43
- def _pipeline(self) -> StatementPipeline:
44
- """Get the statement pipeline."""
45
- validators: list[ProcessorProtocol] = []
46
-
47
- if self.config.enable_validation and self.config.allowed_parameter_styles is not None:
48
- from sqlspec.statement.pipelines.validators._parameter_style import ParameterStyleValidator
49
-
50
- # In strict mode, fail on violations
51
- validators.append(ParameterStyleValidator(fail_on_violation=self.config.strict_mode))
52
-
53
- return StatementPipeline(validators=validators)
54
-
55
- @CachedProperty
56
- def _context(self) -> SQLProcessingContext:
57
- """Get the processing context."""
58
- if isinstance(self.expression, exp.Anonymous) and self.expression.this:
59
- sql_string = str(self.expression.this)
60
- else:
61
- sql_string = self.expression.sql(dialect=self.dialect)
62
-
63
- context = SQLProcessingContext(initial_sql_string=sql_string, dialect=self.dialect, config=self.config)
64
- context.initial_expression = self.expression
65
- context.current_expression = self.expression
66
-
67
- from sqlspec.statement.parameters import ParameterValidator
68
-
69
- validator = ParameterValidator()
70
- context.parameter_info = validator.extract_parameters(sql_string)
71
-
72
- if self.parameter_manager:
73
- if self.parameter_manager.positional_parameters:
74
- context.merged_parameters = self.parameter_manager.positional_parameters
75
- context.initial_parameters = self.parameter_manager.positional_parameters
76
- elif self.parameter_manager.named_parameters:
77
- context.merged_parameters = self.parameter_manager.named_parameters
78
- context.initial_kwargs = self.parameter_manager.named_parameters
79
- context.initial_parameters = self.parameter_manager.positional_parameters
80
- context.initial_kwargs = self.parameter_manager.named_parameters
81
- return context
82
-
83
- @CachedProperty
84
- def _processed_expr(self) -> exp.Expression:
85
- """Execute the processing pipeline and cache the result."""
86
- try:
87
- result = self._pipeline.execute_pipeline(self._context)
88
- except Exception as e:
89
- msg = f"Failed to compile SQL: {self._context.initial_sql_string}"
90
- raise SQLCompilationError(msg) from e
91
- else:
92
- return cast("exp.Expression", result.expression)
93
-
94
- @CachedProperty
95
- def _compiled_sql(self) -> str:
96
- """Get the compiled SQL string."""
97
- if self.is_script:
98
- return str(self._original_sql or self.expression.sql(dialect=self.dialect))
99
- # Always go through the pipeline to ensure validation runs
100
- processed = self._processed_expr
101
- if isinstance(processed, exp.Anonymous) and processed.this:
102
- return str(processed.this)
103
- return str(processed.sql(dialect=self.dialect, comments=False))
104
-
105
- def compile(self, placeholder_style: Optional[str] = None) -> tuple[str, Any]:
106
- """Compile SQL and parameters."""
107
- if self.is_script:
108
- return self._compiled_sql, None
109
-
110
- sql = self.to_sql(placeholder_style)
111
- params = self._get_compiled_parameters(placeholder_style)
112
- return sql, params
113
-
114
- def to_sql(self, placeholder_style: Optional[str] = None) -> str:
115
- """Get the SQL string with a specific placeholder style."""
116
- if placeholder_style is None or self.is_script:
117
- return cast("str", self._compiled_sql)
118
-
119
- converter = ParameterConverter()
120
- sql = self._compiled_sql
121
-
122
- target_style = ParameterStyle(placeholder_style)
123
- return converter.convert_placeholders(sql, target_style, self._context.parameter_info)
124
-
125
- def get_parameters(self, style: Union[ParameterStyle, str, None] = None) -> Any:
126
- """Get the parameters in a specific style."""
127
- if self.is_script:
128
- return None
129
- return cast("Any", self._get_compiled_parameters(str(style) if style else None))
130
-
131
- def _get_compiled_parameters(self, placeholder_style: Optional[str]) -> Any:
132
- """Get compiled parameters in target style."""
133
- if not self.parameter_manager:
134
- return None
135
-
136
- # This ensures the pipeline has run and context is populated
137
- _ = self._processed_expr
138
-
139
- style_enum = ParameterStyle(placeholder_style) if placeholder_style else ParameterStyle.NAMED_COLON
140
- return self.parameter_manager.get_compiled_parameters(self._context.parameter_info, style_enum)
@@ -1,150 +0,0 @@
1
- sqlspec/__init__.py,sha256=hyVFQsYsgDWOZ2EPnW1LnATQVxGcYu3liBvSOvk4EQk,705
2
- sqlspec/__metadata__.py,sha256=hNP3wXvtk8fQVPKGjRLpZ9mP-gaPJqzrmgm3UqpDIXQ,460
3
- sqlspec/_serialization.py,sha256=7zox4G9zIps-DCdIEwYs4gwALfEOy1g_sWS4r5kpzO8,2604
4
- sqlspec/_sql.py,sha256=zqMtVWBZzbnNErB8VyJkjDCPq0RNkhGUPA2ZCOtzmGo,35759
5
- sqlspec/_typing.py,sha256=Vn1CTCfedAHZV3pKZP-l_mPw9pTxesCzRKVRypzNY_k,17903
6
- sqlspec/base.py,sha256=a7adbCUzohf1MU-iP0TxazGsk9fsJhJmxuFKNWkgC6o,18355
7
- sqlspec/config.py,sha256=NJg5cjITI3GBCm3ru-m9K3y_XLa0Ru8Z4suG3TjXRmw,12896
8
- sqlspec/exceptions.py,sha256=T2h-tCN05sRKSpXDjPtYXvNgwInNVzTpha1PIkSUROQ,14168
9
- sqlspec/loader.py,sha256=J0PaBiY8kC_gCI-3i8Vj3IBZIgKJ4TvRAJzMQerLZMQ,15354
10
- sqlspec/protocols.py,sha256=ce9L1nqxpmDSQqUR6UoKB8f5eL0hFnp2ProrsMwMsKk,17218
11
- sqlspec/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- sqlspec/typing.py,sha256=qkUcvruNzRUUfpv4AkbQezpy9SokhVHXlMbfFNwQlnU,8721
13
- sqlspec/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- sqlspec/adapters/adbc/__init__.py,sha256=v9bs7501PgEyzR1XIsEpE2Wdrj9DOYkZ4grysw72UXk,218
15
- sqlspec/adapters/adbc/config.py,sha256=v_gk-C-StoWiSjmB9Ehl6ce2eGqUgb1-JUxSq3lS8l8,20022
16
- sqlspec/adapters/adbc/driver.py,sha256=WP3YVS-9Y1aup9IQ7y4L8x9e414epcWCyhPHuBVp66w,16644
17
- sqlspec/adapters/aiosqlite/__init__.py,sha256=7wPmhXQeu4jRi-LZzPxAPTdgRmgmyqCn9U-4wnCWoLM,258
18
- sqlspec/adapters/aiosqlite/config.py,sha256=Ysbu6sLDVrUtztLRKgphQphxxUCaj2V4W55mLfK-lq0,7652
19
- sqlspec/adapters/aiosqlite/driver.py,sha256=cfxuob0EmnLB3iCgpuqjw40-9ZWSmVLZ_UL3BNznXt0,11282
20
- sqlspec/adapters/asyncmy/__init__.py,sha256=zYpebEt_PrNCifLcqXiCcWVm0Zl-LvWbFDromWwSTw8,270
21
- sqlspec/adapters/asyncmy/config.py,sha256=VSEtK69IHjyjXA6c4AEKSIivGqKOz6B5G7IyCXREhug,10879
22
- sqlspec/adapters/asyncmy/driver.py,sha256=7l9rsAxTiJhiTiBMQc0e1QwBDWopvfii5jgFwREITog,10085
23
- sqlspec/adapters/asyncpg/__init__.py,sha256=svnbKlOin8jRL88AdAqflBEU-WEAzp0Thc2y50QsxIo,310
24
- sqlspec/adapters/asyncpg/config.py,sha256=AAxEqH6ZbCUvr7nIokVurqhxfLgBdix07yFXIhDKSSg,12510
25
- sqlspec/adapters/asyncpg/driver.py,sha256=X5IF5_NEiQ86aLspuqjY9Fh5OIluCCNa7TAzLEFENjQ,17572
26
- sqlspec/adapters/bigquery/__init__.py,sha256=fWRH-BoCNX4rYwhU2DK64cXWpfkYpWIExddJAti0bxM,250
27
- sqlspec/adapters/bigquery/config.py,sha256=iwQ3BPYtywjD17TaYh0YAO4X_ry5DkWIRKWPAeYrkzg,16929
28
- sqlspec/adapters/bigquery/driver.py,sha256=2aVWjjVAWci92wyXKo5dVV9PGBb6uDkSvDBEEs1eFPw,30385
29
- sqlspec/adapters/duckdb/__init__.py,sha256=I1f6szfpKKrq6WhyDoUXD3i3NN4yjsh94_fhP1URI5M,351
30
- sqlspec/adapters/duckdb/config.py,sha256=DBfDLaS_y3qfdYgxCnfnWml7lj1OFOMeUrGxkt6kFj0,20304
31
- sqlspec/adapters/duckdb/driver.py,sha256=JZipJMy1yUfedtlNZxd8pGTFVylve8ia4XeKfd7dd0c,18095
32
- sqlspec/adapters/oracledb/__init__.py,sha256=nn3whn0UyBThoXnE1-5_byVuc9PJjvB2P896p7LpNZI,474
33
- sqlspec/adapters/oracledb/config.py,sha256=wewrgAVbWuZVhIDfOUrf7B6GgkGX2tY-GNA-AYoaRNQ,23833
34
- sqlspec/adapters/oracledb/driver.py,sha256=ZFOHGQwajIkG7PSWi_ER9QQRNdf18DyYho3L36m7CVU,24473
35
- sqlspec/adapters/psqlpy/__init__.py,sha256=dp0-96V4SAbNEvOqlJ8PWEyJMYzZGElVoyneZqJ-fbQ,297
36
- sqlspec/adapters/psqlpy/config.py,sha256=n62ku23eyL5hZPMt4dH0FsksFr89vNM4V-eKAABvQAA,16653
37
- sqlspec/adapters/psqlpy/driver.py,sha256=liB3pGbDKuz2PyTd3QeDk3rRLKE57leviIdN_hqJHvg,9961
38
- sqlspec/adapters/psycopg/__init__.py,sha256=ukkCUPrJPyAG78v4rOqcK4WZDs26PeB9Ra9qkFrGJ3E,484
39
- sqlspec/adapters/psycopg/config.py,sha256=gjtms8wfL7BeUvfJG1K0TMZ6d3BtVzi5X5_enMS2Ieg,27759
40
- sqlspec/adapters/psycopg/driver.py,sha256=UnnVJg5SwjReYWYX4fQ05JmL5hoJ1XeUby2m9IBrOgM,40064
41
- sqlspec/adapters/sqlite/__init__.py,sha256=1lYrJ-DojUAOvXMoZRUJNEVyMmYhO41hMJnDWCEeXlw,234
42
- sqlspec/adapters/sqlite/config.py,sha256=ph3FjdrbVkDaasGDEoZ-estP1NJdj8PqBJqpV-2IJxI,6191
43
- sqlspec/adapters/sqlite/driver.py,sha256=0xBl7J5bPuv07fte5zPQj-bLhuiIC1_QPHu64i8Il80,12423
44
- sqlspec/driver/__init__.py,sha256=0udRS5IlJ17HzOCvzapG8c_88yAwTQri1XLD_3fZxZU,671
45
- sqlspec/driver/_async.py,sha256=ZSUNvVBU22KcpvKrDPJnlc6lnD49XLovS4vCQnr_OPA,9992
46
- sqlspec/driver/_common.py,sha256=ALJyI6NS_pa0BOad0xiCMRwFLh4ykneaDW_xg9h8Z48,15811
47
- sqlspec/driver/_sync.py,sha256=KzETeE-NHc1cOcX3LQ_88PejM-TJHD24UFQrB_yLDfQ,9832
48
- sqlspec/driver/connection.py,sha256=zKP2p-VLxN07IPfOIBKMRELHN7ZMjmRVUKBgSW-6RQg,6610
49
- sqlspec/driver/parameters.py,sha256=srU_7z3sB2vBu_lz9rAiDW2J2Ce47l12bqhxw6jEePE,4002
50
- sqlspec/driver/mixins/__init__.py,sha256=-FSWLYq644NftRsmjmXMA9Q7_l7tIFAIh1ZyK0yrba8,652
51
- sqlspec/driver/mixins/_csv_writer.py,sha256=-uRe7QZRWtdZTFG3Fiej4Ia8EyQcjYr7oPT6wb0qTOc,2716
52
- sqlspec/driver/mixins/_pipeline.py,sha256=ESQyQo1ow_yerUvdFYS_CBy-6XS9tIow41j80yjCz4w,19588
53
- sqlspec/driver/mixins/_result_utils.py,sha256=RvdE1BKwnTPx3aXDwnJEonJzp5PdT1Wgn63DGZyglvg,5692
54
- sqlspec/driver/mixins/_sql_translator.py,sha256=p_PR4KBg9NKNpRpiEqA0hcUIttpdillHpnLUVJEcxuE,1519
55
- sqlspec/driver/mixins/_storage.py,sha256=P6eIvCMCM6BMH4G0rbWZTb4Q54mmvtnTxk2pMp3JW7o,38558
56
- sqlspec/driver/mixins/_type_coercion.py,sha256=ix-_p1-Yp9LhQdGFhFN1H_O8_VbVih-nzLPbsQiNFnE,4578
57
- sqlspec/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- sqlspec/extensions/aiosql/__init__.py,sha256=-9cefc9pYPf9vCgALoB-y1DtmcgRjKe2azfl6RIarAA,414
59
- sqlspec/extensions/aiosql/adapter.py,sha256=BcJI0y0Hj5t5aH6_Kx_06EkKy3aBLsh7xIJH-LMMoGg,16544
60
- sqlspec/extensions/litestar/__init__.py,sha256=aXF2g4-U86pdJHoOA6RCvZgnyHVBbjRhlWqcSuRX2gg,243
61
- sqlspec/extensions/litestar/_utils.py,sha256=o-FuUj1_WkDrLxQxiP6hXDak66XfyRP3QLyEVKrIRjI,1954
62
- sqlspec/extensions/litestar/config.py,sha256=vLXM425tCV3IbJiNO1ZG90ctjBTb9oQCuLsqCaUYmo8,4685
63
- sqlspec/extensions/litestar/handlers.py,sha256=bVoWmHhCsHZkXZXYHE23yDaJlRoydfvU-boJjA3BSLE,10478
64
- sqlspec/extensions/litestar/plugin.py,sha256=ysuy4dmF6VAhUkIcVOSPfv5HcBGmwSZ9_PjttBs81g4,5431
65
- sqlspec/extensions/litestar/providers.py,sha256=wUGqPeNV58rPqL1iwDQg439C4y-Zg-eXEogjeFsv0iQ,21021
66
- sqlspec/service/__init__.py,sha256=DayFSxYU4AMbcN0JWBuB1rtrOAs-amKIAIyTJXXNKH0,206
67
- sqlspec/service/_util.py,sha256=K31tzlOsTXGhbXe4u5ltZYLExuaFtpiZoIHLOk8yNyM,6096
68
- sqlspec/service/base.py,sha256=iW4LbrIxjrSt0mDPPSmuUGQgdQTFM-xgmZdThCLa5u4,40592
69
- sqlspec/service/pagination.py,sha256=ndLQwsvswoISWEE_3IG9nmdHt42OZkVMJvr-2HTWsLw,619
70
- sqlspec/statement/__init__.py,sha256=NDvdrpr1EqAZXp4HmhTVaRnWVscahPSHpmSO8DHSoMY,536
71
- sqlspec/statement/filters.py,sha256=qX5KOe-rLmFwyD8xaUcTTkh45Dg1ViKx_hTAqjKtWh4,22565
72
- sqlspec/statement/parameter_manager.py,sha256=nbeLzO2Hnm4Su8id-fKEELvWEI8dbbC5ZYiqo4jjbvc,9557
73
- sqlspec/statement/parameters.py,sha256=8V9mNr5Lb4iZmHfucZB9HMYOI2OmhaNzr2ZnMSAYnKk,35791
74
- sqlspec/statement/result.py,sha256=-yARFxg7Wsm8nAeHMpnJ58OLd2VujFiZx29wfo7eFVs,14514
75
- sqlspec/statement/splitter.py,sha256=mCzJsNEtJFk4A0FdTELkG_qOggRFCQC_ZEJisVo9orY,24111
76
- sqlspec/statement/sql.py,sha256=l_KrA91wlIAXIQiaOsvEqZbY-Hg6QWtF8Va2qr7mfCE,71916
77
- sqlspec/statement/sql_compiler.py,sha256=f1UoGWjZTCLwOMBiG1R45_tq8oQlR8Qmm9fHKy_uXYA,5882
78
- sqlspec/statement/builder/__init__.py,sha256=FMTnEKOIHCywjnqGXfOfzZzYKmciue0h37DG2KZAUZI,1610
79
- sqlspec/statement/builder/_ddl_utils.py,sha256=P0INvHoOA9Mk7rmrga0xRvxF6YgNXchsg1Q3hfvlCqQ,4326
80
- sqlspec/statement/builder/_parsing_utils.py,sha256=xAxWfa-mjjLPyweM9396lQy91G5MsxYyaJzTAoEiuAU,5753
81
- sqlspec/statement/builder/base.py,sha256=DArCuNwDXslt73Jk5Io3WqUP1ZXA0e4cUXtzFjvQ5g4,14738
82
- sqlspec/statement/builder/column.py,sha256=JWeZ5hnawCWm00jeojwm8i79p8oYNkg30SIdOOolNjM,11521
83
- sqlspec/statement/builder/ddl.py,sha256=vqAebkN6JoX6n8aLVwZdyW3Xfyj3Ws6frWu-_7wy8uE,51516
84
- sqlspec/statement/builder/delete.py,sha256=5BVwxcNY5nSgeZrZ4tSfdA2di3X8M3y7I5t9D35d0mk,2881
85
- sqlspec/statement/builder/insert.py,sha256=Q2ArKq4BPP69G-OTxcUVgixlhsKjdOm248RJxtJFyps,10129
86
- sqlspec/statement/builder/merge.py,sha256=SUrumqMrUBO1vMFWll45vvYj4DmrL3WuCZLdHap8ej8,2783
87
- sqlspec/statement/builder/select.py,sha256=4UXNo9_13XQIqmzzovsRQBAwooFtBdzsolUoTzxgNE4,8642
88
- sqlspec/statement/builder/update.py,sha256=qV5frucca42xuzSeAdBAqNnYTRyEZJrhkZ5uEI1eGKs,6245
89
- sqlspec/statement/builder/mixins/__init__.py,sha256=B5GhsdySb_-DN3SvBlA2oimmymAJX3Rf4A7Xnz3uNN4,2887
90
- sqlspec/statement/builder/mixins/_aggregate_functions.py,sha256=yeXm_mp0JDbzSe2N2vpJHbGVYmdnrCMqwdHXz2rJAVs,10551
91
- sqlspec/statement/builder/mixins/_case_builder.py,sha256=fGdevoEZxmoJjsDV9Wwfom8vu3lmgF9B_o5HXCf25Kg,3047
92
- sqlspec/statement/builder/mixins/_common_table_expr.py,sha256=R7BUdWEHpuPGumgBsUnUPaVLH0sF3oRiJRw-xXEkTj8,3694
93
- sqlspec/statement/builder/mixins/_delete_from.py,sha256=HsJseeYY-HUoiTYRdPpCDG0kIHrhXOg_GA52RT7dEGY,1019
94
- sqlspec/statement/builder/mixins/_from.py,sha256=bGcI7TuY3Z3Xx8oLR9jXx_d25s0db0uJBx4SSw0kKh8,2850
95
- sqlspec/statement/builder/mixins/_group_by.py,sha256=gLbveNJuvk_FdZxYKBzx4cCQQvxqzecc_vmb5d8_Du0,4142
96
- sqlspec/statement/builder/mixins/_having.py,sha256=X8-hdwEeJg4RYxyjhaYLvlkpzE0AwIPl6t8SPGz5gi0,1112
97
- sqlspec/statement/builder/mixins/_insert_from_select.py,sha256=RMvdNXU1W7zqceOGwo_G_n0bbd-S63bBwOCs44H0j4Y,1801
98
- sqlspec/statement/builder/mixins/_insert_into.py,sha256=7979JCYqKM_NRTHwkrJJY6l9lS2AQ-evZYRU8fs3yw0,1049
99
- sqlspec/statement/builder/mixins/_insert_values.py,sha256=5kheKKtdpOVHSIPox88bYwtD4Rr5v1_J_K9Wmam7-Vk,2820
100
- sqlspec/statement/builder/mixins/_join.py,sha256=lSGFtq_KJ985SCmUKmIx-4NwniIwQIVmLJYryF5mtc4,5658
101
- sqlspec/statement/builder/mixins/_limit_offset.py,sha256=qLxBek2CpJz-k717ZTpJ5eVlQJ5McZPAQEwFbRM-XuI,1753
102
- sqlspec/statement/builder/mixins/_merge_clauses.py,sha256=Tmi9Yb_7BPtFtpxj3splUTNQfjS8TdcN8TY9qJQqNNU,16798
103
- sqlspec/statement/builder/mixins/_order_by.py,sha256=1yMXkl9MYd5uk3RRMWxhR4VCmvHGvwY6bojofFt6jc0,1717
104
- sqlspec/statement/builder/mixins/_pivot.py,sha256=mnGNCZYbl00JAny6h9p-EQkhGNiNN8w--ZNd7X0Fs8I,3257
105
- sqlspec/statement/builder/mixins/_returning.py,sha256=O39j2MEIcqiiUhFFGnyGwIXhLS7KrGigfZ9kPxFjjtI,1349
106
- sqlspec/statement/builder/mixins/_select_columns.py,sha256=wVUg9ECJH6r1QEh7VWV6DGpb86oo4vuFHPpOx_G8Hcw,2421
107
- sqlspec/statement/builder/mixins/_set_ops.py,sha256=uWV32ZAi2tojbS9b6Q0ZDIn1Rhbx4cCE42jhbVdm90I,5291
108
- sqlspec/statement/builder/mixins/_unpivot.py,sha256=99tN2skDD3M77v7MyqisugxHR-6BB984FLX7iY4RpG0,3086
109
- sqlspec/statement/builder/mixins/_update_from.py,sha256=NAHiL08NBoh8jFxZG_ZiSjbEDcIR9ni7-d--nVIXf6g,2540
110
- sqlspec/statement/builder/mixins/_update_set.py,sha256=gLcGeBMSHqCGPrJz-pb5951g-4xCLJDltOzbMM1OQRM,4306
111
- sqlspec/statement/builder/mixins/_update_table.py,sha256=FX3KezuHdu7YLQI4i5iniHWk1Lbzph8MzLcOM6iTd70,936
112
- sqlspec/statement/builder/mixins/_where.py,sha256=kfttMYubr4zzOJkbxTh-U3lTt5uNFgkmjCEixs6n9LM,21227
113
- sqlspec/statement/builder/mixins/_window_functions.py,sha256=8ldy06gK6jOlGg31oa1dCrG7IkfCVYvVr_f-lx0YcgU,3745
114
- sqlspec/statement/pipelines/__init__.py,sha256=eFCKEmMqQAyDwfg9_kgE5e719OSC2nyhTme4IGmxb70,7326
115
- sqlspec/statement/pipelines/context.py,sha256=mE7twvOydqyWQffp6KyMvOUl9FlTY9ypGL7M6SFYFK8,4210
116
- sqlspec/statement/pipelines/analyzers/__init__.py,sha256=RY7W0AiWG-8qdrTmRSGlEofjrPPJCJUnNK-LRukKt5Q,330
117
- sqlspec/statement/pipelines/analyzers/_analyzer.py,sha256=0_FDty6H_4JvQwee_NrzmptX9-VdhyAePXUstuq4MU4,27474
118
- sqlspec/statement/pipelines/transformers/__init__.py,sha256=Kh4CE_izdwEsSF7Is6_6NXqtNmbLm5x5OWdnlUGp9ok,480
119
- sqlspec/statement/pipelines/transformers/_expression_simplifier.py,sha256=0R2j046n12DDk1wGEmwX3f3KnaMUcSDWC0-lRmforjw,3385
120
- sqlspec/statement/pipelines/transformers/_literal_parameterizer.py,sha256=N6a2lMGBHXcoHuSySY_9JhObNkPWabUBpR_25ZCnv0w,57183
121
- sqlspec/statement/pipelines/transformers/_remove_comments_and_hints.py,sha256=-gM6VnlhNtQzSbQq44hQ5mhaPqNsjzeCaTgXTycgkOk,3008
122
- sqlspec/statement/pipelines/validators/__init__.py,sha256=cdlwdLhOT2OwTbueIsA7bfRG2b6y-j7dw9pMzl5AP0M,747
123
- sqlspec/statement/pipelines/validators/_dml_safety.py,sha256=s7Eee60u6w0K35vz4GVAwsB5Xy8zUqWhiIx_pRVfERo,10585
124
- sqlspec/statement/pipelines/validators/_parameter_style.py,sha256=m8gNydG0KKyhmQyOEGZk8mhV_jLjT0vxIJy22AY8xkY,17840
125
- sqlspec/statement/pipelines/validators/_performance.py,sha256=mTL5UB9Yj2XNjv31_CjqWHUAdj77iFtE7XDXQosG_20,26357
126
- sqlspec/statement/pipelines/validators/_security.py,sha256=3WuH9n4j-VKOgmQnZvFIoI4MieRBVShtOZvXl2SJsyk,42103
127
- sqlspec/storage/__init__.py,sha256=ZS8rmhN8e_h_df-Oab64Jh4EbddElBbmrtHkuO-KqOE,703
128
- sqlspec/storage/capabilities.py,sha256=fsnQ9jbjHBFvd3P9yWAzfjPpVYUGcsTtR6fm5iOCvXY,3054
129
- sqlspec/storage/registry.py,sha256=lv9pGt6vt0tDNAlao9qA7rSsFsCZtaOr48aG15IoMFA,10976
130
- sqlspec/storage/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
- sqlspec/storage/backends/base.py,sha256=34XYQuz1tQ-q_ZZwOz-Kimgvl088SR3VUYJoA-STslc,6350
132
- sqlspec/storage/backends/fsspec.py,sha256=wo40MwtEjNTc73ZNTCmNC2-Img0zldUCaFGh9H3BZuE,14715
133
- sqlspec/storage/backends/obstore.py,sha256=FnoVzTzzNn5NRXR8GgETqD3Rq9C5EWAmfWmY4JDFVJE,21214
134
- sqlspec/utils/__init__.py,sha256=_Ya8IZuc2cZIstXr_xjgnSfxICXHXvu5mfWsi2USDrw,183
135
- sqlspec/utils/cached_property.py,sha256=Sw_JZxfChSJu72gvYBJPF-89FyyIJAPf-1ETlDq-F2E,648
136
- sqlspec/utils/correlation.py,sha256=4jqpjMivxI1tQ13Ed-P0hLdFHUKUQ9GlvIM69_HOlS4,4370
137
- sqlspec/utils/deprecation.py,sha256=zrmb_eKRlLWVA6dWrjUbN3Vz6D3_-Z_15Ixk4H-sDRk,3850
138
- sqlspec/utils/fixtures.py,sha256=q_Pghpmw2VgJ9P0TfkyjSF5PvdaD5Y2Laha0Bj4IDrA,1838
139
- sqlspec/utils/logging.py,sha256=56a5tqx4jfTqm20WDyj5c7Dy-h_O0KambIKOMr1-Oms,3780
140
- sqlspec/utils/module_loader.py,sha256=9LcmEhy4T0jgkCaDVkxX47PSgJOMeJ8IV67yXEWBp-U,3074
141
- sqlspec/utils/serializers.py,sha256=TKsRryRcYMnb8Z8MGkYGClIxcYvC8CW7MsrPQTJqEcY,154
142
- sqlspec/utils/singleton.py,sha256=KZ7481tlDAxq6gcAlpULVqPLNc9P0XkHOEp7hfWIHcI,1096
143
- sqlspec/utils/sync_tools.py,sha256=ckP1_uLh40C2pDvdc4FsR4NkmZVa1zEB8jhUxPLIuAI,8726
144
- sqlspec/utils/text.py,sha256=DpEnRuSDv3acp4VQQGEOQixlJnLGZsN5YBws4rkI6t0,4756
145
- sqlspec/utils/type_guards.py,sha256=uEtfznkkumiy2lnPOde35Ylzq2RrcPB-MBiWseMCADg,25722
146
- sqlspec-0.13.1.dist-info/METADATA,sha256=WxPFx2SCx_K8lCfY18xnwH30ZxhxhLV9KyUAMl0MJxw,16663
147
- sqlspec-0.13.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
148
- sqlspec-0.13.1.dist-info/licenses/LICENSE,sha256=MdujfZ6l5HuLz4mElxlu049itenOR3gnhN1_Nd3nVcM,1078
149
- sqlspec-0.13.1.dist-info/licenses/NOTICE,sha256=Lyir8ozXWov7CyYS4huVaOCNrtgL17P-bNV-5daLntQ,1634
150
- sqlspec-0.13.1.dist-info/RECORD,,
File without changes