polyglot-sql-chio 0.12.0__tar.gz → 0.12.2__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 (215) hide show
  1. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/Cargo.lock +6 -6
  2. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/Cargo.toml +1 -1
  3. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/PKG-INFO +1 -1
  4. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/Cargo.toml +2 -2
  5. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/README.md +4 -4
  6. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/duckdb.rs +173 -0
  7. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +25 -5
  8. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/mod.rs +24 -0
  9. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/operators.rs +76 -0
  10. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/generator.rs +14 -1
  11. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/lib.rs +6 -5
  12. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/lineage.rs +342 -59
  13. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/annotate_types.rs +402 -30
  14. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/mod.rs +2 -0
  15. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +1 -1
  16. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +7 -3
  17. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +137 -4
  18. polyglot_sql_chio-0.12.2/crates/polyglot-sql/src/optimizer/set_operation_types.rs +1182 -0
  19. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/query_analysis/column_uses.rs +121 -19
  20. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/query_analysis.rs +1424 -146
  21. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/scope.rs +67 -9
  22. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/validation/tests.rs +50 -0
  23. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/validation.rs +200 -77
  24. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/common/known_failures.rs +12 -0
  25. polyglot_sql_chio-0.12.2/crates/polyglot-sql/tests/qualify_tables.rs +26 -0
  26. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/query_analysis.rs +903 -2
  27. polyglot_sql_chio-0.12.2/crates/polyglot-sql/tests/query_analysis_regression.rs +406 -0
  28. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/README.md +1 -1
  29. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_query_analysis.py +21 -0
  30. polyglot_sql_chio-0.12.0/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -201
  31. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/README.md +0 -0
  32. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  33. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  34. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/in_list.rs +0 -0
  35. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/lineage.rs +0 -0
  36. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/parsing.rs +0 -0
  37. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
  38. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  39. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/benches/transpile.rs +0 -0
  40. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  41. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  42. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/ast_children.rs +0 -0
  43. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/ast_json.rs +0 -0
  44. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
  45. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  46. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/binding.rs +0 -0
  47. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/builder/mod.rs +0 -0
  48. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  49. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  50. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  51. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  52. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  53. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  54. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  55. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  56. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  57. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  58. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  59. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  60. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  61. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  62. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  63. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  64. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  65. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/mod.rs +0 -0
  66. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  67. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  68. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  69. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  70. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
  71. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
  72. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
  73. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  74. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  75. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  76. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
  77. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  78. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  79. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  80. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  81. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  82. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  83. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  84. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  85. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  86. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  87. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  88. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  89. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  90. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/diff.rs +0 -0
  91. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/error.rs +0 -0
  92. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/expressions.rs +0 -0
  93. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/format_tokens.rs +0 -0
  94. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  95. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/function_registry.rs +0 -0
  96. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/guard.rs +0 -0
  97. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/helper.rs +0 -0
  98. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/openlineage.rs +0 -0
  99. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  100. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  101. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  102. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  103. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  104. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  105. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  106. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  107. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  108. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  109. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  110. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/parser.rs +0 -0
  111. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/planner.rs +0 -0
  112. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/resolver.rs +0 -0
  113. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/schema.rs +0 -0
  114. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/set_operation.rs +0 -0
  115. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/time.rs +0 -0
  116. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/tokens.rs +0 -0
  117. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/transforms.rs +0 -0
  118. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/traversal.rs +0 -0
  119. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/trie.rs +0 -0
  120. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/src/validation/semantics.rs +0 -0
  121. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  122. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  123. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  124. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  125. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  126. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  127. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  128. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  129. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  130. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  131. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  132. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  133. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  134. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  135. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  136. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  137. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  138. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  139. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
  140. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
  141. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
  142. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  143. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  144. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  145. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  146. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  147. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  148. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  149. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  150. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  151. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  152. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  153. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  154. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  155. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  156. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  157. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  158. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  159. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  160. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  161. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  162. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  163. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  164. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  165. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  166. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  167. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  168. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  169. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  170. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/Cargo.toml +0 -0
  171. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/README.md +0 -0
  172. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/docs/api.md +0 -0
  173. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/docs/index.md +0 -0
  174. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  175. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  176. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/builders.rs +0 -0
  177. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  178. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/diff.rs +0 -0
  179. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/errors.rs +0 -0
  180. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/expr.rs +0 -0
  181. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  182. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/format.rs +0 -0
  183. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/generate.rs +0 -0
  184. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  185. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/lib.rs +0 -0
  186. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  187. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  188. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  189. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/parse.rs +0 -0
  190. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
  191. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  192. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  193. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  194. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/types.rs +0 -0
  195. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/src/validate.rs +0 -0
  196. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  197. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  198. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  199. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  200. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  201. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  202. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  203. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  204. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  205. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  206. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  207. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  208. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  209. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  210. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/crates/polyglot-sql-python/uv.lock +0 -0
  211. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/pyproject.toml +0 -0
  212. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/python/polyglot_sql/__init__.py +0 -0
  213. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/python/polyglot_sql/__init__.pyi +0 -0
  214. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/python/polyglot_sql/analysis_types.py +0 -0
  215. {polyglot_sql_chio-0.12.0 → polyglot_sql_chio-0.12.2}/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.12.0"
608
+ version = "0.12.2"
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.12.0"
626
+ version = "0.12.2"
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.12.0"
635
+ version = "0.12.2"
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.12.0"
645
+ version = "0.12.2"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.12.0"
649
+ version = "0.12.2"
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.12.0"
660
+ version = "0.12.2"
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.12.0"
9
+ version = "0.12.2"
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-chio
3
- Version: 0.12.0
3
+ Version: 0.12.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -100,14 +100,14 @@ function-catalog-all-dialects = [
100
100
  ]
101
101
 
102
102
  [dependencies]
103
- polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.12.0" }
103
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.12.2" }
104
104
  serde = { workspace = true }
105
105
  serde_json = { workspace = true }
106
106
  thiserror = { workspace = true }
107
107
  unicode-segmentation = { workspace = true }
108
108
  stacker = { version = "0.1", optional = true }
109
109
  ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
110
- polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.12.0", optional = true, default-features = false }
110
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.12.2", optional = true, default-features = false }
111
111
 
112
112
  [dev-dependencies]
113
113
  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.12.0", default-features = false }
28
+ polyglot-sql = { version = "0.12.2", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.12.0",
33
+ version = "0.12.2",
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.12.0",
47
+ version = "0.12.2",
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.12.0",
54
+ version = "0.12.2",
55
55
  default-features = false,
56
56
  features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
57
57
  }
@@ -7513,6 +7513,179 @@ mod tests {
7513
7513
  result[0].clone()
7514
7514
  }
7515
7515
 
7516
+ #[test]
7517
+ fn test_athena_max_by_preserves_filter() {
7518
+ let sql = "SELECT max_by(value,seq) FILTER (WHERE keep) AS answer FROM (VALUES ('kept',1,true),('ignored',2,false)) t(value,seq,keep)";
7519
+ assert_eq!(
7520
+ transpile_to_duckdb_from(sql, DialectType::Athena),
7521
+ "SELECT ARG_MAX_NULL(value, seq) FILTER(WHERE keep) AS answer FROM (VALUES ('kept', 1, TRUE), ('ignored', 2, FALSE)) AS t(value, seq, keep)"
7522
+ );
7523
+
7524
+ for read in [DialectType::Athena, DialectType::Presto, DialectType::Trino] {
7525
+ for (source, target) in [("MAX_BY", "ARG_MAX"), ("MIN_BY", "ARG_MIN")] {
7526
+ for args in ["value, seq", "value, seq, 2"] {
7527
+ let target = if args == "value, seq" {
7528
+ format!("{target}_NULL")
7529
+ } else {
7530
+ target.to_string()
7531
+ };
7532
+ for suffix in ["", " OVER (PARTITION BY category)"] {
7533
+ let sql =
7534
+ format!("SELECT {source}({args}) FILTER (WHERE keep){suffix} FROM t");
7535
+ assert_eq!(
7536
+ transpile_to_duckdb_from(&sql, read),
7537
+ format!("SELECT {target}({args}) FILTER(WHERE keep){suffix} FROM t"),
7538
+ "{read:?}: {sql}"
7539
+ );
7540
+ }
7541
+ }
7542
+ }
7543
+ }
7544
+ }
7545
+
7546
+ #[test]
7547
+ fn test_athena_max_by_preserves_null_winner() {
7548
+ for read in [DialectType::Athena, DialectType::Presto, DialectType::Trino] {
7549
+ for (source, target) in [("MAX_BY", "ARG_MAX_NULL"), ("MIN_BY", "ARG_MIN_NULL")] {
7550
+ let sql = format!(
7551
+ "SELECT {source}(value, seq) AS answer FROM (VALUES ('older', 1), (CAST(NULL AS VARCHAR), 2)) t(value, seq)"
7552
+ );
7553
+ assert_eq!(
7554
+ transpile_to_duckdb_from(&sql, read),
7555
+ format!("SELECT {target}(value, seq) AS answer FROM (VALUES ('older', 1), (CAST(NULL AS TEXT), 2)) AS t(value, seq)"),
7556
+ "{read:?}: {sql}"
7557
+ );
7558
+ assert_eq!(
7559
+ transpile_to_duckdb_from(
7560
+ &format!("SELECT {source}(DISTINCT value, seq) FILTER (WHERE keep) FROM t"),
7561
+ read,
7562
+ ),
7563
+ format!("SELECT {target}(DISTINCT value, seq) FILTER(WHERE keep) FROM t")
7564
+ );
7565
+ }
7566
+ }
7567
+
7568
+ // DuckDB's native aliases intentionally skip NULL values.
7569
+ for (source, target) in [("MAX_BY", "ARG_MAX"), ("MIN_BY", "ARG_MIN")] {
7570
+ assert_eq!(
7571
+ transpile_to_duckdb_from(
7572
+ &format!("SELECT {source}(value, seq) FROM t"),
7573
+ DialectType::DuckDB,
7574
+ ),
7575
+ format!("SELECT {target}(value, seq) FROM t")
7576
+ );
7577
+ }
7578
+ }
7579
+
7580
+ #[test]
7581
+ fn test_athena_regexp_extract_preserves_null_and_empty_matches() {
7582
+ for read in [DialectType::Athena, DialectType::Presto, DialectType::Trino] {
7583
+ for args in [
7584
+ "'no-match', '([0-9]+)', 1",
7585
+ "'abc', '(z*)a', 1",
7586
+ "'abc', '(z)?a', 1",
7587
+ "'abc', '(a)(b)(c)'",
7588
+ "'abc', '(a)(b)(c)', 2",
7589
+ "'12 34', '[0-9]+'",
7590
+ "'', '()'",
7591
+ "NULL, '([0-9]+)', 1",
7592
+ "'abc', NULL, 1",
7593
+ "value, pattern, group_index",
7594
+ ] {
7595
+ assert_eq!(
7596
+ transpile_to_duckdb_from(
7597
+ &format!("SELECT REGEXP_EXTRACT({args}) AS answer"),
7598
+ read,
7599
+ ),
7600
+ format!("SELECT ARRAY_EXTRACT(REGEXP_EXTRACT_ALL({args}), 1) AS answer"),
7601
+ "{read:?}: {args}"
7602
+ );
7603
+ }
7604
+ }
7605
+
7606
+ assert_eq!(
7607
+ transpile_to_duckdb_from(
7608
+ "SELECT REGEXP_EXTRACT('no-match', '([0-9]+)', 1)",
7609
+ DialectType::DuckDB,
7610
+ ),
7611
+ "SELECT REGEXP_EXTRACT('no-match', '([0-9]+)', 1)"
7612
+ );
7613
+ }
7614
+
7615
+ #[test]
7616
+ fn test_athena_regexp_replace_capture_references() {
7617
+ for read in [DialectType::Athena, DialectType::Presto, DialectType::Trino] {
7618
+ for (sql, expected) in [
7619
+ (
7620
+ "SELECT regexp_replace('2026.09 2027.10', '([0-9]+)[.]([0-9]+)', '$1-$2') AS answer",
7621
+ r"SELECT REGEXP_REPLACE('2026.09 2027.10', '([0-9]+)[.]([0-9]+)', '\1-\2', 'g') AS answer",
7622
+ ),
7623
+ (
7624
+ "SELECT regexp_replace(value, pattern, '$0/$1/$2') FROM t",
7625
+ r"SELECT REGEXP_REPLACE(value, pattern, '\0/\1/\2', 'g') FROM t",
7626
+ ),
7627
+ (
7628
+ r"SELECT regexp_replace('aa', '(a)', '\$1')",
7629
+ "SELECT REGEXP_REPLACE('aa', '(a)', '$1', 'g')",
7630
+ ),
7631
+ (
7632
+ "SELECT regexp_replace('a1b2', '[0-9]')",
7633
+ "SELECT REGEXP_REPLACE('a1b2', '[0-9]', '', 'g')",
7634
+ ),
7635
+ (
7636
+ "SELECT regexp_replace('aa', 'a', 'x')",
7637
+ "SELECT REGEXP_REPLACE('aa', 'a', 'x', 'g')",
7638
+ ),
7639
+ ] {
7640
+ assert_eq!(transpile_to_duckdb_from(sql, read), expected, "{read:?}: {sql}");
7641
+ }
7642
+ }
7643
+
7644
+ assert_eq!(
7645
+ transpile_to_duckdb_from(
7646
+ "SELECT REGEXP_REPLACE('aa', '(a)', '$1')",
7647
+ DialectType::DuckDB,
7648
+ ),
7649
+ "SELECT REGEXP_REPLACE('aa', '(a)', '$1')"
7650
+ );
7651
+ }
7652
+
7653
+ #[test]
7654
+ fn test_athena_to_iso8601_reports_unsupported_translation() {
7655
+ for read in [DialectType::Athena, DialectType::Presto, DialectType::Trino] {
7656
+ let dialect = Dialect::get(read);
7657
+ for argument in [
7658
+ "TIMESTAMP '2026-05-26 02:08:02.930'",
7659
+ "TIMESTAMP '2026-05-26 02:08:02.123456789'",
7660
+ "TIMESTAMP '2026-05-26 02:08:02.930 +02:00'",
7661
+ "DATE '2026-05-26'",
7662
+ "CAST(value AS TIMESTAMP(3))",
7663
+ "CAST(value AS TIMESTAMP WITH TIME ZONE)",
7664
+ "value",
7665
+ ] {
7666
+ let sql = format!("SELECT TO_ISO8601({argument}) AS answer FROM t");
7667
+ for options in [
7668
+ crate::dialects::TranspileOptions::default(),
7669
+ crate::dialects::TranspileOptions::strict(),
7670
+ ] {
7671
+ let error = dialect
7672
+ .transpile_with(&sql, DialectType::DuckDB, options)
7673
+ .expect_err("unsupported TO_ISO8601 must not emit invalid DuckDB SQL");
7674
+ assert!(matches!(error, crate::error::Error::Unsupported { .. }));
7675
+ assert!(error.to_string().contains("TO_ISO8601"));
7676
+ assert!(error.to_string().contains("precision and time zone"));
7677
+ }
7678
+ }
7679
+
7680
+ assert_eq!(
7681
+ dialect
7682
+ .transpile("SELECT TO_ISO8601(value) FROM t", read)
7683
+ .unwrap()[0],
7684
+ "SELECT TO_ISO8601(value) FROM t"
7685
+ );
7686
+ }
7687
+ }
7688
+
7516
7689
  #[test]
7517
7690
  fn test_ifnull_to_coalesce() {
7518
7691
  let result = transpile_to_duckdb("SELECT IFNULL(a, b)");
@@ -681,11 +681,31 @@ pub(super) fn rewrite(
681
681
  ))))
682
682
  }
683
683
  DialectType::DuckDB => {
684
- let name = if is_max { "ARG_MAX" } else { "ARG_MIN" };
685
- Ok(Expression::Function(Box::new(Function::new(
686
- name.to_string(),
687
- args,
688
- ))))
684
+ let preserve_null_value = args.len() == 2
685
+ && matches!(
686
+ context.source,
687
+ DialectType::Athena | DialectType::Presto | DialectType::Trino
688
+ );
689
+ // Trino/Presto retain a NULL value when its key wins.
690
+ // DuckDB's ordinary ARG_MAX/ARG_MIN skip such rows.
691
+ let name = match (is_max, preserve_null_value) {
692
+ (true, true) => "ARG_MAX_NULL",
693
+ (false, true) => "ARG_MIN_NULL",
694
+ (true, false) => "ARG_MAX",
695
+ (false, false) => "ARG_MIN",
696
+ };
697
+ // Renaming must retain FILTER and other aggregate modifiers.
698
+ match e {
699
+ Expression::AggregateFunction(mut af) => {
700
+ af.name = name.to_string();
701
+ Ok(Expression::AggregateFunction(af))
702
+ }
703
+ Expression::Function(mut f) => {
704
+ f.name = name.to_string();
705
+ Ok(Expression::Function(f))
706
+ }
707
+ _ => Ok(e),
708
+ }
689
709
  }
690
710
  DialectType::Spark | DialectType::Databricks => {
691
711
  let mut args = args;
@@ -1667,6 +1667,17 @@ pub(super) fn normalize(
1667
1667
  }
1668
1668
  Expression::Function(f) => {
1669
1669
  let name = f.name.to_ascii_uppercase();
1670
+ if name == "TO_ISO8601"
1671
+ && matches!(source, DialectType::Athena | DialectType::Presto | DialectType::Trino)
1672
+ && matches!(target, DialectType::DuckDB)
1673
+ {
1674
+ // DuckDB has no native equivalent. A generic STRFTIME
1675
+ // rewrite loses source precision and per-value time zones.
1676
+ return Err(crate::error::Error::unsupported(
1677
+ "TO_ISO8601 translation preserving source precision and time zone",
1678
+ target.to_string(),
1679
+ ));
1680
+ }
1670
1681
  // DuckDB json(x) is a synonym for CAST(x AS JSON) — parses a string.
1671
1682
  // Map to JSON_PARSE(x) for Trino/Presto/Athena to preserve semantics.
1672
1683
  if matches!(source, DialectType::PostgreSQL)
@@ -1795,6 +1806,19 @@ pub(super) fn normalize(
1795
1806
  // The Redshift parser adds 'UTC' as default source_tz, but when
1796
1807
  // transpiling from other dialects, we should preserve the original form.
1797
1808
  Action::Temporal(temporal::Action::ConvertTimezoneToExpr)
1809
+ } else if matches!(source, DialectType::Athena | DialectType::Presto | DialectType::Trino)
1810
+ && matches!(target, DialectType::DuckDB)
1811
+ && name == "REGEXP_EXTRACT"
1812
+ && matches!(f.args.len(), 2 | 3)
1813
+ {
1814
+ Action::Operators(operators::Action::RegexpExtractPrestoToDuckDB)
1815
+ } else if matches!(source, DialectType::Athena | DialectType::Presto | DialectType::Trino)
1816
+ && matches!(target, DialectType::DuckDB)
1817
+ && name == "REGEXP_REPLACE"
1818
+ && matches!(f.args.len(), 2 | 3)
1819
+ && !matches!(f.args.get(2), Some(Expression::Lambda(_)))
1820
+ {
1821
+ Action::Operators(operators::Action::RegexpReplacePrestoToDuckDB)
1798
1822
  } else if matches!(source, DialectType::Snowflake)
1799
1823
  && matches!(target, DialectType::DuckDB)
1800
1824
  && name == "REGEXP_REPLACE"
@@ -8,6 +8,8 @@ pub(super) enum Action {
8
8
  Div0TypedDivision,
9
9
  SourceDivisionToClickHouse,
10
10
  RegexpReplaceSnowflakeToDuckDB,
11
+ RegexpExtractPrestoToDuckDB,
12
+ RegexpReplacePrestoToDuckDB,
11
13
  BigQuerySafeDivide,
12
14
  RegexpLikeToDuckDB,
13
15
  RegexpLikeToTsqlPatindex,
@@ -47,6 +49,36 @@ pub(super) fn rewrite(
47
49
  let e = expression;
48
50
  let expression = (|| -> Result<Expression> {
49
51
  match action {
52
+ Action::RegexpReplacePrestoToDuckDB => {
53
+ if let Expression::Function(mut f) = e {
54
+ if f.args.len() == 2 {
55
+ f.args.push(Expression::string(""));
56
+ } else if let Expression::Literal(lit) = &f.args[2] {
57
+ if let Literal::String(replacement) = lit.as_ref() {
58
+ f.args[2] = Expression::string(presto_regexp_replacement_to_duckdb(
59
+ replacement,
60
+ )?);
61
+ }
62
+ }
63
+ f.args.push(Expression::string("g"));
64
+ Ok(Expression::Function(f))
65
+ } else {
66
+ unreachable!("action only triggered for REGEXP_REPLACE functions")
67
+ }
68
+ }
69
+ Action::RegexpExtractPrestoToDuckDB => {
70
+ if let Expression::Function(mut f) = e {
71
+ // A missing first match (or capture group) is NULL, while
72
+ // a successful empty capture must remain an empty string.
73
+ f.name = "REGEXP_EXTRACT_ALL".to_string();
74
+ Ok(Expression::Function(Box::new(Function::new(
75
+ "ARRAY_EXTRACT",
76
+ vec![Expression::Function(f), Expression::number(1)],
77
+ ))))
78
+ } else {
79
+ unreachable!("action only triggered for REGEXP_EXTRACT functions")
80
+ }
81
+ }
50
82
  Action::SourceDivisionToClickHouse => {
51
83
  if let Expression::Div(div) = e {
52
84
  normalize_source_division_to_clickhouse(*div, context)
@@ -2223,3 +2255,47 @@ pub(super) fn build_tsql_cbrt_power(this: Expression) -> Expression {
2223
2255
  inferred_type: None,
2224
2256
  }))
2225
2257
  }
2258
+
2259
+ fn presto_regexp_replacement_to_duckdb(replacement: &str) -> Result<String> {
2260
+ let mut chars = replacement.chars().peekable();
2261
+ let mut converted = String::with_capacity(replacement.len());
2262
+ while let Some(ch) = chars.next() {
2263
+ match ch {
2264
+ '\\' => {
2265
+ if let Some(literal) = chars.next() {
2266
+ // Trino quotes the following character; RE2 only needs
2267
+ // quoting for a literal backslash in replacement text.
2268
+ if literal == '\\' {
2269
+ converted.push('\\');
2270
+ }
2271
+ converted.push(literal);
2272
+ } else {
2273
+ return Err(crate::error::Error::unsupported(
2274
+ "REGEXP_REPLACE replacement ends in an escape",
2275
+ "duckdb",
2276
+ ));
2277
+ }
2278
+ }
2279
+ '$' => match chars.next() {
2280
+ Some(group) if group.is_ascii_digit() => {
2281
+ if chars.peek().is_some_and(|ch| ch.is_ascii_digit()) {
2282
+ return Err(crate::error::Error::unsupported(
2283
+ "DuckDB REGEXP_REPLACE does not support multi-digit capture references",
2284
+ "duckdb",
2285
+ ));
2286
+ }
2287
+ converted.push('\\');
2288
+ converted.push(group);
2289
+ }
2290
+ _ => {
2291
+ return Err(crate::error::Error::unsupported(
2292
+ "DuckDB REGEXP_REPLACE requires numbered capture references",
2293
+ "duckdb",
2294
+ ))
2295
+ }
2296
+ },
2297
+ _ => converted.push(ch),
2298
+ }
2299
+ }
2300
+ Ok(converted)
2301
+ }
@@ -2447,6 +2447,18 @@ impl Generator {
2447
2447
  Ok(std::mem::take(&mut self.output))
2448
2448
  }
2449
2449
 
2450
+ /// Render an analysis type without implicit ClickHouse Nullable wrapping.
2451
+ #[cfg(feature = "semantic")]
2452
+ pub(crate) fn generate_type_hint(&mut self, data_type: &DataType) -> Result<String> {
2453
+ // Analysis already models nullability separately. Native ClickHouse
2454
+ // types must acquire Nullable only from an explicit type wrapper.
2455
+ let saved_depth = self.clickhouse_nullable_depth;
2456
+ self.clickhouse_nullable_depth = -1;
2457
+ let result = self.generate(&Expression::DataType(data_type.clone()));
2458
+ self.clickhouse_nullable_depth = saved_depth;
2459
+ result
2460
+ }
2461
+
2450
2462
  /// Returns the unsupported diagnostics collected during the most recent generate call.
2451
2463
  pub fn unsupported_messages(&self) -> &[String] {
2452
2464
  &self.unsupported_messages
@@ -26850,9 +26862,10 @@ impl Generator {
26850
26862
  // ClickHouse: Map(key_type, value_type) with parenthesized syntax
26851
26863
  // Key types must NOT be wrapped in Nullable
26852
26864
  self.write("Map(");
26865
+ let saved_depth = self.clickhouse_nullable_depth;
26853
26866
  self.clickhouse_nullable_depth = -1; // suppress Nullable for key
26854
26867
  self.generate_data_type(key_type)?;
26855
- self.clickhouse_nullable_depth = 0;
26868
+ self.clickhouse_nullable_depth = saved_depth;
26856
26869
  self.write(", ");
26857
26870
  self.generate_data_type(value_type)?;
26858
26871
  self.write(")");
@@ -118,11 +118,12 @@ pub use optimizer::{
118
118
  pub use parser::Parser;
119
119
  #[cfg(all(feature = "semantic", feature = "generate"))]
120
120
  pub use query_analysis::{
121
- analyze_query, AnalyzeQueryOptions, ColumnReferenceFact, ColumnUseContext, ColumnUseFact,
122
- ColumnUseReferenceFact, CteFact, ProjectionFact, ProjectionNullability, QueryAnalysis,
123
- QueryShape, QuerySourceSpan, ReferenceConfidence, RelationFact, SetOperationBranchFact,
124
- SetOperationBranchRole, SetOperationFact, StarProjectionFact, TransformFunctionFact,
125
- TransformKind,
121
+ analyze_query, analyze_query_for_project_projections, compile_query_analysis,
122
+ compile_required_query_analysis, AnalyzeQueryOptions, ColumnReferenceFact, ColumnUseContext,
123
+ ColumnUseFact, ColumnUseReferenceFact, CompiledQueryAnalysis, CteFact, ProjectionFact,
124
+ ProjectionNullability, QueryAnalysis, QueryShape, QuerySourceSpan, ReferenceConfidence,
125
+ RelationFact, SetOperationBranchFact, SetOperationBranchRole, SetOperationFact,
126
+ StarProjectionFact, TransformFunctionFact, TransformKind,
126
127
  };
127
128
  #[cfg(feature = "semantic")]
128
129
  pub use resolver::{is_column_ambiguous, resolve_column, Resolver, ResolverError, ResolverResult};