sqlspec 0.13.1__py3-none-any.whl → 0.16.2__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 (185) hide show
  1. sqlspec/__init__.py +71 -8
  2. sqlspec/__main__.py +12 -0
  3. sqlspec/__metadata__.py +1 -3
  4. sqlspec/_serialization.py +1 -2
  5. sqlspec/_sql.py +930 -136
  6. sqlspec/_typing.py +278 -142
  7. sqlspec/adapters/adbc/__init__.py +4 -3
  8. sqlspec/adapters/adbc/_types.py +12 -0
  9. sqlspec/adapters/adbc/config.py +116 -285
  10. sqlspec/adapters/adbc/driver.py +462 -340
  11. sqlspec/adapters/aiosqlite/__init__.py +18 -3
  12. sqlspec/adapters/aiosqlite/_types.py +13 -0
  13. sqlspec/adapters/aiosqlite/config.py +202 -150
  14. sqlspec/adapters/aiosqlite/driver.py +226 -247
  15. sqlspec/adapters/asyncmy/__init__.py +18 -3
  16. sqlspec/adapters/asyncmy/_types.py +12 -0
  17. sqlspec/adapters/asyncmy/config.py +80 -199
  18. sqlspec/adapters/asyncmy/driver.py +257 -215
  19. sqlspec/adapters/asyncpg/__init__.py +19 -4
  20. sqlspec/adapters/asyncpg/_types.py +17 -0
  21. sqlspec/adapters/asyncpg/config.py +81 -214
  22. sqlspec/adapters/asyncpg/driver.py +284 -359
  23. sqlspec/adapters/bigquery/__init__.py +17 -3
  24. sqlspec/adapters/bigquery/_types.py +12 -0
  25. sqlspec/adapters/bigquery/config.py +191 -299
  26. sqlspec/adapters/bigquery/driver.py +474 -634
  27. sqlspec/adapters/duckdb/__init__.py +14 -3
  28. sqlspec/adapters/duckdb/_types.py +12 -0
  29. sqlspec/adapters/duckdb/config.py +414 -397
  30. sqlspec/adapters/duckdb/driver.py +342 -393
  31. sqlspec/adapters/oracledb/__init__.py +19 -5
  32. sqlspec/adapters/oracledb/_types.py +14 -0
  33. sqlspec/adapters/oracledb/config.py +123 -458
  34. sqlspec/adapters/oracledb/driver.py +505 -531
  35. sqlspec/adapters/psqlpy/__init__.py +13 -3
  36. sqlspec/adapters/psqlpy/_types.py +11 -0
  37. sqlspec/adapters/psqlpy/config.py +93 -307
  38. sqlspec/adapters/psqlpy/driver.py +504 -213
  39. sqlspec/adapters/psycopg/__init__.py +19 -5
  40. sqlspec/adapters/psycopg/_types.py +17 -0
  41. sqlspec/adapters/psycopg/config.py +143 -472
  42. sqlspec/adapters/psycopg/driver.py +704 -825
  43. sqlspec/adapters/sqlite/__init__.py +14 -3
  44. sqlspec/adapters/sqlite/_types.py +11 -0
  45. sqlspec/adapters/sqlite/config.py +208 -142
  46. sqlspec/adapters/sqlite/driver.py +263 -278
  47. sqlspec/base.py +105 -9
  48. sqlspec/{statement/builder → builder}/__init__.py +12 -14
  49. sqlspec/{statement/builder/base.py → builder/_base.py} +184 -86
  50. sqlspec/{statement/builder/column.py → builder/_column.py} +97 -60
  51. sqlspec/{statement/builder/ddl.py → builder/_ddl.py} +61 -131
  52. sqlspec/{statement/builder → builder}/_ddl_utils.py +4 -10
  53. sqlspec/{statement/builder/delete.py → builder/_delete.py} +10 -30
  54. sqlspec/builder/_insert.py +421 -0
  55. sqlspec/builder/_merge.py +71 -0
  56. sqlspec/{statement/builder → builder}/_parsing_utils.py +49 -26
  57. sqlspec/builder/_select.py +170 -0
  58. sqlspec/{statement/builder/update.py → builder/_update.py} +16 -20
  59. sqlspec/builder/mixins/__init__.py +55 -0
  60. sqlspec/builder/mixins/_cte_and_set_ops.py +222 -0
  61. sqlspec/{statement/builder/mixins/_delete_from.py → builder/mixins/_delete_operations.py} +8 -1
  62. sqlspec/builder/mixins/_insert_operations.py +244 -0
  63. sqlspec/{statement/builder/mixins/_join.py → builder/mixins/_join_operations.py} +45 -13
  64. sqlspec/{statement/builder/mixins/_merge_clauses.py → builder/mixins/_merge_operations.py} +188 -30
  65. sqlspec/builder/mixins/_order_limit_operations.py +135 -0
  66. sqlspec/builder/mixins/_pivot_operations.py +153 -0
  67. sqlspec/builder/mixins/_select_operations.py +604 -0
  68. sqlspec/builder/mixins/_update_operations.py +202 -0
  69. sqlspec/builder/mixins/_where_clause.py +644 -0
  70. sqlspec/cli.py +247 -0
  71. sqlspec/config.py +183 -138
  72. sqlspec/core/__init__.py +63 -0
  73. sqlspec/core/cache.py +871 -0
  74. sqlspec/core/compiler.py +417 -0
  75. sqlspec/core/filters.py +830 -0
  76. sqlspec/core/hashing.py +310 -0
  77. sqlspec/core/parameters.py +1237 -0
  78. sqlspec/core/result.py +677 -0
  79. sqlspec/{statement → core}/splitter.py +321 -191
  80. sqlspec/core/statement.py +676 -0
  81. sqlspec/driver/__init__.py +7 -10
  82. sqlspec/driver/_async.py +422 -163
  83. sqlspec/driver/_common.py +545 -287
  84. sqlspec/driver/_sync.py +426 -160
  85. sqlspec/driver/mixins/__init__.py +2 -13
  86. sqlspec/driver/mixins/_result_tools.py +193 -0
  87. sqlspec/driver/mixins/_sql_translator.py +65 -14
  88. sqlspec/exceptions.py +5 -252
  89. sqlspec/extensions/aiosql/adapter.py +93 -96
  90. sqlspec/extensions/litestar/__init__.py +2 -1
  91. sqlspec/extensions/litestar/cli.py +48 -0
  92. sqlspec/extensions/litestar/config.py +0 -1
  93. sqlspec/extensions/litestar/handlers.py +15 -26
  94. sqlspec/extensions/litestar/plugin.py +21 -16
  95. sqlspec/extensions/litestar/providers.py +17 -52
  96. sqlspec/loader.py +423 -104
  97. sqlspec/migrations/__init__.py +35 -0
  98. sqlspec/migrations/base.py +414 -0
  99. sqlspec/migrations/commands.py +443 -0
  100. sqlspec/migrations/loaders.py +402 -0
  101. sqlspec/migrations/runner.py +213 -0
  102. sqlspec/migrations/tracker.py +140 -0
  103. sqlspec/migrations/utils.py +129 -0
  104. sqlspec/protocols.py +51 -186
  105. sqlspec/storage/__init__.py +1 -1
  106. sqlspec/storage/backends/base.py +37 -40
  107. sqlspec/storage/backends/fsspec.py +136 -112
  108. sqlspec/storage/backends/obstore.py +138 -160
  109. sqlspec/storage/capabilities.py +5 -4
  110. sqlspec/storage/registry.py +57 -106
  111. sqlspec/typing.py +136 -115
  112. sqlspec/utils/__init__.py +2 -2
  113. sqlspec/utils/correlation.py +0 -3
  114. sqlspec/utils/deprecation.py +6 -6
  115. sqlspec/utils/fixtures.py +6 -6
  116. sqlspec/utils/logging.py +0 -2
  117. sqlspec/utils/module_loader.py +7 -12
  118. sqlspec/utils/singleton.py +0 -1
  119. sqlspec/utils/sync_tools.py +17 -38
  120. sqlspec/utils/text.py +12 -51
  121. sqlspec/utils/type_guards.py +482 -235
  122. {sqlspec-0.13.1.dist-info → sqlspec-0.16.2.dist-info}/METADATA +7 -2
  123. sqlspec-0.16.2.dist-info/RECORD +134 -0
  124. sqlspec-0.16.2.dist-info/entry_points.txt +2 -0
  125. sqlspec/driver/connection.py +0 -207
  126. sqlspec/driver/mixins/_csv_writer.py +0 -91
  127. sqlspec/driver/mixins/_pipeline.py +0 -512
  128. sqlspec/driver/mixins/_result_utils.py +0 -140
  129. sqlspec/driver/mixins/_storage.py +0 -926
  130. sqlspec/driver/mixins/_type_coercion.py +0 -130
  131. sqlspec/driver/parameters.py +0 -138
  132. sqlspec/service/__init__.py +0 -4
  133. sqlspec/service/_util.py +0 -147
  134. sqlspec/service/base.py +0 -1131
  135. sqlspec/service/pagination.py +0 -26
  136. sqlspec/statement/__init__.py +0 -21
  137. sqlspec/statement/builder/insert.py +0 -288
  138. sqlspec/statement/builder/merge.py +0 -95
  139. sqlspec/statement/builder/mixins/__init__.py +0 -65
  140. sqlspec/statement/builder/mixins/_aggregate_functions.py +0 -250
  141. sqlspec/statement/builder/mixins/_case_builder.py +0 -91
  142. sqlspec/statement/builder/mixins/_common_table_expr.py +0 -90
  143. sqlspec/statement/builder/mixins/_from.py +0 -63
  144. sqlspec/statement/builder/mixins/_group_by.py +0 -118
  145. sqlspec/statement/builder/mixins/_having.py +0 -35
  146. sqlspec/statement/builder/mixins/_insert_from_select.py +0 -47
  147. sqlspec/statement/builder/mixins/_insert_into.py +0 -36
  148. sqlspec/statement/builder/mixins/_insert_values.py +0 -67
  149. sqlspec/statement/builder/mixins/_limit_offset.py +0 -53
  150. sqlspec/statement/builder/mixins/_order_by.py +0 -46
  151. sqlspec/statement/builder/mixins/_pivot.py +0 -79
  152. sqlspec/statement/builder/mixins/_returning.py +0 -37
  153. sqlspec/statement/builder/mixins/_select_columns.py +0 -61
  154. sqlspec/statement/builder/mixins/_set_ops.py +0 -122
  155. sqlspec/statement/builder/mixins/_unpivot.py +0 -77
  156. sqlspec/statement/builder/mixins/_update_from.py +0 -55
  157. sqlspec/statement/builder/mixins/_update_set.py +0 -94
  158. sqlspec/statement/builder/mixins/_update_table.py +0 -29
  159. sqlspec/statement/builder/mixins/_where.py +0 -401
  160. sqlspec/statement/builder/mixins/_window_functions.py +0 -86
  161. sqlspec/statement/builder/select.py +0 -221
  162. sqlspec/statement/filters.py +0 -596
  163. sqlspec/statement/parameter_manager.py +0 -220
  164. sqlspec/statement/parameters.py +0 -867
  165. sqlspec/statement/pipelines/__init__.py +0 -210
  166. sqlspec/statement/pipelines/analyzers/__init__.py +0 -9
  167. sqlspec/statement/pipelines/analyzers/_analyzer.py +0 -646
  168. sqlspec/statement/pipelines/context.py +0 -115
  169. sqlspec/statement/pipelines/transformers/__init__.py +0 -7
  170. sqlspec/statement/pipelines/transformers/_expression_simplifier.py +0 -88
  171. sqlspec/statement/pipelines/transformers/_literal_parameterizer.py +0 -1247
  172. sqlspec/statement/pipelines/transformers/_remove_comments_and_hints.py +0 -76
  173. sqlspec/statement/pipelines/validators/__init__.py +0 -23
  174. sqlspec/statement/pipelines/validators/_dml_safety.py +0 -290
  175. sqlspec/statement/pipelines/validators/_parameter_style.py +0 -370
  176. sqlspec/statement/pipelines/validators/_performance.py +0 -718
  177. sqlspec/statement/pipelines/validators/_security.py +0 -967
  178. sqlspec/statement/result.py +0 -435
  179. sqlspec/statement/sql.py +0 -1704
  180. sqlspec/statement/sql_compiler.py +0 -140
  181. sqlspec/utils/cached_property.py +0 -25
  182. sqlspec-0.13.1.dist-info/RECORD +0 -150
  183. {sqlspec-0.13.1.dist-info → sqlspec-0.16.2.dist-info}/WHEEL +0 -0
  184. {sqlspec-0.13.1.dist-info → sqlspec-0.16.2.dist-info}/licenses/LICENSE +0 -0
  185. {sqlspec-0.13.1.dist-info → sqlspec-0.16.2.dist-info}/licenses/NOTICE +0 -0
@@ -1,210 +0,0 @@
1
- """SQL Statement Processing Pipelines.
2
-
3
- This module defines the framework for processing SQL statements through a series of
4
- configurable stages: transformation, validation, and analysis.
5
-
6
- Key Components:
7
- - `SQLProcessingContext`: Holds shared data and state during pipeline execution.
8
- - `StatementPipelineResult`: Encapsulates the final results of a pipeline run.
9
- - `StatementPipeline`: The main orchestrator for executing the processing stages.
10
- - `ProcessorProtocol`: The base protocol for all pipeline components (transformers,
11
- validators, analyzers).
12
- - `ValidationError`: Represents a single issue found during validation.
13
- """
14
-
15
- from dataclasses import dataclass
16
- from typing import TYPE_CHECKING, Optional
17
-
18
- import sqlglot
19
- from sqlglot import exp
20
- from typing_extensions import TypeVar
21
-
22
- from sqlspec.exceptions import RiskLevel
23
- from sqlspec.protocols import ProcessorProtocol
24
- from sqlspec.statement.pipelines.context import (
25
- AnalysisFinding,
26
- SQLProcessingContext,
27
- TransformationLog,
28
- ValidationError,
29
- )
30
- from sqlspec.statement.pipelines.transformers import (
31
- CommentAndHintRemover,
32
- ExpressionSimplifier,
33
- ParameterizeLiterals,
34
- SimplificationConfig,
35
- )
36
- from sqlspec.statement.pipelines.validators import (
37
- DMLSafetyConfig,
38
- DMLSafetyValidator,
39
- ParameterStyleValidator,
40
- PerformanceConfig,
41
- PerformanceValidator,
42
- SecurityValidator,
43
- SecurityValidatorConfig,
44
- )
45
- from sqlspec.utils.correlation import CorrelationContext
46
- from sqlspec.utils.logging import get_logger
47
-
48
- if TYPE_CHECKING:
49
- from sqlspec.statement.parameters import ParameterInfo
50
- from sqlspec.typing import SQLParameterType
51
-
52
-
53
- __all__ = (
54
- "AnalysisFinding",
55
- "CommentAndHintRemover",
56
- "DMLSafetyConfig",
57
- "DMLSafetyValidator",
58
- "ExpressionSimplifier",
59
- "ParameterStyleValidator",
60
- "ParameterizeLiterals",
61
- "PerformanceConfig",
62
- "PerformanceValidator",
63
- "PipelineResult",
64
- "ProcessorProtocol",
65
- "SQLProcessingContext",
66
- "SecurityValidator",
67
- "SecurityValidatorConfig",
68
- "SimplificationConfig",
69
- "StatementPipeline",
70
- "TransformationLog",
71
- "ValidationError",
72
- )
73
-
74
- logger = get_logger("pipelines")
75
-
76
- ExpressionT = TypeVar("ExpressionT", bound="exp.Expression")
77
- ResultT = TypeVar("ResultT")
78
-
79
-
80
- # Import from context module to avoid duplication
81
-
82
-
83
- @dataclass
84
- class PipelineResult:
85
- """Final result of pipeline execution."""
86
-
87
- expression: exp.Expression
88
- """The SQL expression after all transformations."""
89
-
90
- context: SQLProcessingContext
91
- """Contains all collected results."""
92
-
93
- @property
94
- def validation_errors(self) -> list[ValidationError]:
95
- """Get validation errors from context."""
96
- return self.context.validation_errors
97
-
98
- @property
99
- def has_errors(self) -> bool:
100
- """Check if any validation errors exist."""
101
- return self.context.has_errors
102
-
103
- @property
104
- def risk_level(self) -> RiskLevel:
105
- """Get overall risk level."""
106
- return self.context.risk_level
107
-
108
- @property
109
- def merged_parameters(self) -> "SQLParameterType":
110
- """Get merged parameters from context."""
111
- return self.context.merged_parameters
112
-
113
- @property
114
- def parameter_info(self) -> "list[ParameterInfo]":
115
- """Get parameter info from context."""
116
- return self.context.parameter_info
117
-
118
-
119
- class StatementPipeline:
120
- """Orchestrates the processing of an SQL expression through transformers, validators, and analyzers."""
121
-
122
- def __init__(
123
- self,
124
- transformers: Optional[list[ProcessorProtocol]] = None,
125
- validators: Optional[list[ProcessorProtocol]] = None,
126
- analyzers: Optional[list[ProcessorProtocol]] = None,
127
- ) -> None:
128
- self.transformers = transformers or []
129
- self.validators = validators or []
130
- self.analyzers = analyzers or []
131
-
132
- def _run_processors(
133
- self,
134
- processors: list[ProcessorProtocol],
135
- context: SQLProcessingContext,
136
- processor_type: str,
137
- enable_flag: bool,
138
- error_risk_level: RiskLevel,
139
- ) -> None:
140
- if not enable_flag or context.current_expression is None:
141
- return
142
-
143
- for processor in processors:
144
- processor_name = processor.__class__.__name__
145
- try:
146
- if processor_type == "transformer":
147
- context.current_expression = processor.process(context.current_expression, context)
148
- else:
149
- processor.process(context.current_expression, context)
150
- except Exception as e:
151
- # In strict mode, re-raise validation exceptions
152
- from sqlspec.exceptions import MissingParameterError
153
- from sqlspec.statement.pipelines.validators._parameter_style import (
154
- MixedParameterStyleError,
155
- UnsupportedParameterStyleError,
156
- )
157
-
158
- if context.config.strict_mode and isinstance(
159
- e, (MissingParameterError, MixedParameterStyleError, UnsupportedParameterStyleError)
160
- ):
161
- raise
162
-
163
- error = ValidationError(
164
- message=f"{processor_type.capitalize()} {processor_name} failed: {e}",
165
- code=f"{processor_type}-failure",
166
- risk_level=error_risk_level,
167
- processor=processor_name,
168
- expression=context.current_expression,
169
- )
170
- context.validation_errors.append(error)
171
- logger.exception("%s %s failed", processor_type.capitalize(), processor_name)
172
- if processor_type == "transformer":
173
- break # Stop further transformations if one fails
174
-
175
- def execute_pipeline(self, context: "SQLProcessingContext") -> "PipelineResult":
176
- """Executes the full pipeline (transform, validate, analyze) using the SQLProcessingContext."""
177
- CorrelationContext.get()
178
- if context.current_expression is None:
179
- try:
180
- context.current_expression = sqlglot.parse_one(context.initial_sql_string, dialect=context.dialect)
181
- except Exception as e:
182
- error = ValidationError(
183
- message=f"SQL Parsing Error: {e}",
184
- code="parsing-error",
185
- risk_level=RiskLevel.CRITICAL,
186
- processor="StatementPipeline",
187
- expression=None,
188
- )
189
- context.validation_errors.append(error)
190
- return PipelineResult(expression=exp.Select(), context=context)
191
-
192
- # Run transformers
193
- if self.transformers:
194
- self._run_processors(
195
- self.transformers, context, "transformer", enable_flag=True, error_risk_level=RiskLevel.CRITICAL
196
- )
197
-
198
- # Run validators
199
- if self.validators:
200
- self._run_processors(
201
- self.validators, context, "validator", enable_flag=True, error_risk_level=RiskLevel.CRITICAL
202
- )
203
-
204
- # Run analyzers
205
- if self.analyzers:
206
- self._run_processors(
207
- self.analyzers, context, "analyzer", enable_flag=True, error_risk_level=RiskLevel.MEDIUM
208
- )
209
-
210
- return PipelineResult(expression=context.current_expression or exp.Select(), context=context)
@@ -1,9 +0,0 @@
1
- """SQL Analysis Pipeline Components.
2
-
3
- This module provides analysis components that can extract metadata and insights
4
- from SQL statements as part of the processing pipeline.
5
- """
6
-
7
- from sqlspec.statement.pipelines.analyzers._analyzer import StatementAnalysis, StatementAnalyzer
8
-
9
- __all__ = ("StatementAnalysis", "StatementAnalyzer")