polyglot-sql 0.4.4__tar.gz → 0.5.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 (176) hide show
  1. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/Cargo.lock +5 -5
  2. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/Cargo.toml +1 -1
  3. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/PKG-INFO +1 -1
  4. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/Cargo.toml +1 -1
  5. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/mod.rs +263 -15
  6. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/generator.rs +3 -1
  7. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/lib.rs +1 -1
  8. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/lineage.rs +311 -0
  9. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/scope.rs +28 -0
  10. polyglot_sql-0.5.0/crates/polyglot-sql/tests/issue227_strict_unsupported.rs +181 -0
  11. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/helpers.rs +18 -1
  12. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/transpile.rs +14 -3
  13. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_transpile.py +33 -0
  14. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/README.md +0 -0
  15. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/README.md +0 -0
  16. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
  17. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
  18. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  19. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
  20. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  21. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  22. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  23. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/builder.rs +0 -0
  24. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  25. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  26. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  27. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  28. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  29. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  30. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  31. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  32. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  33. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  34. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
  35. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  36. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  37. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  38. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  39. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  40. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  41. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  42. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  43. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  44. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
  45. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  46. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  47. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  48. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  49. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  50. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  51. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  52. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  53. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  54. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  55. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  56. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  57. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  58. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/diff.rs +0 -0
  59. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/error.rs +0 -0
  60. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/expressions.rs +0 -0
  61. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  62. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
  63. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/helper.rs +0 -0
  64. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/openlineage.rs +0 -0
  65. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
  66. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  67. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  68. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  69. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  70. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  71. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  72. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  73. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  74. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  75. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  76. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  77. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  78. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  79. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  80. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  81. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/parser.rs +0 -0
  82. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/planner.rs +0 -0
  83. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/resolver.rs +0 -0
  84. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/schema.rs +0 -0
  85. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/time.rs +0 -0
  86. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/tokens.rs +0 -0
  87. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/transforms.rs +0 -0
  88. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/traversal.rs +0 -0
  89. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/trie.rs +0 -0
  90. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/validation/tests.rs +0 -0
  91. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/src/validation.rs +0 -0
  92. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  93. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  94. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
  95. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  96. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  97. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  98. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  99. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  100. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  101. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  102. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  103. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  104. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  105. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  106. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  107. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  108. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  109. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  110. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
  111. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
  112. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  113. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  114. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  115. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  116. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/issue201_regression_test.rs +0 -0
  117. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/issue210_regression_test.rs +0 -0
  118. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  119. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  120. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  121. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  122. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  123. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  124. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  125. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  126. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  127. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  128. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  129. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  130. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  131. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  132. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/README.md +0 -0
  133. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  134. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  135. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  136. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  137. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  138. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
  139. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/README.md +0 -0
  140. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/docs/api.md +0 -0
  141. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/docs/index.md +0 -0
  142. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  143. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  144. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  145. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
  146. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/errors.rs +0 -0
  147. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
  148. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  149. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/format.rs +0 -0
  150. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
  151. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/lib.rs +0 -0
  152. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  153. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  154. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  155. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/parse.rs +0 -0
  156. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  157. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  158. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/types.rs +0 -0
  159. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/src/validate.rs +0 -0
  160. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  161. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  162. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  163. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  164. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  165. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  166. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  167. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  168. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  169. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  170. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  171. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  172. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/crates/polyglot-sql-python/uv.lock +0 -0
  173. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/pyproject.toml +0 -0
  174. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/python/polyglot_sql/__init__.py +0 -0
  175. {polyglot_sql-0.4.4 → polyglot_sql-0.5.0}/python/polyglot_sql/__init__.pyi +0 -0
  176. {polyglot_sql-0.4.4 → polyglot_sql-0.5.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.4.4"
608
+ version = "0.5.0"
609
609
  dependencies = [
610
610
  "criterion",
611
611
  "once_cell",
@@ -621,7 +621,7 @@ dependencies = [
621
621
 
622
622
  [[package]]
623
623
  name = "polyglot-sql-ffi"
624
- version = "0.4.4"
624
+ version = "0.5.0"
625
625
  dependencies = [
626
626
  "cbindgen",
627
627
  "polyglot-sql",
@@ -631,11 +631,11 @@ dependencies = [
631
631
 
632
632
  [[package]]
633
633
  name = "polyglot-sql-function-catalogs"
634
- version = "0.4.4"
634
+ version = "0.5.0"
635
635
 
636
636
  [[package]]
637
637
  name = "polyglot-sql-python"
638
- version = "0.4.4"
638
+ version = "0.5.0"
639
639
  dependencies = [
640
640
  "polyglot-sql",
641
641
  "pyo3",
@@ -646,7 +646,7 @@ dependencies = [
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-wasm"
649
- version = "0.4.4"
649
+ version = "0.5.0"
650
650
  dependencies = [
651
651
  "console_error_panic_hook",
652
652
  "js-sys",
@@ -6,7 +6,7 @@ exclude = [
6
6
  ]
7
7
 
8
8
  [workspace.package]
9
- version = "0.4.4"
9
+ version = "0.5.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.4.4
3
+ Version: 0.5.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -106,7 +106,7 @@ thiserror = { workspace = true }
106
106
  unicode-segmentation = { workspace = true }
107
107
  stacker = { version = "0.1", optional = true }
108
108
  ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
109
- polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.4.4", optional = true, default-features = false }
109
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.5.0", optional = true, default-features = false }
110
110
 
111
111
  [dev-dependencies]
112
112
  pretty_assertions = "1.4"
@@ -168,12 +168,16 @@ use crate::expressions::{ColumnConstraint, Function, Identifier, Literal};
168
168
  feature = "semantic"
169
169
  ))]
170
170
  use crate::expressions::{From, FunctionBody, Join, Null, OrderBy, OutputClause, TableRef, With};
171
+ #[cfg(feature = "transpile")]
172
+ use crate::generator::UnsupportedLevel;
171
173
  #[cfg(feature = "generate")]
172
174
  use crate::generator::{Generator, GeneratorConfig};
173
175
  use crate::parser::Parser;
174
176
  #[cfg(feature = "transpile")]
175
177
  use crate::tokens::TokenType;
176
178
  use crate::tokens::{Token, Tokenizer, TokenizerConfig};
179
+ #[cfg(feature = "transpile")]
180
+ use crate::traversal::ExpressionWalk;
177
181
  use serde::{Deserialize, Serialize};
178
182
  use std::collections::HashMap;
179
183
  use std::sync::{Arc, LazyLock, RwLock};
@@ -3730,19 +3734,60 @@ pub struct Dialect {
3730
3734
  /// The struct derives `Serialize`/`Deserialize` using camelCase field names so
3731
3735
  /// it can be round-tripped over JSON bridges (C FFI, WASM) without mapping.
3732
3736
  #[cfg(feature = "transpile")]
3733
- #[derive(Debug, Clone, Default, Serialize, Deserialize)]
3737
+ #[derive(Debug, Clone, Serialize, Deserialize)]
3734
3738
  #[serde(rename_all = "camelCase", default)]
3735
3739
  #[non_exhaustive]
3736
3740
  pub struct TranspileOptions {
3737
3741
  /// Whether to pretty-print the output SQL.
3738
3742
  pub pretty: bool,
3743
+ /// How unsupported target-dialect constructs should be handled.
3744
+ ///
3745
+ /// The default is [`UnsupportedLevel::Warn`], which preserves the current
3746
+ /// compatibility behavior and continues transpilation.
3747
+ pub unsupported_level: UnsupportedLevel,
3748
+ /// Maximum number of unsupported diagnostics to include in raised errors.
3749
+ pub max_unsupported: usize,
3750
+ }
3751
+
3752
+ #[cfg(feature = "transpile")]
3753
+ impl Default for TranspileOptions {
3754
+ fn default() -> Self {
3755
+ Self {
3756
+ pretty: false,
3757
+ unsupported_level: UnsupportedLevel::Warn,
3758
+ max_unsupported: 3,
3759
+ }
3760
+ }
3739
3761
  }
3740
3762
 
3741
3763
  #[cfg(feature = "transpile")]
3742
3764
  impl TranspileOptions {
3743
3765
  /// Construct options with pretty-printing enabled.
3744
3766
  pub fn pretty() -> Self {
3745
- Self { pretty: true }
3767
+ Self {
3768
+ pretty: true,
3769
+ ..Default::default()
3770
+ }
3771
+ }
3772
+
3773
+ /// Construct options that raise when known unsupported constructs remain.
3774
+ pub fn strict() -> Self {
3775
+ Self {
3776
+ unsupported_level: UnsupportedLevel::Raise,
3777
+ ..Default::default()
3778
+ }
3779
+ }
3780
+
3781
+ /// Set how unsupported target-dialect constructs should be handled.
3782
+ pub fn with_unsupported_level(mut self, level: UnsupportedLevel) -> Self {
3783
+ self.unsupported_level = level;
3784
+ self
3785
+ }
3786
+
3787
+ /// Set the maximum number of unsupported diagnostics to include in raised errors.
3788
+ pub fn with_max_unsupported(mut self, max: usize) -> Self {
3789
+ self.max_unsupported = max;
3790
+ self
3746
3791
  }
3747
3792
  }
3748
3793
 
@@ -3956,6 +4001,23 @@ impl Dialect {
3956
4001
  generator.generate(expr)
3957
4002
  }
3958
4003
 
4004
+ /// Generate SQL from an expression with source dialect and transpile options.
4005
+ #[cfg(all(feature = "generate", feature = "transpile"))]
4006
+ fn generate_with_transpile_options(
4007
+ &self,
4008
+ expr: &Expression,
4009
+ source: DialectType,
4010
+ opts: &TranspileOptions,
4011
+ ) -> Result<String> {
4012
+ let mut config = self.get_config_for_expr(expr);
4013
+ config.source_dialect = Some(source);
4014
+ config.pretty = opts.pretty;
4015
+ config.unsupported_level = opts.unsupported_level;
4016
+ config.max_unsupported = opts.max_unsupported.max(1);
4017
+ let mut generator = Generator::with_config(config);
4018
+ generator.generate(expr)
4019
+ }
4020
+
3959
4021
  /// Generate SQL from an expression with forced identifier quoting (identify=True)
3960
4022
  #[cfg(feature = "generate")]
3961
4023
  pub fn generate_with_identify(&self, expr: &Expression) -> Result<String> {
@@ -4232,7 +4294,7 @@ impl Dialect {
4232
4294
  target: T,
4233
4295
  opts: TranspileOptions,
4234
4296
  ) -> Result<Vec<String>> {
4235
- target.with_dialect(|td| self.transpile_inner(sql, td, opts.pretty))
4297
+ target.with_dialect(|td| self.transpile_inner(sql, td, &opts))
4236
4298
  }
4237
4299
 
4238
4300
  #[cfg(feature = "transpile")]
@@ -4240,7 +4302,7 @@ impl Dialect {
4240
4302
  &self,
4241
4303
  sql: &str,
4242
4304
  target_dialect: &Dialect,
4243
- pretty: bool,
4305
+ opts: &TranspileOptions,
4244
4306
  ) -> Result<Vec<String>> {
4245
4307
  let target = target_dialect.dialect_type;
4246
4308
  if matches!(self.dialect_type, DialectType::PostgreSQL)
@@ -4256,11 +4318,8 @@ impl Dialect {
4256
4318
  return expressions
4257
4319
  .into_iter()
4258
4320
  .map(|expr| {
4259
- if pretty {
4260
- target_dialect.generate_pretty_with_source(&expr, self.dialect_type)
4261
- } else {
4262
- target_dialect.generate_with_source(&expr, self.dialect_type)
4263
- }
4321
+ Self::reject_strict_unsupported(&expr, self.dialect_type, target, opts)?;
4322
+ target_dialect.generate_with_transpile_options(&expr, self.dialect_type, opts)
4264
4323
  })
4265
4324
  .collect();
4266
4325
  }
@@ -4744,14 +4803,16 @@ impl Dialect {
4744
4803
  transformed
4745
4804
  };
4746
4805
 
4747
- let mut sql = if pretty {
4748
- target_dialect.generate_pretty_with_source(&transformed, self.dialect_type)?
4749
- } else {
4750
- target_dialect.generate_with_source(&transformed, self.dialect_type)?
4751
- };
4806
+ Self::reject_strict_unsupported(&transformed, self.dialect_type, target, opts)?;
4807
+
4808
+ let mut sql = target_dialect.generate_with_transpile_options(
4809
+ &transformed,
4810
+ self.dialect_type,
4811
+ opts,
4812
+ )?;
4752
4813
 
4753
4814
  // Align a known Snowflake pretty-print edge case with Python sqlglot output.
4754
- if pretty && target == DialectType::Snowflake {
4815
+ if opts.pretty && target == DialectType::Snowflake {
4755
4816
  sql = Self::normalize_snowflake_pretty(sql);
4756
4817
  }
4757
4818
 
@@ -4764,6 +4825,193 @@ impl Dialect {
4764
4825
  // Transpile-only methods: cross-dialect normalization and helpers
4765
4826
  #[cfg(feature = "transpile")]
4766
4827
  impl Dialect {
4828
+ fn reject_strict_unsupported(
4829
+ expr: &Expression,
4830
+ source: DialectType,
4831
+ target: DialectType,
4832
+ opts: &TranspileOptions,
4833
+ ) -> Result<()> {
4834
+ if !matches!(
4835
+ opts.unsupported_level,
4836
+ UnsupportedLevel::Raise | UnsupportedLevel::Immediate
4837
+ ) {
4838
+ return Ok(());
4839
+ }
4840
+
4841
+ let mut diagnostics = Vec::new();
4842
+
4843
+ for node in expr.dfs() {
4844
+ if matches!(target, DialectType::Fabric | DialectType::Hive)
4845
+ && Self::node_has_recursive_with(node)
4846
+ {
4847
+ Self::push_unsupported_diagnostic(&mut diagnostics, "recursive CTEs");
4848
+ }
4849
+
4850
+ if matches!(target, DialectType::TSQL | DialectType::Fabric)
4851
+ && Self::node_has_lateral(node)
4852
+ {
4853
+ Self::push_unsupported_diagnostic(&mut diagnostics, "LATERAL joins and subqueries");
4854
+ }
4855
+
4856
+ if !Self::target_supports_remaining_unnest(target) && Self::node_is_unnest(node) {
4857
+ Self::push_unsupported_diagnostic(&mut diagnostics, "UNNEST");
4858
+ }
4859
+
4860
+ if !Self::target_supports_remaining_explode(target) && Self::node_is_explode(node) {
4861
+ Self::push_unsupported_diagnostic(&mut diagnostics, "EXPLODE");
4862
+ }
4863
+
4864
+ if Self::target_lacks_array_agg(target) && Self::node_is_array_agg(node) {
4865
+ Self::push_unsupported_diagnostic(&mut diagnostics, "ARRAY_AGG");
4866
+ }
4867
+
4868
+ if matches!(source, DialectType::PostgreSQL | DialectType::CockroachDB)
4869
+ && !matches!(target, DialectType::PostgreSQL | DialectType::CockroachDB)
4870
+ {
4871
+ if Self::node_is_function_named(node, "JSONB_BUILD_OBJECT") {
4872
+ Self::push_unsupported_diagnostic(
4873
+ &mut diagnostics,
4874
+ "PostgreSQL JSONB_BUILD_OBJECT",
4875
+ );
4876
+ }
4877
+ if Self::node_is_function_named(node, "TO_TSVECTOR") {
4878
+ Self::push_unsupported_diagnostic(&mut diagnostics, "PostgreSQL TO_TSVECTOR");
4879
+ }
4880
+ }
4881
+
4882
+ if opts.unsupported_level == UnsupportedLevel::Immediate && !diagnostics.is_empty() {
4883
+ break;
4884
+ }
4885
+ }
4886
+
4887
+ if diagnostics.is_empty() {
4888
+ return Ok(());
4889
+ }
4890
+
4891
+ let limit = if opts.unsupported_level == UnsupportedLevel::Immediate {
4892
+ 1
4893
+ } else {
4894
+ opts.max_unsupported.max(1)
4895
+ };
4896
+ let mut messages = diagnostics.iter().take(limit).cloned().collect::<Vec<_>>();
4897
+ if diagnostics.len() > limit {
4898
+ messages.push(format!("... and {} more", diagnostics.len() - limit));
4899
+ }
4900
+
4901
+ Err(crate::error::Error::unsupported(
4902
+ messages.join("; "),
4903
+ target.to_string(),
4904
+ ))
4905
+ }
4906
+
4907
+ fn push_unsupported_diagnostic(diagnostics: &mut Vec<String>, message: &str) {
4908
+ if !diagnostics.iter().any(|existing| existing == message) {
4909
+ diagnostics.push(message.to_string());
4910
+ }
4911
+ }
4912
+
4913
+ fn node_has_recursive_with(expr: &Expression) -> bool {
4914
+ fn recursive(with: &Option<With>) -> bool {
4915
+ with.as_ref().is_some_and(|with| with.recursive)
4916
+ }
4917
+
4918
+ match expr {
4919
+ Expression::With(with) => with.recursive,
4920
+ Expression::Select(select) => recursive(&select.with),
4921
+ Expression::Union(union) => recursive(&union.with),
4922
+ Expression::Intersect(intersect) => recursive(&intersect.with),
4923
+ Expression::Except(except) => recursive(&except.with),
4924
+ Expression::Pivot(pivot) => recursive(&pivot.with),
4925
+ Expression::Insert(insert) => recursive(&insert.with),
4926
+ Expression::Update(update) => recursive(&update.with),
4927
+ Expression::Delete(delete) => recursive(&delete.with),
4928
+ _ => false,
4929
+ }
4930
+ }
4931
+
4932
+ fn node_has_lateral(expr: &Expression) -> bool {
4933
+ fn joins_have_lateral(joins: &[Join]) -> bool {
4934
+ joins.iter().any(|join| {
4935
+ matches!(
4936
+ join.kind,
4937
+ crate::expressions::JoinKind::Lateral
4938
+ | crate::expressions::JoinKind::LeftLateral
4939
+ )
4940
+ })
4941
+ }
4942
+
4943
+ match expr {
4944
+ Expression::Subquery(subquery) => subquery.lateral,
4945
+ Expression::Lateral(_) | Expression::LateralView(_) => true,
4946
+ Expression::Join(join) => matches!(
4947
+ join.kind,
4948
+ crate::expressions::JoinKind::Lateral | crate::expressions::JoinKind::LeftLateral
4949
+ ),
4950
+ Expression::Select(select) => {
4951
+ !select.lateral_views.is_empty() || joins_have_lateral(&select.joins)
4952
+ }
4953
+ Expression::JoinedTable(joined) => {
4954
+ !joined.lateral_views.is_empty() || joins_have_lateral(&joined.joins)
4955
+ }
4956
+ Expression::Update(update) => {
4957
+ joins_have_lateral(&update.table_joins) || joins_have_lateral(&update.from_joins)
4958
+ }
4959
+ _ => false,
4960
+ }
4961
+ }
4962
+
4963
+ fn target_supports_remaining_unnest(target: DialectType) -> bool {
4964
+ matches!(
4965
+ target,
4966
+ DialectType::PostgreSQL
4967
+ | DialectType::BigQuery
4968
+ | DialectType::DuckDB
4969
+ | DialectType::Presto
4970
+ | DialectType::Trino
4971
+ | DialectType::Athena
4972
+ )
4973
+ }
4974
+
4975
+ fn target_supports_remaining_explode(target: DialectType) -> bool {
4976
+ matches!(
4977
+ target,
4978
+ DialectType::Spark | DialectType::Databricks | DialectType::Hive
4979
+ )
4980
+ }
4981
+
4982
+ fn target_lacks_array_agg(target: DialectType) -> bool {
4983
+ matches!(
4984
+ target,
4985
+ DialectType::Fabric
4986
+ | DialectType::TSQL
4987
+ | DialectType::MySQL
4988
+ | DialectType::SQLite
4989
+ | DialectType::Oracle
4990
+ )
4991
+ }
4992
+
4993
+ fn node_is_unnest(expr: &Expression) -> bool {
4994
+ matches!(expr, Expression::Unnest(_)) || Self::node_is_function_named(expr, "UNNEST")
4995
+ }
4996
+
4997
+ fn node_is_explode(expr: &Expression) -> bool {
4998
+ matches!(expr, Expression::Explode(_) | Expression::ExplodeOuter(_))
4999
+ || Self::node_is_function_named(expr, "EXPLODE")
5000
+ || Self::node_is_function_named(expr, "EXPLODE_OUTER")
5001
+ }
5002
+
5003
+ fn node_is_array_agg(expr: &Expression) -> bool {
5004
+ matches!(expr, Expression::ArrayAgg(_)) || Self::node_is_function_named(expr, "ARRAY_AGG")
5005
+ }
5006
+
5007
+ fn node_is_function_named(expr: &Expression, name: &str) -> bool {
5008
+ match expr {
5009
+ Expression::Function(function) => function.name.eq_ignore_ascii_case(name),
5010
+ Expression::AggregateFunction(function) => function.name.eq_ignore_ascii_case(name),
5011
+ _ => false,
5012
+ }
5013
+ }
5014
+
4767
5015
  fn rewrite_boolean_values_for_tsql(expr: Expression) -> Result<Expression> {
4768
5016
  match expr {
4769
5017
  Expression::Select(select) => Self::rewrite_boolean_values_in_tsql_select(select),
@@ -16,6 +16,7 @@ use std::sync::Arc;
16
16
  use crate::error::Result;
17
17
  use crate::expressions::*;
18
18
  use crate::DialectType;
19
+ use serde::{Deserialize, Serialize};
19
20
 
20
21
  /// SQL code generator that converts an AST (`Expression`) back into a SQL string.
21
22
  ///
@@ -99,7 +100,8 @@ pub enum NotInStyle {
99
100
  }
100
101
 
101
102
  /// Controls how the generator reacts when it encounters unsupported output.
102
- #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
103
+ #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
104
+ #[serde(rename_all = "lowercase")]
103
105
  pub enum UnsupportedLevel {
104
106
  /// Ignore unsupported diagnostics and continue generation.
105
107
  Ignore,
@@ -78,7 +78,7 @@ pub use function_catalog::{
78
78
  FunctionCatalog, FunctionNameCase, FunctionSignature, HashMapFunctionCatalog,
79
79
  };
80
80
  #[cfg(feature = "generate")]
81
- pub use generator::Generator;
81
+ pub use generator::{Generator, UnsupportedLevel};
82
82
  #[cfg(feature = "semantic")]
83
83
  pub use helper::{
84
84
  csv, find_new_name, is_date_unit, is_float, is_int, is_iso_date, is_iso_datetime, merge_ranges,