polyglot-sql-chio 0.9.2__tar.gz → 0.9.3__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 (208) hide show
  1. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/Cargo.lock +6 -6
  2. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/Cargo.toml +1 -1
  3. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/PKG-INFO +1 -1
  4. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/Cargo.toml +2 -2
  5. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/README.md +1 -1
  6. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/validation/tests.rs +300 -26
  7. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/validation.rs +145 -10
  8. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/README.md +0 -0
  9. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  10. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  11. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/in_list.rs +0 -0
  12. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/lineage.rs +0 -0
  13. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/parsing.rs +0 -0
  14. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/performance_hotspots.rs +0 -0
  15. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  16. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/benches/transpile.rs +0 -0
  17. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  18. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  19. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_children.rs +0 -0
  20. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_json.rs +0 -0
  21. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  22. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/engine.rs +0 -0
  23. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/mod.rs +0 -0
  24. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  25. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  26. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  27. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  28. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  29. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  30. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  31. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  32. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  33. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  34. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  35. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
  36. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  37. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  38. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  39. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  40. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  41. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  42. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/mod.rs +0 -0
  43. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  44. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
  45. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  46. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  47. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
  48. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
  49. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  50. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
  51. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
  52. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
  53. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  54. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  55. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  56. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
  57. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  58. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  59. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  60. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  61. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  62. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  63. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  64. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  65. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  66. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  67. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  68. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  69. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  70. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/diff.rs +0 -0
  71. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/error.rs +0 -0
  72. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/expressions.rs +0 -0
  73. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/format_tokens.rs +0 -0
  74. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  75. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/function_registry.rs +0 -0
  76. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/generator.rs +0 -0
  77. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/guard.rs +0 -0
  78. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/helper.rs +0 -0
  79. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/lib.rs +0 -0
  80. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/lineage.rs +0 -0
  81. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/openlineage.rs +0 -0
  82. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
  83. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  84. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  85. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  86. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  87. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  88. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  89. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  90. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  91. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  92. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  93. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  94. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  95. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  96. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  97. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  98. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/parser.rs +0 -0
  99. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/planner.rs +0 -0
  100. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/query_analysis.rs +0 -0
  101. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/resolver.rs +0 -0
  102. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/schema.rs +0 -0
  103. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/scope.rs +0 -0
  104. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/set_operation.rs +0 -0
  105. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/time.rs +0 -0
  106. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/tokens.rs +0 -0
  107. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/transforms.rs +0 -0
  108. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/traversal.rs +0 -0
  109. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/src/trie.rs +0 -0
  110. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  111. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  112. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
  113. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  114. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  115. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  116. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  117. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  118. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  119. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  120. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  121. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  122. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  123. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  124. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  125. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  126. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  127. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  128. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  129. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
  130. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
  131. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
  132. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  133. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  134. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  135. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  136. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  137. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  138. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  139. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  140. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/query_analysis.rs +0 -0
  141. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
  142. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  143. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  144. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  145. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  146. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  147. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  148. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  149. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  150. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  151. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  152. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  153. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  154. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  155. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  156. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  157. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/README.md +0 -0
  158. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  159. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  160. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  161. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  162. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  163. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/Cargo.toml +0 -0
  164. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/README.md +0 -0
  165. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/docs/api.md +0 -0
  166. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/docs/index.md +0 -0
  167. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  168. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  169. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/builders.rs +0 -0
  170. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  171. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/diff.rs +0 -0
  172. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/errors.rs +0 -0
  173. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/expr.rs +0 -0
  174. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  175. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/format.rs +0 -0
  176. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/generate.rs +0 -0
  177. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  178. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/lib.rs +0 -0
  179. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  180. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  181. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  182. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/parse.rs +0 -0
  183. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
  184. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  185. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  186. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  187. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/types.rs +0 -0
  188. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/src/validate.rs +0 -0
  189. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  190. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  191. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  192. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  193. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  194. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  195. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  196. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  197. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  198. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  199. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  200. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
  201. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  202. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  203. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  204. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/crates/polyglot-sql-python/uv.lock +0 -0
  205. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/pyproject.toml +0 -0
  206. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/python/polyglot_sql/__init__.py +0 -0
  207. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/python/polyglot_sql/__init__.pyi +0 -0
  208. {polyglot_sql_chio-0.9.2 → polyglot_sql_chio-0.9.3}/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.9.2"
608
+ version = "0.9.3"
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.9.2"
626
+ version = "0.9.3"
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.9.2"
635
+ version = "0.9.3"
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.9.2"
645
+ version = "0.9.3"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.9.2"
649
+ version = "0.9.3"
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.9.2"
660
+ version = "0.9.3"
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.9.2"
9
+ version = "0.9.3"
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.9.2
3
+ Version: 0.9.3
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.9.2" }
103
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.9.3" }
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.9.2", optional = true, default-features = false }
110
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.9.3", optional = true, default-features = false }
111
111
 
112
112
  [dev-dependencies]
113
113
  pretty_assertions = "1.4"
@@ -25,7 +25,7 @@ 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.9.2", default-features = false }
28
+ polyglot-sql = { version = "0.9.3", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
@@ -166,6 +166,18 @@ fn test_function_catalog() -> Arc<HashMapFunctionCatalog> {
166
166
  Arc::new(catalog)
167
167
  }
168
168
 
169
+ fn schema_validation_dialects() -> [DialectType; 7] {
170
+ [
171
+ DialectType::Generic,
172
+ DialectType::Snowflake,
173
+ DialectType::DuckDB,
174
+ DialectType::BigQuery,
175
+ DialectType::Databricks,
176
+ DialectType::PostgreSQL,
177
+ DialectType::TSQL,
178
+ ]
179
+ }
180
+
169
181
  #[test]
170
182
  fn test_validate_with_schema_known_table_column() {
171
183
  let schema = base_schema();
@@ -182,36 +194,205 @@ fn test_validate_with_schema_known_table_column() {
182
194
 
183
195
  #[test]
184
196
  fn test_validate_with_schema_qualified_cte_column_is_not_ambiguous() {
197
+ let schema = base_schema();
198
+ let opts = SchemaValidationOptions {
199
+ check_references: true,
200
+ ..Default::default()
201
+ };
202
+ for dialect in schema_validation_dialects() {
203
+ let result = validate_with_schema(
204
+ "WITH selected_users AS (SELECT id FROM users), \
205
+ selected_orders AS (SELECT id FROM orders) \
206
+ SELECT selected_users.id FROM selected_users \
207
+ JOIN selected_orders ON selected_users.id = selected_orders.id",
208
+ dialect,
209
+ &schema,
210
+ &opts,
211
+ );
212
+
213
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
214
+ }
215
+ }
216
+
217
+ #[test]
218
+ fn test_validate_with_schema_correlated_subquery_resolves_outer_alias() {
219
+ let schema = base_schema();
220
+ let opts = SchemaValidationOptions {
221
+ check_references: true,
222
+ ..Default::default()
223
+ };
224
+ for dialect in schema_validation_dialects() {
225
+ let result = validate_with_schema(
226
+ "SELECT outer_users.id FROM users outer_users \
227
+ WHERE EXISTS (SELECT 1 FROM orders inner_orders \
228
+ WHERE inner_orders.user_id = outer_users.id)",
229
+ dialect,
230
+ &schema,
231
+ &opts,
232
+ );
233
+
234
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
235
+ }
236
+ }
237
+
238
+ #[test]
239
+ fn test_validate_with_schema_correlated_subquery_prefers_inner_unqualified_column() {
240
+ let schema = base_schema();
241
+ let opts = SchemaValidationOptions {
242
+ check_references: true,
243
+ ..Default::default()
244
+ };
245
+ for dialect in schema_validation_dialects() {
246
+ let result = validate_with_schema(
247
+ "SELECT outer_users.id FROM users outer_users \
248
+ WHERE EXISTS (SELECT 1 FROM orders inner_orders \
249
+ WHERE id = outer_users.id)",
250
+ dialect,
251
+ &schema,
252
+ &opts,
253
+ );
254
+
255
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
256
+ }
257
+ }
258
+
259
+ #[test]
260
+ fn test_validate_with_schema_subsequent_cte_resolves_prior_projection() {
261
+ let schema = base_schema();
262
+ let opts = SchemaValidationOptions {
263
+ check_references: true,
264
+ ..Default::default()
265
+ };
266
+ for dialect in schema_validation_dialects() {
267
+ let result = validate_with_schema(
268
+ "WITH derived AS (SELECT total AS derived_total FROM orders), \
269
+ next AS (SELECT derived_total FROM derived) \
270
+ SELECT derived_total FROM next",
271
+ dialect,
272
+ &schema,
273
+ &opts,
274
+ );
275
+
276
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
277
+ }
278
+ }
279
+
280
+ #[test]
281
+ fn test_validate_with_schema_window_resolves_prior_cte_projection() {
282
+ let schema = base_schema();
283
+ let opts = SchemaValidationOptions {
284
+ check_references: true,
285
+ ..Default::default()
286
+ };
287
+ for dialect in schema_validation_dialects() {
288
+ let result = validate_with_schema(
289
+ "WITH scored AS (SELECT user_id, total AS order_total FROM orders), \
290
+ ranked AS (SELECT user_id, ROW_NUMBER() OVER ( \
291
+ PARTITION BY user_id ORDER BY order_total DESC) AS row_number FROM scored) \
292
+ SELECT user_id FROM ranked",
293
+ dialect,
294
+ &schema,
295
+ &opts,
296
+ );
297
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
298
+ }
299
+ }
300
+
301
+ #[test]
302
+ fn test_validate_with_schema_joined_cte_projection_preserves_scope() {
303
+ let schema = base_schema();
304
+ let opts = SchemaValidationOptions {
305
+ check_references: true,
306
+ ..Default::default()
307
+ };
308
+ for dialect in schema_validation_dialects() {
309
+ let result = validate_with_schema(
310
+ "WITH selected_users AS (SELECT id, name FROM users), \
311
+ selected_orders AS (SELECT id, user_id, total FROM orders), \
312
+ combined AS (SELECT selected_users.*, selected_orders.total \
313
+ FROM selected_users JOIN selected_orders \
314
+ ON selected_users.id = selected_orders.user_id) \
315
+ SELECT id, name, total FROM combined",
316
+ dialect,
317
+ &schema,
318
+ &opts,
319
+ );
320
+
321
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
322
+ }
323
+ }
324
+
325
+ #[test]
326
+ fn test_validate_with_schema_chained_star_projection_preserves_aliases() {
327
+ let schema = base_schema();
328
+ let opts = SchemaValidationOptions {
329
+ check_references: true,
330
+ ..Default::default()
331
+ };
332
+ for dialect in schema_validation_dialects() {
333
+ let result = validate_with_schema(
334
+ "WITH totals AS (SELECT user_id, total AS order_total FROM orders), \
335
+ copied AS (SELECT * FROM totals), \
336
+ scored AS (SELECT *, order_total + 1 AS adjusted_total FROM copied) \
337
+ SELECT user_id, order_total, adjusted_total FROM scored",
338
+ dialect,
339
+ &schema,
340
+ &opts,
341
+ );
342
+
343
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
344
+ }
345
+ }
346
+
347
+ #[test]
348
+ fn test_validate_with_schema_snowflake_qualify_resolves_projection_columns() {
185
349
  let schema = base_schema();
186
350
  let opts = SchemaValidationOptions {
187
351
  check_references: true,
188
352
  ..Default::default()
189
353
  };
190
354
  let result = validate_with_schema(
191
- "WITH selected_users AS (SELECT id FROM users), \
192
- selected_orders AS (SELECT id FROM orders) \
193
- SELECT selected_users.id FROM selected_users \
194
- JOIN selected_orders ON selected_users.id = selected_orders.id",
195
- DialectType::Generic,
355
+ "WITH ranked AS (SELECT user_id, total, \
356
+ ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS row_number \
357
+ FROM orders QUALIFY row_number = 1) \
358
+ SELECT user_id, total FROM ranked",
359
+ DialectType::Snowflake,
196
360
  &schema,
197
361
  &opts,
198
362
  );
363
+ assert!(result.valid, "{:#?}", result.errors);
364
+ }
199
365
 
366
+ #[test]
367
+ fn test_validate_with_schema_snowflake_union_by_name_preserves_projection() {
368
+ let schema = base_schema();
369
+ let opts = SchemaValidationOptions {
370
+ check_references: true,
371
+ ..Default::default()
372
+ };
373
+ let result = validate_with_schema(
374
+ "WITH records AS (SELECT id, name FROM users \
375
+ UNION ALL BY NAME SELECT id, CAST(total AS VARCHAR) AS name FROM orders) \
376
+ SELECT id, name FROM records",
377
+ DialectType::Snowflake,
378
+ &schema,
379
+ &opts,
380
+ );
200
381
  assert!(result.valid, "{:#?}", result.errors);
201
382
  }
202
383
 
203
384
  #[test]
204
- fn test_validate_with_schema_correlated_subquery_resolves_outer_alias() {
385
+ fn test_validate_with_schema_snowflake_join_using_resolves_cte_column() {
205
386
  let schema = base_schema();
206
387
  let opts = SchemaValidationOptions {
207
388
  check_references: true,
208
389
  ..Default::default()
209
390
  };
210
391
  let result = validate_with_schema(
211
- "SELECT outer_users.id FROM users outer_users \
212
- WHERE EXISTS (SELECT 1 FROM orders inner_orders \
213
- WHERE inner_orders.user_id = outer_users.id)",
214
- DialectType::Generic,
392
+ "WITH selected_users AS (SELECT id, name FROM users) \
393
+ SELECT orders.id, selected_users.name FROM orders \
394
+ INNER JOIN selected_users USING (id)",
395
+ DialectType::Snowflake,
215
396
  &schema,
216
397
  &opts,
217
398
  );
@@ -220,17 +401,18 @@ fn test_validate_with_schema_correlated_subquery_resolves_outer_alias() {
220
401
  }
221
402
 
222
403
  #[test]
223
- fn test_validate_with_schema_correlated_subquery_prefers_inner_unqualified_column() {
404
+ fn test_validate_with_schema_snowflake_join_using_cte_from_same_table() {
224
405
  let schema = base_schema();
225
406
  let opts = SchemaValidationOptions {
226
407
  check_references: true,
227
408
  ..Default::default()
228
409
  };
229
410
  let result = validate_with_schema(
230
- "SELECT outer_users.id FROM users outer_users \
231
- WHERE EXISTS (SELECT 1 FROM orders inner_orders \
232
- WHERE id = outer_users.id)",
233
- DialectType::Generic,
411
+ "WITH selected_users AS (SELECT id FROM users WHERE age >= 18), \
412
+ combined AS (SELECT users.* FROM users \
413
+ INNER JOIN selected_users USING (id)) \
414
+ SELECT id, name FROM combined",
415
+ DialectType::Snowflake,
234
416
  &schema,
235
417
  &opts,
236
418
  );
@@ -239,17 +421,18 @@ fn test_validate_with_schema_correlated_subquery_prefers_inner_unqualified_colum
239
421
  }
240
422
 
241
423
  #[test]
242
- fn test_validate_with_schema_subsequent_cte_resolves_prior_projection() {
424
+ fn test_validate_with_schema_snowflake_nested_qualify_resolves_cte_projection() {
243
425
  let schema = base_schema();
244
426
  let opts = SchemaValidationOptions {
245
427
  check_references: true,
246
428
  ..Default::default()
247
429
  };
248
430
  let result = validate_with_schema(
249
- "WITH derived AS (SELECT total AS derived_total FROM orders), \
250
- next AS (SELECT derived_total FROM derived) \
251
- SELECT derived_total FROM next",
252
- DialectType::Generic,
431
+ "WITH customer_orders AS (SELECT user_id, id AS order_id, total FROM orders), \
432
+ deduplicated AS (SELECT * FROM (SELECT user_id, order_id, total \
433
+ FROM customer_orders QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id \
434
+ ORDER BY order_id) = 1)) SELECT user_id, order_id, total FROM deduplicated",
435
+ DialectType::Snowflake,
253
436
  &schema,
254
437
  &opts,
255
438
  );
@@ -258,18 +441,19 @@ fn test_validate_with_schema_subsequent_cte_resolves_prior_projection() {
258
441
  }
259
442
 
260
443
  #[test]
261
- fn test_validate_with_schema_window_resolves_prior_cte_projection() {
444
+ fn test_validate_with_schema_snowflake_deep_nested_qualify_resolves_cte_projection() {
262
445
  let schema = base_schema();
263
446
  let opts = SchemaValidationOptions {
264
447
  check_references: true,
265
448
  ..Default::default()
266
449
  };
267
450
  let result = validate_with_schema(
268
- "WITH scored AS (SELECT user_id, total AS order_total FROM orders), \
269
- ranked AS (SELECT user_id, ROW_NUMBER() OVER ( \
270
- PARTITION BY user_id ORDER BY order_total DESC) AS row_number FROM scored) \
271
- SELECT user_id FROM ranked",
272
- DialectType::Generic,
451
+ "WITH base AS (SELECT id AS user_id, name, age FROM users), \
452
+ flags AS (SELECT user_id FROM (SELECT user_id FROM ( \
453
+ SELECT user_id, name, age FROM base \
454
+ QUALIFY ROW_NUMBER() OVER (PARTITION BY user_id, name ORDER BY age) = 1))) \
455
+ SELECT user_id FROM flags",
456
+ DialectType::Snowflake,
273
457
  &schema,
274
458
  &opts,
275
459
  );
@@ -277,6 +461,96 @@ fn test_validate_with_schema_window_resolves_prior_cte_projection() {
277
461
  assert!(result.valid, "{:#?}", result.errors);
278
462
  }
279
463
 
464
+ #[test]
465
+ fn test_validate_with_schema_deep_star_chain_preserves_computed_alias() {
466
+ let schema = base_schema();
467
+ let opts = SchemaValidationOptions {
468
+ check_references: true,
469
+ ..Default::default()
470
+ };
471
+ for dialect in schema_validation_dialects() {
472
+ let result = validate_with_schema(
473
+ "WITH base AS (SELECT user_id, total FROM orders), \
474
+ first_copy AS (SELECT *, total + 1 AS adjusted_total FROM base), \
475
+ second_copy AS (SELECT * FROM first_copy), \
476
+ third_copy AS (SELECT * FROM second_copy), \
477
+ fourth_copy AS (SELECT *, adjusted_total * 2 AS score FROM third_copy) \
478
+ SELECT user_id, adjusted_total, score FROM fourth_copy",
479
+ dialect,
480
+ &schema,
481
+ &opts,
482
+ );
483
+
484
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
485
+ }
486
+ }
487
+
488
+ #[test]
489
+ fn test_validate_with_schema_nested_scalar_subquery_resolves_outer_column() {
490
+ let schema = base_schema();
491
+ let opts = SchemaValidationOptions {
492
+ check_references: true,
493
+ ..Default::default()
494
+ };
495
+ for dialect in schema_validation_dialects() {
496
+ let result = validate_with_schema(
497
+ "WITH metrics AS (SELECT user_id, total AS score FROM orders), \
498
+ adjusted AS (SELECT score, CASE WHEN score IS NULL THEN NULL ELSE ( \
499
+ SELECT adjusted_score FROM (SELECT score + 1 AS adjusted_score)) END AS result \
500
+ FROM metrics) SELECT score, result FROM adjusted",
501
+ dialect,
502
+ &schema,
503
+ &opts,
504
+ );
505
+
506
+ assert!(result.valid, "{dialect}: {:#?}", result.errors);
507
+ }
508
+ }
509
+
510
+ #[test]
511
+ fn test_validate_with_schema_ambiguous_outer_column_stays_invalid() {
512
+ let schema = base_schema();
513
+ let opts = SchemaValidationOptions {
514
+ check_references: true,
515
+ ..Default::default()
516
+ };
517
+ let result = validate_with_schema(
518
+ "SELECT users.id FROM users JOIN orders ON users.id = orders.user_id \
519
+ WHERE EXISTS (SELECT 1 WHERE id > 0)",
520
+ DialectType::Generic,
521
+ &schema,
522
+ &opts,
523
+ );
524
+
525
+ assert!(!result.valid);
526
+ assert!(result.errors.iter().any(|error| {
527
+ error.code == validation_codes::E_AMBIGUOUS_COLUMN_REFERENCE
528
+ && error.message.contains("outer sources")
529
+ }));
530
+ }
531
+
532
+ #[test]
533
+ fn test_validate_with_schema_unknown_column_after_cte_projection_stays_invalid() {
534
+ let schema = base_schema();
535
+ let opts = SchemaValidationOptions {
536
+ check_references: true,
537
+ ..Default::default()
538
+ };
539
+ let result = validate_with_schema(
540
+ "WITH selected_users AS (SELECT id, name FROM users) \
541
+ SELECT missing_column FROM selected_users",
542
+ DialectType::Generic,
543
+ &schema,
544
+ &opts,
545
+ );
546
+
547
+ assert!(!result.valid);
548
+ assert!(result
549
+ .errors
550
+ .iter()
551
+ .any(|error| error.code == validation_codes::E_UNKNOWN_COLUMN));
552
+ }
553
+
280
554
  #[test]
281
555
  fn test_validate_with_schema_unknown_column_in_derived_table() {
282
556
  let schema = base_schema();