polyglot-sql 0.6.3__tar.gz → 0.8.0__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 (204) hide show
  1. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/Cargo.lock +6 -6
  2. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/Cargo.toml +1 -1
  3. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/PKG-INFO +14 -1
  4. {polyglot_sql-0.6.3/crates/polyglot-sql-python → polyglot_sql-0.8.0}/README.md +13 -0
  5. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/Cargo.toml +2 -2
  6. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/README.md +11 -4
  7. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/duckdb.rs +9 -9
  8. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/mod.rs +15 -0
  9. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +67 -15
  10. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/collections.rs +5 -1
  11. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/mod.rs +234 -4
  12. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +351 -57
  13. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/statements.rs +140 -0
  14. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +18 -6
  15. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/oracle.rs +2 -0
  16. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/presto.rs +8 -8
  17. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/error.rs +69 -0
  18. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/expressions.rs +6 -0
  19. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/generator.rs +187 -44
  20. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/lib.rs +12 -3
  21. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/lineage.rs +739 -115
  22. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/openlineage.rs +152 -16
  23. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/parser.rs +355 -56
  24. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/query_analysis.rs +33 -3
  25. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/schema.rs +32 -6
  26. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/tokens.rs +24 -12
  27. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/query_analysis.rs +31 -1
  28. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0/crates/polyglot-sql-python}/README.md +13 -0
  29. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/errors.rs +31 -1
  30. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/lib.rs +4 -0
  31. polyglot_sql-0.8.0/crates/polyglot-sql-python/src/lineage.rs +222 -0
  32. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_lineage.py +46 -0
  33. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/python/polyglot_sql/__init__.py +10 -0
  34. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/python/polyglot_sql/__init__.pyi +39 -0
  35. polyglot_sql-0.6.3/crates/polyglot-sql-python/src/lineage.rs +0 -100
  36. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  37. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  38. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
  39. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/lineage.rs +0 -0
  40. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
  41. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
  42. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  43. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
  44. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  45. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  46. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_children.rs +0 -0
  47. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_json.rs +0 -0
  48. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  49. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/builder.rs +0 -0
  50. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  51. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  52. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  53. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  54. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  55. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  56. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  57. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  58. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  59. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  60. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  61. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  62. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  63. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  64. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  65. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  66. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  67. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  68. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
  69. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  70. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  71. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  72. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  73. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  74. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  75. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  76. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  77. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  78. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  79. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  80. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  81. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  82. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  83. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  84. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  85. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/diff.rs +0 -0
  86. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/format_tokens.rs +0 -0
  87. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  88. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
  89. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/guard.rs +0 -0
  90. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/helper.rs +0 -0
  91. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
  92. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  93. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  94. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  95. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  96. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  97. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  98. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  99. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  100. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  101. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  102. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  103. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  104. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  105. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  106. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  107. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/planner.rs +0 -0
  108. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/resolver.rs +0 -0
  109. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/scope.rs +0 -0
  110. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/time.rs +0 -0
  111. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/transforms.rs +0 -0
  112. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/traversal.rs +0 -0
  113. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/trie.rs +0 -0
  114. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/validation/tests.rs +0 -0
  115. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/src/validation.rs +0 -0
  116. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  117. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  118. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
  119. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  120. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  121. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  122. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  123. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  124. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  125. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  126. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  127. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  128. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  129. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  130. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  131. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  132. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  133. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  134. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  135. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
  136. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
  137. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
  138. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  139. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  140. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  141. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  142. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  143. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  144. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  145. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  146. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
  147. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  148. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  149. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  150. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  151. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  152. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  153. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  154. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  155. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  156. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  157. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  158. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  159. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  160. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  161. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  162. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/README.md +0 -0
  163. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  164. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  165. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  166. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  167. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  168. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
  169. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/docs/api.md +0 -0
  170. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/docs/index.md +0 -0
  171. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  172. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  173. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  174. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
  175. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
  176. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  177. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/format.rs +0 -0
  178. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
  179. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  180. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  181. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  182. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/parse.rs +0 -0
  183. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
  184. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  185. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  186. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  187. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/types.rs +0 -0
  188. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/src/validate.rs +0 -0
  189. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  190. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  191. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  192. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  193. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  194. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  195. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  196. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  197. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  198. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
  199. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  200. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  201. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  202. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/crates/polyglot-sql-python/uv.lock +0 -0
  203. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/pyproject.toml +0 -0
  204. {polyglot_sql-0.6.3 → polyglot_sql-0.8.0}/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.6.3"
608
+ version = "0.8.0"
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.6.3"
626
+ version = "0.8.0"
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.6.3"
635
+ version = "0.8.0"
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.6.3"
645
+ version = "0.8.0"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.6.3"
649
+ version = "0.8.0"
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.6.3"
660
+ version = "0.8.0"
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.6.3"
9
+ version = "0.8.0"
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.6.3
3
+ Version: 0.8.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -177,6 +177,13 @@ Function-like projections may include `transformFunction` with the function
177
177
  name, literal arguments, and column arguments, for example for
178
178
  `DATE_TRUNC('month', created_at)`.
179
179
 
180
+ Each `analysis["setOperations"][...]["branches"]` entry includes a `role` of
181
+ `"value"` or `"filter"`. Lineage results attach optional `set_branch` metadata
182
+ to immediate set-operation branch roots with the `operator`, original
183
+ zero-based `ordinal`, and `all` flag; omitted branches do not renumber the
184
+ surviving nodes. In OpenLineage output, `EXCEPT` and `INTERSECT` right-hand
185
+ inputs are emitted as indirect `FILTER` dependencies.
186
+
180
187
  Validation schema dictionaries use:
181
188
 
182
189
  ```python
@@ -222,6 +229,11 @@ All functions are exported from `polyglot_sql`.
222
229
  - `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
223
230
  - `optimize(sql: str, dialect: str = "generic") -> str`
224
231
  - `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
232
+ - `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
233
+ - `lineage_at_with_schema(ordinal: int, sql: str, schema: dict, dialect: str = "generic") -> dict`
234
+ - `lineage_with_schema(column: str, sql: str, schema: dict, dialect: str = "generic") -> dict`
235
+ - `output_columns(sql: str, dialect: str = "generic") -> dict`
236
+ - `output_columns_with_schema(sql: str, schema: dict, dialect: str = "generic") -> dict`
225
237
  - `source_tables(column: str, sql: str, dialect: str = "generic") -> list[str]`
226
238
  - `analyze_query(sql: str, options: dict | None = None, dialect: str = "generic") -> dict`
227
239
  - `openlineage_column_lineage(sql: str, options: dict) -> dict`
@@ -246,6 +258,7 @@ Exception hierarchy:
246
258
  - `GenerateError`
247
259
  - `TranspileError`
248
260
  - `ValidationError`
261
+ - `ColumnResolutionError` (`reason`, `column`, and `ordinal` attributes)
249
262
 
250
263
  Unknown dialect names raise built-in `ValueError`.
251
264
 
@@ -150,6 +150,13 @@ Function-like projections may include `transformFunction` with the function
150
150
  name, literal arguments, and column arguments, for example for
151
151
  `DATE_TRUNC('month', created_at)`.
152
152
 
153
+ Each `analysis["setOperations"][...]["branches"]` entry includes a `role` of
154
+ `"value"` or `"filter"`. Lineage results attach optional `set_branch` metadata
155
+ to immediate set-operation branch roots with the `operator`, original
156
+ zero-based `ordinal`, and `all` flag; omitted branches do not renumber the
157
+ surviving nodes. In OpenLineage output, `EXCEPT` and `INTERSECT` right-hand
158
+ inputs are emitted as indirect `FILTER` dependencies.
159
+
153
160
  Validation schema dictionaries use:
154
161
 
155
162
  ```python
@@ -195,6 +202,11 @@ All functions are exported from `polyglot_sql`.
195
202
  - `validate(sql: str, dialect: str = "generic", *, strict_syntax: bool = False, semantic: bool = False) -> ValidationResult`
196
203
  - `optimize(sql: str, dialect: str = "generic") -> str`
197
204
  - `lineage(column: str, sql: str, dialect: str = "generic") -> dict`
205
+ - `lineage_at(ordinal: int, sql: str, dialect: str = "generic") -> dict`
206
+ - `lineage_at_with_schema(ordinal: int, sql: str, schema: dict, dialect: str = "generic") -> dict`
207
+ - `lineage_with_schema(column: str, sql: str, schema: dict, dialect: str = "generic") -> dict`
208
+ - `output_columns(sql: str, dialect: str = "generic") -> dict`
209
+ - `output_columns_with_schema(sql: str, schema: dict, dialect: str = "generic") -> dict`
198
210
  - `source_tables(column: str, sql: str, dialect: str = "generic") -> list[str]`
199
211
  - `analyze_query(sql: str, options: dict | None = None, dialect: str = "generic") -> dict`
200
212
  - `openlineage_column_lineage(sql: str, options: dict) -> dict`
@@ -219,6 +231,7 @@ Exception hierarchy:
219
231
  - `GenerateError`
220
232
  - `TranspileError`
221
233
  - `ValidationError`
234
+ - `ColumnResolutionError` (`reason`, `column`, and `ordinal` attributes)
222
235
 
223
236
  Unknown dialect names raise built-in `ValueError`.
224
237
 
@@ -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.6.3" }
103
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.8.0" }
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.6.3", optional = true, default-features = false }
110
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.8.0", 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.6.3", default-features = false }
28
+ polyglot-sql = { version = "0.8.0", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.5",
33
+ version = "0.8.0",
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.5",
47
+ version = "0.8.0",
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.5",
54
+ version = "0.8.0",
55
55
  default-features = false,
56
56
  features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
57
57
  }
@@ -332,6 +332,13 @@ and CTE output columns. `star_projections` reports the original top-level star
332
332
  projection index, optional table qualifier, and schema-expanded columns when
333
333
  known. Each projection also includes conservative `nullability`:
334
334
  `non_null`, `nullable`, or `unknown`.
335
+ Each `set_operations` branch includes a semantic `role`: both `UNION` branches
336
+ are `value`, while the right branch of `EXCEPT` and `INTERSECT` is `filter`.
337
+
338
+ Lineage nodes at immediate set-operation branch roots expose optional
339
+ `set_branch` metadata with the operator, original zero-based branch ordinal,
340
+ and `ALL` flag. The ordinal remains stable when another branch cannot be
341
+ resolved.
335
342
 
336
343
  ```rust
337
344
  use polyglot_sql::{
@@ -15,7 +15,7 @@ use crate::expressions::{
15
15
  AggFunc, Alias, BinaryOp, Case, Cast, CeilFunc, Column, DataType, Expression, Function,
16
16
  Identifier, Interval, IntervalUnit, IntervalUnitSpec, IsNull, JSONPath, JSONPathKey,
17
17
  JSONPathRoot, JSONPathSubscript, JsonExtractFunc, Literal, Null, Paren, Struct, Subquery,
18
- SubstringFunc, UnaryFunc, UnaryOp, VarArgFunc, WindowFunction,
18
+ SubstringFunc, UnaryFunc, UnaryOp, Unhex, VarArgFunc, WindowFunction,
19
19
  };
20
20
  #[cfg(feature = "generate")]
21
21
  use crate::generator::GeneratorConfig;
@@ -1687,6 +1687,14 @@ impl DuckDBDialect {
1687
1687
  fn transform_function(&self, f: Function) -> Result<Expression> {
1688
1688
  let name_upper = f.name.to_uppercase();
1689
1689
  match name_upper.as_str() {
1690
+ "FROM_HEX" if f.args.len() == 1 => {
1691
+ let mut args = f.args;
1692
+ Ok(Expression::Unhex(Box::new(Unhex {
1693
+ this: Box::new(args.remove(0)),
1694
+ expression: None,
1695
+ })))
1696
+ }
1697
+
1690
1698
  // IFNULL -> COALESCE
1691
1699
  "IFNULL" if f.args.len() == 2 => Ok(Expression::Coalesce(Box::new(VarArgFunc {
1692
1700
  original_name: None,
@@ -1968,14 +1976,6 @@ impl DuckDBDialect {
1968
1976
  f.args,
1969
1977
  )))),
1970
1978
 
1971
- // NOW -> CURRENT_TIMESTAMP
1972
- "NOW" => Ok(Expression::CurrentTimestamp(
1973
- crate::expressions::CurrentTimestamp {
1974
- precision: None,
1975
- sysdate: false,
1976
- },
1977
- )),
1978
-
1979
1979
  // GETDATE -> CURRENT_TIMESTAMP
1980
1980
  "GETDATE" => Ok(Expression::CurrentTimestamp(
1981
1981
  crate::expressions::CurrentTimestamp {
@@ -580,6 +580,21 @@ fn presto_to_java_format(fmt: &str) -> String {
580
580
  .replace("%M", "MMMM")
581
581
  }
582
582
 
583
+ #[cfg(feature = "transpile")]
584
+ fn presto_to_java_parse_format(fmt: &str) -> String {
585
+ fmt.replace("%Y", "yyyy")
586
+ .replace("%m", "M")
587
+ .replace("%d", "d")
588
+ .replace("%H", "H")
589
+ .replace("%i", "m")
590
+ .replace("%S", "s")
591
+ .replace("%s", "s")
592
+ .replace("%y", "yy")
593
+ .replace("%T", "H:m:s")
594
+ .replace("%F", "yyyy-M-d")
595
+ .replace("%M", "MMMM")
596
+ }
597
+
583
598
  #[cfg(feature = "transpile")]
584
599
  fn normalize_presto_format(fmt: &str) -> String {
585
600
  fmt.replace("%H:%i:%S", "%T").replace("%H:%i:%s", "%T")
@@ -632,12 +632,9 @@ pub(super) fn rewrite(
632
632
 
633
633
  Action::ArrayAggToCollectList => {
634
634
  // ARRAY_AGG(x ORDER BY ...) -> COLLECT_LIST(x) for Hive/Spark
635
- // Python sqlglot Hive.arrayagg_sql strips ORDER BY for simple cases
636
- // but preserves it when DISTINCT/IGNORE NULLS/LIMIT are present
637
635
  match e {
638
636
  Expression::AggregateFunction(mut af) => {
639
- let is_simple =
640
- !af.distinct && af.ignore_nulls.is_none() && af.limit.is_none();
637
+ let preserves_order = af.limit.is_some();
641
638
  let args = if af.args.is_empty() {
642
639
  vec![]
643
640
  } else {
@@ -645,24 +642,23 @@ pub(super) fn rewrite(
645
642
  };
646
643
  af.name = "COLLECT_LIST".to_string();
647
644
  af.args = args;
648
- if is_simple {
645
+ if !preserves_order {
649
646
  af.order_by = Vec::new();
650
647
  }
651
648
  Ok(Expression::AggregateFunction(af))
652
649
  }
653
650
  Expression::ArrayAgg(agg) => {
654
- let is_simple =
655
- !agg.distinct && agg.ignore_nulls.is_none() && agg.limit.is_none();
651
+ let preserves_order = agg.limit.is_some();
656
652
  Ok(Expression::AggregateFunction(Box::new(
657
653
  crate::expressions::AggregateFunction {
658
654
  name: "COLLECT_LIST".to_string(),
659
655
  args: vec![agg.this.clone()],
660
656
  distinct: agg.distinct,
661
657
  filter: agg.filter.clone(),
662
- order_by: if is_simple {
663
- Vec::new()
664
- } else {
658
+ order_by: if preserves_order {
665
659
  agg.order_by.clone()
660
+ } else {
661
+ Vec::new()
666
662
  },
667
663
  limit: agg.limit.clone(),
668
664
  ignore_nulls: agg.ignore_nulls,
@@ -716,14 +712,19 @@ pub(super) fn rewrite(
716
712
  }
717
713
 
718
714
  Action::ArrayAggIgnoreNullsDuckDB => {
719
- // ARRAY_AGG(x IGNORE NULLS ORDER BY a, b DESC) -> ARRAY_AGG(x ORDER BY a NULLS FIRST, b DESC)
720
- // Strip IGNORE NULLS, add NULLS FIRST to first ORDER BY column
715
+ // ARRAY_AGG(x IGNORE NULLS ...) -> ARRAY_AGG(x ...) FILTER(WHERE x IS NOT NULL)
716
+ // DuckDB also needs NULLS FIRST on the first inline ordering expression.
721
717
  let mut agg = if let Expression::ArrayAgg(a) = e {
722
718
  *a
723
719
  } else {
724
720
  unreachable!("action only triggered for ArrayAgg expressions")
725
721
  };
726
- agg.ignore_nulls = None; // Strip IGNORE NULLS
722
+ agg.ignore_nulls = None;
723
+ agg.filter = Some(Expression::IsNull(Box::new(IsNull {
724
+ this: agg.this.clone(),
725
+ not: true,
726
+ postfix_form: false,
727
+ })));
727
728
  if !agg.order_by.is_empty() {
728
729
  agg.order_by[0].nulls_first = Some(true);
729
730
  }
@@ -858,11 +859,19 @@ pub(super) fn rewrite(
858
859
 
859
860
  Action::AggFilterToIff => {
860
861
  // AggFunc.filter -> IFF wrapping: AVG(x) FILTER(WHERE cond) -> AVG(IFF(cond, x, NULL))
862
+ let prefix_not_null = |condition: Expression| match condition {
863
+ Expression::IsNull(mut is_null) if is_null.not => {
864
+ is_null.postfix_form = true;
865
+ Expression::IsNull(is_null)
866
+ }
867
+ other => other,
868
+ };
861
869
  // Helper macro to handle the common AggFunc case
862
870
  macro_rules! handle_agg_filter_to_iff {
863
871
  ($variant:ident, $agg:expr) => {{
864
872
  let mut agg = $agg;
865
873
  if let Some(filter_cond) = agg.filter.take() {
874
+ let filter_cond = prefix_not_null(filter_cond);
866
875
  let iff_call = Expression::Function(Box::new(Function::new(
867
876
  "IFF".to_string(),
868
877
  vec![filter_cond, agg.this.clone(), Expression::Null(Null)],
@@ -878,7 +887,24 @@ pub(super) fn rewrite(
878
887
  Expression::Sum(agg) => handle_agg_filter_to_iff!(Sum, agg),
879
888
  Expression::Min(agg) => handle_agg_filter_to_iff!(Min, agg),
880
889
  Expression::Max(agg) => handle_agg_filter_to_iff!(Max, agg),
881
- Expression::ArrayAgg(agg) => handle_agg_filter_to_iff!(ArrayAgg, agg),
890
+ Expression::ArrayAgg(mut agg) => {
891
+ if let Some(filter_cond) = agg.filter.take() {
892
+ let filter_cond = prefix_not_null(filter_cond);
893
+ agg.this = Expression::Function(Box::new(Function::new(
894
+ "IFF".to_string(),
895
+ vec![filter_cond, agg.this, Expression::Null(Null)],
896
+ )));
897
+ }
898
+ if agg.order_by.is_empty() {
899
+ Ok(Expression::ArrayAgg(agg))
900
+ } else {
901
+ let order_by = std::mem::take(&mut agg.order_by);
902
+ Ok(Expression::WithinGroup(Box::new(WithinGroup {
903
+ this: Expression::ArrayAgg(agg),
904
+ order_by,
905
+ })))
906
+ }
907
+ }
882
908
  Expression::CountIf(agg) => handle_agg_filter_to_iff!(CountIf, agg),
883
909
  Expression::Stddev(agg) => handle_agg_filter_to_iff!(Stddev, agg),
884
910
  Expression::StddevPop(agg) => handle_agg_filter_to_iff!(StddevPop, agg),
@@ -896,7 +922,21 @@ pub(super) fn rewrite(
896
922
  }
897
923
  Expression::Count(mut c) => {
898
924
  if let Some(filter_cond) = c.filter.take() {
899
- if let Some(ref this_expr) = c.this {
925
+ let filter_cond = prefix_not_null(filter_cond);
926
+ let is_star = c.star || matches!(c.this, Some(Expression::Star(_)));
927
+ if is_star {
928
+ return Ok(Expression::CountIf(Box::new(AggFunc {
929
+ this: filter_cond,
930
+ distinct: false,
931
+ filter: None,
932
+ order_by: Vec::new(),
933
+ name: None,
934
+ ignore_nulls: None,
935
+ having_max: None,
936
+ limit: None,
937
+ inferred_type: None,
938
+ })));
939
+ } else if let Some(ref this_expr) = c.this {
900
940
  let iff_call = Expression::Function(Box::new(Function::new(
901
941
  "IFF".to_string(),
902
942
  vec![filter_cond, this_expr.clone(), Expression::Null(Null)],
@@ -906,6 +946,18 @@ pub(super) fn rewrite(
906
946
  }
907
947
  Ok(Expression::Count(c))
908
948
  }
949
+ Expression::AggregateFunction(mut af) => {
950
+ if let Some(filter_cond) = af.filter.take() {
951
+ let filter_cond = prefix_not_null(filter_cond);
952
+ if let Some(first_arg) = af.args.first_mut() {
953
+ *first_arg = Expression::Function(Box::new(Function::new(
954
+ "IFF".to_string(),
955
+ vec![filter_cond, first_arg.clone(), Expression::Null(Null)],
956
+ )));
957
+ }
958
+ }
959
+ Ok(Expression::AggregateFunction(af))
960
+ }
909
961
  other => Ok(other),
910
962
  }
911
963
  }
@@ -862,7 +862,11 @@ pub(super) fn rewrite(
862
862
  }
863
863
 
864
864
  let seq = Expression::Function(Box::new(Function::new(
865
- "SEQUENCE".to_string(),
865
+ if matches!(target, DialectType::BigQuery) {
866
+ "GENERATE_ARRAY".to_string()
867
+ } else {
868
+ "SEQUENCE".to_string()
869
+ },
866
870
  seq_args,
867
871
  )));
868
872