polyglot-sql 0.10.0__tar.gz → 0.12.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 (218) hide show
  1. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/Cargo.lock +6 -6
  2. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/Cargo.toml +1 -1
  3. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/PKG-INFO +75 -4
  4. {polyglot_sql-0.10.0/crates/polyglot-sql-python → polyglot_sql-0.12.0}/README.md +74 -3
  5. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/Cargo.toml +2 -2
  6. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/README.md +30 -4
  7. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/performance_hotspots.rs +62 -1
  8. polyglot_sql-0.12.0/crates/polyglot-sql/src/binding.rs +519 -0
  9. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/bigquery.rs +1 -0
  10. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/clickhouse.rs +1 -0
  11. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/duckdb.rs +56 -57
  12. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/fabric.rs +2 -1
  13. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/mod.rs +41 -5
  14. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/presto.rs +12 -22
  15. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/snowflake.rs +77 -96
  16. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/expressions.rs +13 -0
  17. polyglot_sql-0.12.0/crates/polyglot-sql/src/format_tokens.rs +167 -0
  18. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/function_catalog.rs +56 -2
  19. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/generator.rs +626 -293
  20. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/guard.rs +57 -1
  21. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/lib.rs +137 -24
  22. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/lineage.rs +32 -24
  23. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/annotate_types.rs +332 -64
  24. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +333 -104
  25. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/parser.rs +2269 -789
  26. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/query_analysis/column_uses.rs +20 -18
  27. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/query_analysis.rs +609 -155
  28. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/resolver.rs +46 -4
  29. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/schema.rs +16 -0
  30. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/scope.rs +15 -9
  31. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/set_operation.rs +1 -0
  32. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/tokens.rs +14 -5
  33. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/transforms.rs +5 -0
  34. polyglot_sql-0.12.0/crates/polyglot-sql/src/validation/semantics.rs +534 -0
  35. polyglot_sql-0.12.0/crates/polyglot-sql/src/validation/tests.rs +2444 -0
  36. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/validation.rs +849 -565
  37. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/known_failures.rs +18 -0
  38. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +7 -7
  39. polyglot_sql-0.12.0/crates/polyglot-sql/tests/data_type_api.rs +397 -0
  40. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/deep_nesting_regression.rs +243 -0
  41. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/dialect_matrix.rs +67 -0
  42. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/query_analysis.rs +508 -3
  43. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/snowflake_regression_test.rs +96 -0
  44. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/README.md +1 -1
  45. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0/crates/polyglot-sql-python}/README.md +74 -3
  46. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/helpers.rs +48 -5
  47. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/parse.rs +25 -9
  48. polyglot_sql-0.12.0/crates/polyglot-sql-python/src/query_analysis.rs +54 -0
  49. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/transpile.rs +9 -2
  50. polyglot_sql-0.12.0/crates/polyglot-sql-python/src/validate.rs +89 -0
  51. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_format.py +26 -0
  52. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_generate.py +33 -0
  53. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_parse.py +44 -0
  54. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_query_analysis.py +95 -1
  55. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_transpile.py +36 -0
  56. polyglot_sql-0.12.0/crates/polyglot-sql-python/tests/test_validate.py +448 -0
  57. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/python/polyglot_sql/__init__.py +77 -2
  58. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/python/polyglot_sql/__init__.pyi +66 -7
  59. polyglot_sql-0.12.0/python/polyglot_sql/analysis_types.py +171 -0
  60. polyglot_sql-0.10.0/crates/polyglot-sql/src/format_tokens.rs +0 -87
  61. polyglot_sql-0.10.0/crates/polyglot-sql/src/validation/tests.rs +0 -1417
  62. polyglot_sql-0.10.0/crates/polyglot-sql/tests/data_type_api.rs +0 -86
  63. polyglot_sql-0.10.0/crates/polyglot-sql-python/src/query_analysis.rs +0 -33
  64. polyglot_sql-0.10.0/crates/polyglot-sql-python/src/validate.rs +0 -55
  65. polyglot_sql-0.10.0/crates/polyglot-sql-python/tests/test_validate.py +0 -173
  66. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  67. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  68. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/in_list.rs +0 -0
  69. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/lineage.rs +0 -0
  70. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/parsing.rs +0 -0
  71. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  72. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/benches/transpile.rs +0 -0
  73. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  74. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  75. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_children.rs +0 -0
  76. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_json.rs +0 -0
  77. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
  78. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  79. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/builder/mod.rs +0 -0
  80. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  81. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  82. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  83. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  84. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  85. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  86. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  87. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  88. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  89. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  90. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  91. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  92. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  93. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  94. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  95. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +0 -0
  96. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  97. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  98. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/mod.rs +0 -0
  99. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/operators.rs +0 -0
  100. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  101. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
  102. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
  103. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
  104. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  105. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  106. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  107. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  108. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  109. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  110. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  111. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  112. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  113. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  114. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  115. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  116. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  117. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  118. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  119. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/diff.rs +0 -0
  120. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/error.rs +0 -0
  121. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/function_registry.rs +0 -0
  122. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/helper.rs +0 -0
  123. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/openlineage.rs +0 -0
  124. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  125. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  126. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  127. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  128. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  129. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  130. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  131. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  132. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  133. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  134. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  135. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  136. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  137. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  138. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/planner.rs +0 -0
  139. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/time.rs +0 -0
  140. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/traversal.rs +0 -0
  141. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/src/trie.rs +0 -0
  142. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  143. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  144. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  145. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  146. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  147. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  148. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  149. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  150. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  151. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  152. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  153. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  154. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  155. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  156. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  157. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  158. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  159. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  160. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  161. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  162. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  163. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  164. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  165. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  166. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  167. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
  168. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  169. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  170. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  171. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  172. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  173. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  174. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  175. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  176. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  177. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  178. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  179. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  180. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  181. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  182. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  183. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  184. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  185. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  186. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  187. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/Cargo.toml +0 -0
  188. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/docs/api.md +0 -0
  189. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/docs/index.md +0 -0
  190. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  191. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  192. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/builders.rs +0 -0
  193. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  194. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/diff.rs +0 -0
  195. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/errors.rs +0 -0
  196. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/expr.rs +0 -0
  197. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  198. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/format.rs +0 -0
  199. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/generate.rs +0 -0
  200. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/lib.rs +0 -0
  201. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  202. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  203. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  204. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  205. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  206. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/src/types.rs +0 -0
  207. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  208. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  209. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  210. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  211. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  212. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  213. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  214. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  215. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  216. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/crates/polyglot-sql-python/uv.lock +0 -0
  217. {polyglot_sql-0.10.0 → polyglot_sql-0.12.0}/pyproject.toml +0 -0
  218. {polyglot_sql-0.10.0 → polyglot_sql-0.12.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.10.0"
608
+ version = "0.12.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.10.0"
626
+ version = "0.12.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.10.0"
635
+ version = "0.12.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.10.0"
645
+ version = "0.12.0"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.10.0"
649
+ version = "0.12.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.10.0"
660
+ version = "0.12.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.10.0"
9
+ version = "0.12.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.10.0
3
+ Version: 0.12.0
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -110,6 +110,39 @@ polyglot_sql.generate(ast)
110
110
  # ["SELECT id FROM a UNION ALL SELECT id FROM b ORDER BY id LIMIT 100 OFFSET 10"]
111
111
  ```
112
112
 
113
+ ### Complexity Guard Options
114
+
115
+ `parse`, `parse_one` (including `into=DataType`), `parse_data_type`, `validate`,
116
+ `validate_with_schema`, `analyze_query`, and `transpile` accept the keyword-only
117
+ `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
118
+ using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
119
+ `maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
120
+ Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
121
+ disables that check; a nonnegative integer overrides it. For example:
122
+
123
+ ```python
124
+ polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
125
+ polyglot_sql.validate(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": 128})
126
+ polyglot_sql.parse_one(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": None})
127
+ ```
128
+
129
+ `analyze_query` also accepts `options={"complexityGuard": {...}}`; do not supply
130
+ both forms in one call. Limits must be nonnegative integers or `None`; booleans,
131
+ floats, out-of-range integers, and unknown guard keys are rejected.
132
+ Omitting the entire guard preserves dialect-specific defaults (including
133
+ ClickHouse's higher function-nesting limit). A supplied dictionary uses the
134
+ shared Rust defaults for omitted fields. Validation reports guard exhaustion
135
+ as diagnostics; parsing and analysis raise `ParseError`.
136
+
137
+ Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
138
+ checked during parsing, before an AST exists. Zero rejects parsing descents.
139
+ Other checks remain independent.
140
+ Raising or disabling limits can permit stack exhaustion and process termination,
141
+ even for trusted generated SQL. Increasing a limit does not increase stack space;
142
+ these limits are not general time/memory budgets. Application owners should control
143
+ overrides. Other SQL-consuming helpers, including lineage and optimization,
144
+ continue to inherit default protection.
145
+
113
146
  ### Format Guard Behavior
114
147
 
115
148
  `format_sql` uses Rust core formatting guards with default limits:
@@ -345,9 +378,47 @@ Unknown dialect names raise built-in `ValueError`.
345
378
  - `bool(result)` works (`True` when valid)
346
379
 
347
380
  `strict_syntax=True` rejects compatibility forms such as trailing commas before
348
- clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
349
- `SELECT *`, mixed aggregate projections, `DISTINCT` with `ORDER BY`, and
350
- `LIMIT` without `ORDER BY`; warnings do not make the result invalid.
381
+ clause boundaries. `semantic=True` checks every query scope and reports errors
382
+ for invalid grouping (`E230`), aggregate placement/nesting (`E231`), and window
383
+ placement/nesting (`E232`). These errors make the result invalid, including with
384
+ `strict=False`. Quality hints remain warnings: `SELECT *` (`W001`), uncertain
385
+ grouping (`W002`), `DISTINCT` with `ORDER BY` (`W003`), and unordered `LIMIT`
386
+ (`W004`). Default validation remains syntax-only.
387
+
388
+ Schema validation always checks DML targets and references, independently of
389
+ `check_types`. Type checks use lexical query scopes and name-aligned set-operation
390
+ outputs. An empty column list or `*` denotes an open schema; validation is not a
391
+ database execution check and cannot prove runtime/session-dependent behavior.
392
+
393
+ Analysis options and schemas reject unknown keys, including nested metadata.
394
+ Public `TypedDict` models such as `AnalyzeQueryOptions`, `ValidationSchema`,
395
+ `QueryAnalysis`, and `FunctionCatalogSpec` describe their dictionary payloads.
396
+ Analysis retains best-effort references for missing columns but marks them
397
+ `unknown`, not `resolved`. Lambda-local parameters are not physical dependencies.
398
+
399
+ Python also accepts a declarative function catalog (Rust offers
400
+ `FunctionCatalogSpec::build` and the existing `FunctionCatalog` trait):
401
+
402
+ ```python
403
+ catalog: polyglot_sql.FunctionCatalogSpec = {
404
+ "functions": [{
405
+ "name": "my_udf",
406
+ "signatures": [{"minArity": 1, "maxArity": 2}],
407
+ }],
408
+ }
409
+ result = polyglot_sql.validate_with_schema(
410
+ "SELECT my_udf(1)", {"tables": []}, check_types=True,
411
+ function_catalog=catalog,
412
+ )
413
+ ```
414
+
415
+ The catalog **replaces** the embedded function name/arity catalog; it does not
416
+ activate `check_types` automatically. Overloads are supported; omitted/null
417
+ `maxArity` means variadic. `nameCase` is `insensitive` by default, or `sensitive`,
418
+ and can be overridden per function. Native typed-function checks remain active.
419
+ Blank names, empty signature lists, negative/noninteger arities, reversed bounds,
420
+ conflicting case overrides, and unknown fields are rejected. Other SDKs do not
421
+ expose this catalog option.
351
422
 
352
423
  Each `ValidationErrorInfo` has:
353
424
 
@@ -83,6 +83,39 @@ polyglot_sql.generate(ast)
83
83
  # ["SELECT id FROM a UNION ALL SELECT id FROM b ORDER BY id LIMIT 100 OFFSET 10"]
84
84
  ```
85
85
 
86
+ ### Complexity Guard Options
87
+
88
+ `parse`, `parse_one` (including `into=DataType`), `parse_data_type`, `validate`,
89
+ `validate_with_schema`, `analyze_query`, and `transpile` accept the keyword-only
90
+ `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
91
+ using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
92
+ `maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
93
+ Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
94
+ disables that check; a nonnegative integer overrides it. For example:
95
+
96
+ ```python
97
+ polyglot_sql.transpile(sql, complexity_guard={"maxParserDepth": 128})
98
+ polyglot_sql.validate(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": 128})
99
+ polyglot_sql.parse_one(sql, dialect="snowflake", complexity_guard={"maxFunctionCallDepth": None})
100
+ ```
101
+
102
+ `analyze_query` also accepts `options={"complexityGuard": {...}}`; do not supply
103
+ both forms in one call. Limits must be nonnegative integers or `None`; booleans,
104
+ floats, out-of-range integers, and unknown guard keys are rejected.
105
+ Omitting the entire guard preserves dialect-specific defaults (including
106
+ ClickHouse's higher function-nesting limit). A supplied dictionary uses the
107
+ shared Rust defaults for omitted fields. Validation reports guard exhaustion
108
+ as diagnostics; parsing and analysis raise `ParseError`.
109
+
110
+ Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
111
+ checked during parsing, before an AST exists. Zero rejects parsing descents.
112
+ Other checks remain independent.
113
+ Raising or disabling limits can permit stack exhaustion and process termination,
114
+ even for trusted generated SQL. Increasing a limit does not increase stack space;
115
+ these limits are not general time/memory budgets. Application owners should control
116
+ overrides. Other SQL-consuming helpers, including lineage and optimization,
117
+ continue to inherit default protection.
118
+
86
119
  ### Format Guard Behavior
87
120
 
88
121
  `format_sql` uses Rust core formatting guards with default limits:
@@ -318,9 +351,47 @@ Unknown dialect names raise built-in `ValueError`.
318
351
  - `bool(result)` works (`True` when valid)
319
352
 
320
353
  `strict_syntax=True` rejects compatibility forms such as trailing commas before
321
- clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
322
- `SELECT *`, mixed aggregate projections, `DISTINCT` with `ORDER BY`, and
323
- `LIMIT` without `ORDER BY`; warnings do not make the result invalid.
354
+ clause boundaries. `semantic=True` checks every query scope and reports errors
355
+ for invalid grouping (`E230`), aggregate placement/nesting (`E231`), and window
356
+ placement/nesting (`E232`). These errors make the result invalid, including with
357
+ `strict=False`. Quality hints remain warnings: `SELECT *` (`W001`), uncertain
358
+ grouping (`W002`), `DISTINCT` with `ORDER BY` (`W003`), and unordered `LIMIT`
359
+ (`W004`). Default validation remains syntax-only.
360
+
361
+ Schema validation always checks DML targets and references, independently of
362
+ `check_types`. Type checks use lexical query scopes and name-aligned set-operation
363
+ outputs. An empty column list or `*` denotes an open schema; validation is not a
364
+ database execution check and cannot prove runtime/session-dependent behavior.
365
+
366
+ Analysis options and schemas reject unknown keys, including nested metadata.
367
+ Public `TypedDict` models such as `AnalyzeQueryOptions`, `ValidationSchema`,
368
+ `QueryAnalysis`, and `FunctionCatalogSpec` describe their dictionary payloads.
369
+ Analysis retains best-effort references for missing columns but marks them
370
+ `unknown`, not `resolved`. Lambda-local parameters are not physical dependencies.
371
+
372
+ Python also accepts a declarative function catalog (Rust offers
373
+ `FunctionCatalogSpec::build` and the existing `FunctionCatalog` trait):
374
+
375
+ ```python
376
+ catalog: polyglot_sql.FunctionCatalogSpec = {
377
+ "functions": [{
378
+ "name": "my_udf",
379
+ "signatures": [{"minArity": 1, "maxArity": 2}],
380
+ }],
381
+ }
382
+ result = polyglot_sql.validate_with_schema(
383
+ "SELECT my_udf(1)", {"tables": []}, check_types=True,
384
+ function_catalog=catalog,
385
+ )
386
+ ```
387
+
388
+ The catalog **replaces** the embedded function name/arity catalog; it does not
389
+ activate `check_types` automatically. Overloads are supported; omitted/null
390
+ `maxArity` means variadic. `nameCase` is `insensitive` by default, or `sensitive`,
391
+ and can be overridden per function. Native typed-function checks remain active.
392
+ Blank names, empty signature lists, negative/noninteger arities, reversed bounds,
393
+ conflicting case overrides, and unknown fields are rejected. Other SDKs do not
394
+ expose this catalog option.
324
395
 
325
396
  Each `ValidationErrorInfo` has:
326
397
 
@@ -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.10.0" }
103
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.12.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.10.0", optional = true, default-features = false }
110
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.12.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.10.0", default-features = false }
28
+ polyglot-sql = { version = "0.12.0", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.8.0",
33
+ version = "0.12.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.8.0",
47
+ version = "0.12.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.8.0",
54
+ version = "0.12.0",
55
55
  default-features = false,
56
56
  features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
57
57
  }
@@ -244,6 +244,29 @@ let tables = get_tables(&ast[0]);
244
244
 
245
245
  ### Validation
246
246
 
247
+ Parsing, validation, and query analysis accept per-call `ComplexityGuardOptions`.
248
+ Existing entry points retain their defaults; parsing adds `parse_with_options`,
249
+ `parse_one_with_options`, and `parse_data_type_with_options` (and corresponding
250
+ `Dialect` parsing methods). For example:
251
+
252
+ ```rust
253
+ use polyglot_sql::{parse_one_with_options, ComplexityGuardOptions, DialectType, ParseOptions};
254
+
255
+ let options = ParseOptions {
256
+ complexity_guard: Some(ComplexityGuardOptions {
257
+ max_function_call_depth: Some(128),
258
+ ..Default::default()
259
+ }),
260
+ };
261
+ let expression = parse_one_with_options("SELECT COALESCE(value, 0) FROM records", DialectType::Snowflake, &options)?;
262
+ ```
263
+
264
+ `ValidationOptions`, `SchemaValidationOptions`, and `AnalyzeQueryOptions` expose
265
+ the same optional `complexity_guard`. An absent guard preserves dialect-specific
266
+ defaults; `None` on an individual limit disables only that check. Raising or
267
+ disabling limits can permit stack exhaustion; these are not general runtime or
268
+ memory budgets. Use `..Default::default()` when constructing extended options.
269
+
247
270
  ```rust
248
271
  use polyglot_sql::{validate_with_options, DialectType, ValidationOptions};
249
272
 
@@ -253,6 +276,7 @@ let result = validate_with_options(
253
276
  &ValidationOptions {
254
277
  strict_syntax: false,
255
278
  semantic: true,
279
+ ..Default::default()
256
280
  },
257
281
  );
258
282
  // W001 and W004 are warnings, so result.valid remains true.
@@ -301,6 +325,7 @@ let opts = SchemaValidationOptions {
301
325
  check_references: true,
302
326
  strict: None,
303
327
  semantic: true,
328
+ ..Default::default()
304
329
  };
305
330
 
306
331
  let result = validate_with_schema(
@@ -360,6 +385,7 @@ let analysis = analyze_query(
360
385
  AnalyzeQueryOptions {
361
386
  dialect: DialectType::Generic,
362
387
  schema: Some(schema),
388
+ ..Default::default()
363
389
  },
364
390
  ).unwrap();
365
391
 
@@ -81,6 +81,7 @@ fn many_numbers() -> String {
81
81
 
82
82
  fn disabled_guards() -> ComplexityGuardOptions {
83
83
  ComplexityGuardOptions {
84
+ max_parser_depth: None,
84
85
  max_input_bytes: None,
85
86
  max_tokens: None,
86
87
  max_ast_nodes: None,
@@ -209,10 +210,70 @@ fn bench_tokenize_and_parse(c: &mut Criterion) {
209
210
  guards.finish();
210
211
  }
211
212
 
213
+ fn bench_validation_and_analysis(c: &mut Criterion) {
214
+ #[cfg(all(feature = "semantic", feature = "generate"))]
215
+ {
216
+ use polyglot_sql::{
217
+ analyze_query, validate_with_schema, AnalyzeQueryOptions, SchemaValidationOptions,
218
+ ValidationSchema,
219
+ };
220
+ let schema: ValidationSchema = serde_json::from_value(
221
+ serde_json::json!({"tables": [{"name":"t", "columns":[{"name":"x", "type":"INT"}]}]}),
222
+ )
223
+ .unwrap();
224
+ let mut group = c.benchmark_group("validation_analysis");
225
+ group.sample_size(10);
226
+ for width in [100, 200, 400] {
227
+ let sql = format!(
228
+ "SELECT {} FROM t",
229
+ (0..width)
230
+ .map(|i| format!("x + {i} AS c{i}"))
231
+ .collect::<Vec<_>>()
232
+ .join(", ")
233
+ );
234
+ group.bench_with_input(BenchmarkId::new("analysis_width", width), &sql, |b, sql| {
235
+ b.iter(|| {
236
+ analyze_query(
237
+ black_box(sql),
238
+ AnalyzeQueryOptions {
239
+ schema: Some(schema.clone()),
240
+ dialect: DialectType::PostgreSQL,
241
+ ..Default::default()
242
+ },
243
+ )
244
+ .unwrap()
245
+ });
246
+ });
247
+ group.bench_with_input(
248
+ BenchmarkId::new("validation_width", width),
249
+ &sql,
250
+ |b, sql| {
251
+ b.iter(|| {
252
+ validate_with_schema(
253
+ black_box(sql),
254
+ DialectType::PostgreSQL,
255
+ &schema,
256
+ &SchemaValidationOptions {
257
+ check_types: true,
258
+ semantic: true,
259
+ ..Default::default()
260
+ },
261
+ )
262
+ });
263
+ },
264
+ );
265
+ }
266
+ group.finish();
267
+ }
268
+ #[cfg(not(all(feature = "semantic", feature = "generate")))]
269
+ let _ = c;
270
+ }
271
+
212
272
  criterion_group!(
213
273
  benches,
214
274
  bench_dialect_construction,
215
275
  bench_fresh_vs_reused_dialect,
216
- bench_tokenize_and_parse
276
+ bench_tokenize_and_parse,
277
+ bench_validation_and_analysis
217
278
  );
218
279
  criterion_main!(benches);