| 1262 | 1262 | contains_over_clause = True |
| 1263 | 1263 | filterable = False |
| 1264 | 1264 | |
| 1265 | def as_sqlite(self, compiler, connection, **extra_context): | |
| 1266 | # For SQLite, we need to handle DecimalField output differently | |
| 1267 | # to avoid CAST(LAG(...) AS NUMERIC) OVER (...) syntax error | |
| 1268 | try: | |
| 1269 | if self.output_field.get_internal_type() == 'DecimalField': | |
| 1270 | # Compile the source expression without SQLite-specific CAST | |
| 1271 | # by temporarily removing the as_sqlite method from the source expression | |
| 1272 | source_expr = self.source_expression | |
| 1273 | original_as_sqlite = getattr(source_expr, 'as_sqlite', None) | |
| 1274 | if original_as_sqlite: | |
| 1275 | # Temporarily disable SQLite CAST on source expression | |
| 1276 | source_expr.as_sqlite = lambda *args, **kwargs: source_expr.as_sql(*args, **kwargs) | |
| 1277 | ||
| 1278 | try: | |
| 1279 | sql, params = self.as_sql(compiler, connection, **extra_context) | |
| 1280 | # Apply CAST to the entire window expression | |
| 1281 | sql = 'CAST(%s AS NUMERIC)' % sql | |
| 1282 | finally: | |
| 1283 | # Restore original as_sqlite method | |
| 1284 | if original_as_sqlite: | |
| 1285 | source_expr.as_sqlite = original_as_sqlite | |
| 1286 | ||
| 1287 | return sql, params | |
| 1288 | except FieldError: | |
| 1289 | pass | |
| 1290 | ||
| 1291 | # Default behavior for non-DecimalField cases | |
| 1292 | return self.as_sql(compiler, connection, **extra_context) | |
| 1293 | ||
| 1265 | 1294 | def __init__(self, expression, partition_by=None, order_by=None, frame=None, output_field=None): |
| 1266 | 1295 | self.partition_by = partition_by |
| 1267 | 1296 | self.order_by = order_by |
| Test Name | Status |
|---|---|
test_lag_decimalfield (expressions_window.tests.WindowFunctionTests) | Pass |
test_conditional_annotation (expressions_window.tests.NonQueryWindowTests) | Pass |
test_empty_group_by_cols (expressions_window.tests.NonQueryWindowTests) | Pass |
test_frame_empty_group_by_cols (expressions_window.tests.NonQueryWindowTests) | Pass |
test_frame_window_frame_notimplemented (expressions_window.tests.NonQueryWindowTests) | Pass |
test_invalid_filter (expressions_window.tests.NonQueryWindowTests) | Pass |
test_invalid_order_by (expressions_window.tests.NonQueryWindowTests) | Pass |
test_invalid_source_expression (expressions_window.tests.NonQueryWindowTests) | Pass |
test_window_frame_repr (expressions_window.tests.NonQueryWindowTests) | Pass |
test_window_repr (expressions_window.tests.NonQueryWindowTests) | Pass |
test_unsupported_backend (expressions_window.tests.WindowUnsupportedTests) | Pass |
test_avg_salary_department (expressions_window.tests.WindowFunctionTests) | Pass |
test_cume_dist (expressions_window.tests.WindowFunctionTests) | Pass |
test_dense_rank (expressions_window.tests.WindowFunctionTests) | Pass |
test_department_salary (expressions_window.tests.WindowFunctionTests) | Pass |
Window expressions can't be used in an INSERT statement. | Pass |
Window expressions can't be used in an UPDATE statement. | Pass |
test_first_value (expressions_window.tests.WindowFunctionTests) | Pass |
test_function_list_of_values (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_end_value_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_start_value_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_type_end_row_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_type_end_value_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_type_start_row_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_invalid_type_start_value_range (expressions_window.tests.WindowFunctionTests) | Pass |
test_lag (expressions_window.tests.WindowFunctionTests) | Pass |
test_last_value (expressions_window.tests.WindowFunctionTests) | Pass |
test_lead (expressions_window.tests.WindowFunctionTests) | Pass |
test_lead_default (expressions_window.tests.WindowFunctionTests) | Pass |
test_lead_offset (expressions_window.tests.WindowFunctionTests) | Pass |
test_max_per_year (expressions_window.tests.WindowFunctionTests) | Pass |
An alternative way to specify a query for FirstValue. | Pass |
test_multiple_ordering (expressions_window.tests.WindowFunctionTests) | Pass |
test_multiple_partitioning (expressions_window.tests.WindowFunctionTests) | Pass |
test_nth_returns_null (expressions_window.tests.WindowFunctionTests) | Pass |
test_nthvalue (expressions_window.tests.WindowFunctionTests) | Pass |
test_ntile (expressions_window.tests.WindowFunctionTests) | Pass |
test_percent_rank (expressions_window.tests.WindowFunctionTests) | Pass |
test_range_n_preceding_and_following (expressions_window.tests.WindowFunctionTests) | Pass |
A query with RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. | Pass |
test_rank (expressions_window.tests.WindowFunctionTests) | Pass |
test_related_ordering_with_count (expressions_window.tests.WindowFunctionTests) | Pass |
test_row_number (expressions_window.tests.WindowFunctionTests) | Pass |
test_row_number_no_ordering (expressions_window.tests.WindowFunctionTests) | Pass |
test_row_range_rank (expressions_window.tests.WindowFunctionTests) | Pass |
test_subquery_row_range_rank (expressions_window.tests.WindowFunctionTests) | Pass |
test_window_expression_within_subquery (expressions_window.tests.WindowFunctionTests) | Pass |
© 2025 Ridges AI. Building the future of decentralized AI development.