polyglot-sql 0.13.2__tar.gz → 0.13.4__tar.gz

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.
Files changed (239) hide show
  1. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/Cargo.lock +6 -6
  2. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/Cargo.toml +1 -1
  3. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/PKG-INFO +1 -1
  4. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/Cargo.toml +2 -2
  5. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/README.md +4 -4
  6. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/clickhouse.rs +3 -2
  7. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/mod.rs +5 -0
  8. polyglot_sql-0.13.4/crates/polyglot-sql/src/dialects/normalization/duckdb.rs +272 -0
  9. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +2 -1
  10. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/statements.rs +19 -7
  11. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/expressions.rs +11 -0
  12. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/generator.rs +616 -90
  13. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/parser.rs +732 -109
  14. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/query_analysis/column_uses.rs +17 -9
  15. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/scope.rs +95 -4
  16. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/tokens.rs +10 -2
  17. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/deep_nesting_regression.rs +18 -0
  18. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/dialect_matrix.rs +138 -0
  19. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/duckdb_integer_division.rs +211 -6
  20. polyglot_sql-0.13.4/crates/polyglot-sql/tests/duckdb_json_arrow_context.rs +398 -0
  21. polyglot_sql-0.13.4/crates/polyglot-sql/tests/duckdb_unreserved_relation_aliases.rs +98 -0
  22. polyglot_sql-0.13.4/crates/polyglot-sql/tests/is_predicate_precedence.rs +288 -0
  23. polyglot_sql-0.13.4/crates/polyglot-sql/tests/mod_precedence.rs +176 -0
  24. polyglot_sql-0.13.4/crates/polyglot-sql/tests/numeric_exponent_boundaries.rs +45 -0
  25. polyglot_sql-0.13.4/crates/polyglot-sql/tests/query_analysis_regression.rs +418 -0
  26. polyglot_sql-0.13.4/crates/polyglot-sql/tests/quoted_relation_columns.rs +250 -0
  27. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/README.md +1 -1
  28. polyglot_sql-0.13.4/crates/polyglot-sql-python/tests/test_duckdb_datafusion_execution.py +102 -0
  29. polyglot_sql-0.13.2/crates/polyglot-sql/src/dialects/normalization/duckdb.rs +0 -107
  30. polyglot_sql-0.13.2/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -201
  31. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/README.md +0 -0
  32. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  33. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  34. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/common/mod.rs +0 -0
  35. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/in_list.rs +0 -0
  36. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/lineage.rs +0 -0
  37. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/parsing.rs +0 -0
  38. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
  39. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  40. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/benches/transpile.rs +0 -0
  41. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  42. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  43. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_children.rs +0 -0
  44. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_json.rs +0 -0
  45. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
  46. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  47. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/binding.rs +0 -0
  48. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/builder/mod.rs +0 -0
  49. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  50. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  51. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  52. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  53. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  54. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  55. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  56. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  57. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  58. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  59. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
  60. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  61. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  62. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  63. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  64. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/hana.rs +0 -0
  65. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  66. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  67. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  68. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
  69. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  70. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/hana.rs +0 -0
  71. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  72. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
  73. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
  74. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  75. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
  76. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  77. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/normalization/vertica.rs +0 -0
  78. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  79. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  80. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
  81. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  82. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  83. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  84. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  85. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  86. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  87. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  88. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  89. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  90. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  91. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  92. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  93. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  94. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/dialects/vertica.rs +0 -0
  95. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/diff.rs +0 -0
  96. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/error.rs +0 -0
  97. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/format_tokens.rs +0 -0
  98. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  99. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/function_registry.rs +0 -0
  100. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/guard.rs +0 -0
  101. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/helper.rs +0 -0
  102. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/lib.rs +0 -0
  103. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/lineage.rs +0 -0
  104. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/openlineage.rs +0 -0
  105. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
  106. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  107. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  108. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  109. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  110. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  111. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  112. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  113. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  114. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  115. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  116. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  117. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  118. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  119. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/set_operation_types.rs +0 -0
  120. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  121. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  122. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/planner.rs +0 -0
  123. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/query_analysis.rs +0 -0
  124. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/resolver.rs +0 -0
  125. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/schema.rs +0 -0
  126. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/set_operation.rs +0 -0
  127. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/time.rs +0 -0
  128. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/transforms.rs +0 -0
  129. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/traversal.rs +0 -0
  130. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/trie.rs +0 -0
  131. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation/semantics.rs +0 -0
  132. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation/tests.rs +0 -0
  133. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/src/validation.rs +0 -0
  134. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  135. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  136. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
  137. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  138. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  139. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  140. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  141. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  142. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  143. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  144. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  145. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  146. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  147. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  148. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  149. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  150. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  151. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  152. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  153. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/ddl.json +0 -0
  154. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/dml.json +0 -0
  155. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/functions.json +0 -0
  156. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/identity.json +0 -0
  157. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/select.json +0 -0
  158. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/hana/types.json +0 -0
  159. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/identity.json +0 -0
  160. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/transpilation.json +0 -0
  161. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/custom_fixtures/vertica/types.json +0 -0
  162. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
  163. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/duckdb_order_by_all.rs +0 -0
  164. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  165. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  166. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  167. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  168. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  169. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  170. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  171. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  172. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/query_analysis.rs +0 -0
  173. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  174. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  175. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  176. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  177. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  178. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  179. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  180. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  181. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  182. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  183. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  184. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  185. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  186. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  187. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  188. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  189. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  190. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  191. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  192. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  193. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/Cargo.toml +0 -0
  194. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/README.md +0 -0
  195. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/docs/api.md +0 -0
  196. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/docs/index.md +0 -0
  197. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  198. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  199. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/builders.rs +0 -0
  200. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  201. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/diff.rs +0 -0
  202. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/errors.rs +0 -0
  203. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/expr.rs +0 -0
  204. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  205. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/format.rs +0 -0
  206. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/generate.rs +0 -0
  207. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  208. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/lib.rs +0 -0
  209. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  210. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  211. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  212. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/parse.rs +0 -0
  213. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
  214. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  215. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  216. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  217. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/types.rs +0 -0
  218. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/src/validate.rs +0 -0
  219. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  220. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  221. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  222. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  223. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  224. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  225. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  226. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  227. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  228. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  229. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  230. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
  231. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  232. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  233. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  234. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/crates/polyglot-sql-python/uv.lock +0 -0
  235. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/pyproject.toml +0 -0
  236. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/__init__.py +0 -0
  237. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/__init__.pyi +0 -0
  238. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/analysis_types.py +0 -0
  239. {polyglot_sql-0.13.2 → polyglot_sql-0.13.4}/python/polyglot_sql/py.typed +0 -0
@@ -605,7 +605,7 @@ dependencies = [
605
605
 
606
606
  [[package]]
607
607
  name = "polyglot-sql"
608
- version = "0.13.2"
608
+ version = "0.13.4"
609
609
  dependencies = [
610
610
  "criterion",
611
611
  "once_cell",
@@ -623,7 +623,7 @@ dependencies = [
623
623
 
624
624
  [[package]]
625
625
  name = "polyglot-sql-ast-derive"
626
- version = "0.13.2"
626
+ version = "0.13.4"
627
627
  dependencies = [
628
628
  "proc-macro2",
629
629
  "quote",
@@ -632,7 +632,7 @@ dependencies = [
632
632
 
633
633
  [[package]]
634
634
  name = "polyglot-sql-ffi"
635
- version = "0.13.2"
635
+ version = "0.13.4"
636
636
  dependencies = [
637
637
  "cbindgen",
638
638
  "polyglot-sql",
@@ -642,11 +642,11 @@ dependencies = [
642
642
 
643
643
  [[package]]
644
644
  name = "polyglot-sql-function-catalogs"
645
- version = "0.13.2"
645
+ version = "0.13.4"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.13.2"
649
+ version = "0.13.4"
650
650
  dependencies = [
651
651
  "polyglot-sql",
652
652
  "pyo3",
@@ -657,7 +657,7 @@ dependencies = [
657
657
 
658
658
  [[package]]
659
659
  name = "polyglot-sql-wasm"
660
- version = "0.13.2"
660
+ version = "0.13.4"
661
661
  dependencies = [
662
662
  "console_error_panic_hook",
663
663
  "js-sys",
@@ -6,7 +6,7 @@ exclude = [
6
6
  ]
7
7
 
8
8
  [workspace.package]
9
- version = "0.13.2"
9
+ version = "0.13.4"
10
10
  edition = "2021"
11
11
  license = "MIT"
12
12
  authors = ["polyglot contributors"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: polyglot-sql
3
- Version: 0.13.2
3
+ Version: 0.13.4
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -103,14 +103,14 @@ function-catalog-all-dialects = [
103
103
  ]
104
104
 
105
105
  [dependencies]
106
- polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.13.2" }
106
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.13.4" }
107
107
  serde = { workspace = true }
108
108
  serde_json = { workspace = true }
109
109
  thiserror = { workspace = true }
110
110
  unicode-segmentation = { workspace = true }
111
111
  stacker = { version = "0.1", optional = true }
112
112
  ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
113
- polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.13.2", optional = true, default-features = false }
113
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.13.4", optional = true, default-features = false }
114
114
 
115
115
  [dev-dependencies]
116
116
  pretty_assertions = "1.4"
@@ -25,12 +25,12 @@ By default, `polyglot-sql` enables the full public API. Parser-only consumers ca
25
25
  disable default features and opt into only the dialect parsers they need:
26
26
 
27
27
  ```toml
28
- polyglot-sql = { version = "0.13.2", default-features = false }
28
+ polyglot-sql = { version = "0.13.4", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.13.2",
33
+ version = "0.13.4",
34
34
  default-features = false,
35
35
  features = ["dialect-clickhouse"],
36
36
  }
@@ -44,14 +44,14 @@ Examples:
44
44
  ```toml
45
45
  # Parse and generate SQL for one dialect.
46
46
  polyglot-sql = {
47
- version = "0.13.2",
47
+ version = "0.13.4",
48
48
  default-features = false,
49
49
  features = ["generate", "dialect-clickhouse"],
50
50
  }
51
51
 
52
52
  # Cross-dialect transpilation.
53
53
  polyglot-sql = {
54
- version = "0.13.2",
54
+ version = "0.13.4",
55
55
  default-features = false,
56
56
  features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
57
57
  }
@@ -111,6 +111,9 @@ impl DialectImpl for ClickHouseDialect {
111
111
 
112
112
  let wrap_not_target = |expr: Expression| -> Expression {
113
113
  match expr {
114
+ // The generator emits typed negated LIKE predicates directly.
115
+ // Keep that form stable when reparsing lowered notLike calls.
116
+ Expression::Like(_) | Expression::ILike(_) => expr,
114
117
  Expression::Paren(_) => expr,
115
118
  Expression::In(_)
116
119
  | Expression::Between(_)
@@ -119,8 +122,6 @@ impl DialectImpl for ClickHouseDialect {
119
122
  | Expression::IsTrue(_)
120
123
  | Expression::IsFalse(_)
121
124
  | Expression::IsJson(_)
122
- | Expression::Like(_)
123
- | Expression::ILike(_)
124
125
  | Expression::SimilarTo(_)
125
126
  | Expression::Glob(_)
126
127
  | Expression::RegexpLike(_)
@@ -947,6 +947,8 @@ where
947
947
  | Expression::BitwiseAnd(_)
948
948
  | Expression::BitwiseOr(_)
949
949
  | Expression::BitwiseXor(_)
950
+ | Expression::BitwiseLeftShift(_)
951
+ | Expression::BitwiseRightShift(_)
950
952
  | Expression::Is(_)
951
953
  | Expression::MemberOf(_)
952
954
  | Expression::ArrayContainsAll(_)
@@ -2110,6 +2112,8 @@ where
2110
2112
  Expression::BitwiseAnd(op) => transform_binary!(BitwiseAnd, *op),
2111
2113
  Expression::BitwiseOr(op) => transform_binary!(BitwiseOr, *op),
2112
2114
  Expression::BitwiseXor(op) => transform_binary!(BitwiseXor, *op),
2115
+ Expression::BitwiseLeftShift(op) => transform_binary!(BitwiseLeftShift, *op),
2116
+ Expression::BitwiseRightShift(op) => transform_binary!(BitwiseRightShift, *op),
2113
2117
  Expression::Is(op) => transform_binary!(Is, *op),
2114
2118
 
2115
2119
  // ===== TryCast / SafeCast =====
@@ -9201,6 +9205,7 @@ impl Dialect {
9201
9205
  cross_apply: None,
9202
9206
  ordinality: None,
9203
9207
  column_aliases: vec![],
9208
+ column_aliases_quoted: vec![],
9204
9209
  }));
9205
9210
 
9206
9211
  // Remove the original join and add to FROM expressions
@@ -0,0 +1,272 @@
1
+ //! Preserve DuckDB's type-dependent `//` semantics before target rewrites.
2
+
3
+ use super::scalar::{expression_numeric_kind, NumericKind};
4
+ use super::*;
5
+ use crate::expressions::RoundFunc;
6
+
7
+ fn combine(left: NumericKind, right: NumericKind) -> NumericKind {
8
+ use NumericKind::*;
9
+ match (left, right) {
10
+ (Unknown, _) | (_, Unknown) => Unknown,
11
+ (Float, _) | (_, Float) => Float,
12
+ (Decimal, _) | (_, Decimal) => Decimal,
13
+ (Integer, Integer) => Integer,
14
+ }
15
+ }
16
+
17
+ fn numeric_kind(expr: &Expression) -> NumericKind {
18
+ match expr {
19
+ Expression::Paren(p) => numeric_kind(&p.this),
20
+ Expression::Neg(n) => numeric_kind(&n.this),
21
+ Expression::Alias(a) => numeric_kind(&a.this),
22
+ Expression::Add(b) | Expression::Sub(b) | Expression::Mul(b) | Expression::Mod(b) => {
23
+ combine(numeric_kind(&b.left), numeric_kind(&b.right))
24
+ }
25
+ // The complete bottom-up source pass has already lowered fractional
26
+ // children to Div. Remaining IntDiv children have integer operands.
27
+ Expression::IntDiv(_) => NumericKind::Integer,
28
+ Expression::Div(_) => NumericKind::Float,
29
+ Expression::Function(f) if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 => {
30
+ numeric_kind(&f.args[0])
31
+ }
32
+ Expression::NullIf(f) => numeric_kind(&f.this),
33
+ _ => expression_numeric_kind(expr),
34
+ }
35
+ }
36
+
37
+ /// Classify the rewritten DataFusion expression. Source `/` nodes have already
38
+ /// been made floating, and lowered `//` nodes retain their operands' types.
39
+ /// Never infer provenance from SQL syntax such as a NULLIF divisor.
40
+ fn datafusion_numeric_kind(expr: &Expression) -> NumericKind {
41
+ match expr {
42
+ Expression::Paren(p) => datafusion_numeric_kind(&p.this),
43
+ Expression::Annotated(a) => datafusion_numeric_kind(&a.this),
44
+ Expression::Neg(n) => datafusion_numeric_kind(&n.this),
45
+ Expression::Alias(a) => datafusion_numeric_kind(&a.this),
46
+ Expression::Abs(f) => datafusion_numeric_kind(&f.this),
47
+ Expression::Add(b) | Expression::Sub(b) | Expression::Mul(b) | Expression::Mod(b) => {
48
+ combine(
49
+ datafusion_numeric_kind(&b.left),
50
+ datafusion_numeric_kind(&b.right),
51
+ )
52
+ }
53
+ Expression::Div(b) => {
54
+ let left = datafusion_numeric_kind(&b.left);
55
+ // Div is already target SQL. Its generated NULLIF follows
56
+ // DataFusion's common-type coercion, including a floating divisor.
57
+ let right = match &b.right {
58
+ Expression::Function(f)
59
+ if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 =>
60
+ {
61
+ combine(
62
+ datafusion_numeric_kind(&f.args[0]),
63
+ datafusion_numeric_kind(&f.args[1]),
64
+ )
65
+ }
66
+ other => datafusion_numeric_kind(other),
67
+ };
68
+ // A source `/` supplies a floating operand even when columns or
69
+ // function return types on the other side are unresolved.
70
+ if left == NumericKind::Float || right == NumericKind::Float {
71
+ NumericKind::Float
72
+ } else {
73
+ combine(left, right)
74
+ }
75
+ }
76
+ Expression::Coalesce(f) => datafusion_branch_kind(f.expressions.iter()),
77
+ Expression::Case(c) => datafusion_branch_kind(
78
+ c.whens
79
+ .iter()
80
+ .map(|(_, result)| result)
81
+ .chain(c.else_.iter()),
82
+ ),
83
+ Expression::IfFunc(f) => {
84
+ datafusion_branch_kind(std::iter::once(&f.true_value).chain(f.false_value.iter()))
85
+ }
86
+ Expression::Function(f) if f.name.eq_ignore_ascii_case("NULLIF") && f.args.len() == 2 => {
87
+ datafusion_nullif_kind(&f.args[0], &f.args[1])
88
+ }
89
+ Expression::NullIf(f) => datafusion_nullif_kind(&f.this, &f.expression),
90
+ // Do not assume functions such as ROUND preserve numeric types across
91
+ // dialects: DuckDB ROUND(integer) is integer, DataFusion's is floating.
92
+ _ => expression_numeric_kind(expr),
93
+ }
94
+ }
95
+
96
+ fn datafusion_branch_kind<'a>(branches: impl Iterator<Item = &'a Expression>) -> NumericKind {
97
+ branches
98
+ .filter(|expr| !matches!(expr, Expression::Null(_)))
99
+ .map(datafusion_numeric_kind)
100
+ .reduce(combine)
101
+ .unwrap_or(NumericKind::Unknown)
102
+ }
103
+
104
+ fn datafusion_nullif_kind(left: &Expression, right: &Expression) -> NumericKind {
105
+ let left_kind = datafusion_numeric_kind(left);
106
+ // DuckDB preserves the first argument's type, but DataFusion coerces both
107
+ // arguments to a common type. Mixed numeric types need an explicit cast.
108
+ if left_kind == datafusion_numeric_kind(right) || matches!(right, Expression::Null(_)) {
109
+ left_kind
110
+ } else {
111
+ NumericKind::Unknown
112
+ }
113
+ }
114
+
115
+ fn as_double(expr: Expression) -> Expression {
116
+ super::operators::cast_expr(
117
+ expr,
118
+ DataType::Double {
119
+ precision: None,
120
+ scale: None,
121
+ },
122
+ )
123
+ }
124
+
125
+ fn unresolved_division(target: DialectType) -> crate::error::Error {
126
+ crate::error::Error::unsupported(
127
+ "DuckDB // with unresolved operand types; use explicit numeric casts",
128
+ target.to_string(),
129
+ )
130
+ }
131
+
132
+ fn prepare_datafusion_division(expr: Expression) -> Result<Expression> {
133
+ // Stop the outer traversal at each outermost IntDiv. Rewrite that complete
134
+ // subtree once, bottom-up, including casts, functions, CASE and subqueries.
135
+ // Replacement nodes are not revisited, so a generated Div cannot be
136
+ // mistaken for a source `/`, even across nested integer divisions.
137
+ crate::traversal::transform_with_dispatch(
138
+ expr,
139
+ &Ok,
140
+ &|expr| !matches!(expr, Expression::IntDiv(_)),
141
+ &|expr, _| {
142
+ crate::traversal::transform_all(expr, &|mut expr| {
143
+ match &mut expr {
144
+ Expression::Div(b) => {
145
+ // Integer, decimal and unresolved source operands need
146
+ // floating arithmetic. Preserve an existing FLOAT operand
147
+ // rather than widening DuckDB's FLOAT/FLOAT division.
148
+ if datafusion_numeric_kind(&b.left) != NumericKind::Float
149
+ && datafusion_numeric_kind(&b.right) != NumericKind::Float
150
+ {
151
+ b.left =
152
+ as_double(std::mem::replace(&mut b.left, Expression::number(0)));
153
+ }
154
+ }
155
+ Expression::Cast(c) | Expression::TryCast(c) | Expression::SafeCast(c)
156
+ if super::scalar::data_type_numeric_kind(&c.to) == NumericKind::Integer
157
+ && matches!(
158
+ datafusion_numeric_kind(&c.this),
159
+ NumericKind::Float | NumericKind::Decimal
160
+ ) =>
161
+ {
162
+ // DuckDB rounds numeric casts to integers; DataFusion
163
+ // truncates. This also matters after a nested source `/`.
164
+ c.this = Expression::Round(Box::new(RoundFunc {
165
+ this: std::mem::replace(&mut c.this, Expression::number(0)),
166
+ decimals: Some(Expression::number(0)),
167
+ }));
168
+ }
169
+ Expression::IntDiv(_) => {
170
+ let Expression::IntDiv(mut division) = expr else {
171
+ unreachable!()
172
+ };
173
+ let kind = combine(
174
+ datafusion_numeric_kind(&division.this),
175
+ datafusion_numeric_kind(&division.expression),
176
+ );
177
+ if kind == NumericKind::Unknown {
178
+ return Err(unresolved_division(DialectType::DataFusion));
179
+ }
180
+ if kind == NumericKind::Decimal {
181
+ division.this = as_double(division.this);
182
+ }
183
+ return Ok(Expression::Div(Box::new(BinaryOp::new(
184
+ division.this,
185
+ Expression::Function(Box::new(Function::new(
186
+ "NULLIF".to_string(),
187
+ vec![division.expression, Expression::number(0)],
188
+ ))),
189
+ ))));
190
+ }
191
+ _ => {}
192
+ }
193
+ Ok(expr)
194
+ })
195
+ },
196
+ )
197
+ }
198
+
199
+ pub(in crate::dialects) fn prepare_integer_division(
200
+ expr: Expression,
201
+ source: DialectType,
202
+ target: DialectType,
203
+ ) -> Result<Expression> {
204
+ if source != DialectType::DuckDB || target == DialectType::DuckDB {
205
+ return Ok(expr);
206
+ }
207
+
208
+ if target == DialectType::DataFusion {
209
+ return prepare_datafusion_division(expr);
210
+ }
211
+
212
+ // Visit every physical child, including typed function arguments and both
213
+ // operands of nested IntDiv nodes, before lowering the enclosing operator.
214
+ crate::traversal::transform_all(expr, &|expr| {
215
+ let Expression::IntDiv(mut division) = expr else {
216
+ return Ok(expr);
217
+ };
218
+ let left_kind = numeric_kind(&division.this);
219
+ let right_kind = numeric_kind(&division.expression);
220
+ let kind = combine(left_kind, right_kind);
221
+
222
+ if kind == NumericKind::Unknown {
223
+ return Err(unresolved_division(target));
224
+ }
225
+
226
+ // NULLIF evaluates the divisor once and preserves NULL on zero for
227
+ // literals, casts, computed expressions, and values only known at runtime.
228
+ division.expression = Expression::Function(Box::new(Function::new(
229
+ "NULLIF".to_string(),
230
+ vec![division.expression, Expression::number(0)],
231
+ )));
232
+
233
+ if kind != NumericKind::Integer {
234
+ // DuckDB decimal division produces DOUBLE, whereas some targets
235
+ // keep decimal arithmetic (and SQLite may treat DECIMAL as INTEGER).
236
+ // An explicitly floating operand already establishes float division.
237
+ if kind == NumericKind::Decimal {
238
+ division.this = super::operators::cast_expr(
239
+ division.this,
240
+ DataType::Double {
241
+ precision: None,
242
+ scale: None,
243
+ },
244
+ );
245
+ }
246
+ return Ok(Expression::Div(Box::new(BinaryOp::new(
247
+ division.this,
248
+ division.expression,
249
+ ))));
250
+ }
251
+
252
+ // Only use IntDiv where generation has a native or exact lowering.
253
+ // A generic DIV(...) call is invalid in several other targets.
254
+ if !matches!(
255
+ target,
256
+ DialectType::PostgreSQL
257
+ | DialectType::BigQuery
258
+ | DialectType::ClickHouse
259
+ | DialectType::SQLite
260
+ | DialectType::Vertica
261
+ | DialectType::Hive
262
+ | DialectType::Spark
263
+ | DialectType::Databricks
264
+ ) {
265
+ return Err(crate::error::Error::unsupported(
266
+ "DuckDB integer // conversion",
267
+ target.to_string(),
268
+ ));
269
+ }
270
+ Ok(Expression::IntDiv(division))
271
+ })
272
+ }
@@ -15738,7 +15738,8 @@ pub(super) fn normalize_bigquery_function(
15738
15738
  | DialectType::Athena
15739
15739
  | DialectType::Snowflake
15740
15740
  | DialectType::TSQL
15741
- | DialectType::Fabric => {
15741
+ | DialectType::Fabric
15742
+ | DialectType::DataFusion => {
15742
15743
  let x = args.remove(0);
15743
15744
  let y = args.remove(0);
15744
15745
  // Wrap complex expressions in parens to preserve precedence
@@ -233,15 +233,27 @@ pub(super) fn normalize_root(expression: Expression, context: &NormalizationCont
233
233
  });
234
234
  for constraint in &mut ct.constraints {
235
235
  if let crate::expressions::TableConstraint::PrimaryKey {
236
- columns, modifiers, ..
236
+ columns,
237
+ key_parts,
238
+ modifiers,
239
+ ..
237
240
  } = constraint
238
241
  {
239
- // Strip ASC/DESC from column names
240
- for col in columns.iter_mut() {
241
- if col.name.ends_with(" ASC") {
242
- col.name = col.name[..col.name.len() - 4].to_string();
243
- } else if col.name.ends_with(" DESC") {
244
- col.name = col.name[..col.name.len() - 5].to_string();
242
+ if key_parts.is_empty() {
243
+ // Older ASTs encoded order modifiers in column names.
244
+ for col in columns.iter_mut() {
245
+ if col.name.ends_with(" ASC") {
246
+ col.name = col.name[..col.name.len() - 4].to_string();
247
+ } else if col.name.ends_with(" DESC") {
248
+ col.name = col.name[..col.name.len() - 5].to_string();
249
+ }
250
+ }
251
+ } else {
252
+ // Structured key names are literal; only remove the
253
+ // sort modifiers, including for names ending in DESC.
254
+ for part in key_parts.iter_mut() {
255
+ part.asc = false;
256
+ part.desc = false;
245
257
  }
246
258
  }
247
259
  // Strip TSQL-specific modifiers
@@ -8505,6 +8505,11 @@ pub enum TableConstraint {
8505
8505
  PrimaryKey {
8506
8506
  name: Option<Identifier>,
8507
8507
  columns: Vec<Identifier>,
8508
+ /// Structured quoted, prefixed or ordered keys. When present these are
8509
+ /// authoritative for rendering; `columns` retains the column names.
8510
+ /// Older ASTs can encode prefix/order syntax directly in `columns`.
8511
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
8512
+ key_parts: Vec<IndexKeyPart>,
8508
8513
  /// Databricks primary-key columns marked with the TIMESERIES attribute.
8509
8514
  #[serde(default, skip_serializing_if = "Vec::is_empty")]
8510
8515
  timeseries_columns: Vec<Identifier>,
@@ -8520,6 +8525,9 @@ pub enum TableConstraint {
8520
8525
  Unique {
8521
8526
  name: Option<Identifier>,
8522
8527
  columns: Vec<Identifier>,
8528
+ /// Structured quoted, prefixed or ordered keys, as for `PrimaryKey`.
8529
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
8530
+ key_parts: Vec<IndexKeyPart>,
8523
8531
  /// Whether columns are parenthesized (false for UNIQUE idx_name without parens)
8524
8532
  #[serde(default)]
8525
8533
  columns_parenthesized: bool,
@@ -11676,6 +11684,9 @@ pub struct Lateral {
11676
11684
  /// Column aliases for the lateral expression (e.g., LATERAL func() AS alias(col1, col2))
11677
11685
  #[serde(default, skip_serializing_if = "Vec::is_empty")]
11678
11686
  pub column_aliases: Vec<String>,
11687
+ /// Quoting of each column alias, parallel to `column_aliases`.
11688
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
11689
+ pub column_aliases_quoted: Vec<bool>,
11679
11690
  }
11680
11691
 
11681
11692
  /// TableFromRows