polyglot-sql 0.11.0__tar.gz → 0.12.1__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.11.0 → polyglot_sql-0.12.1}/Cargo.lock +6 -6
  2. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/Cargo.toml +1 -1
  3. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/PKG-INFO +57 -6
  4. {polyglot_sql-0.11.0/crates/polyglot-sql-python → polyglot_sql-0.12.1}/README.md +56 -5
  5. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/Cargo.toml +2 -2
  6. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/README.md +30 -4
  7. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/performance_hotspots.rs +61 -1
  8. polyglot_sql-0.12.1/crates/polyglot-sql/src/binding.rs +519 -0
  9. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/duckdb.rs +227 -57
  10. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/fabric.rs +2 -1
  11. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/mod.rs +41 -5
  12. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +25 -5
  13. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/mod.rs +24 -0
  14. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/operators.rs +76 -0
  15. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/presto.rs +12 -22
  16. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/snowflake.rs +77 -96
  17. polyglot_sql-0.12.1/crates/polyglot-sql/src/format_tokens.rs +167 -0
  18. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/function_catalog.rs +56 -2
  19. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/generator.rs +549 -246
  20. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/guard.rs +9 -1
  21. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/lib.rs +137 -24
  22. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/lineage.rs +8 -18
  23. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/annotate_types.rs +563 -57
  24. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/mod.rs +2 -0
  25. polyglot_sql-0.12.1/crates/polyglot-sql/src/optimizer/set_operation_types.rs +1182 -0
  26. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/parser.rs +498 -24
  27. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/query_analysis/column_uses.rs +20 -18
  28. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/query_analysis.rs +652 -152
  29. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/schema.rs +16 -0
  30. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/scope.rs +6 -9
  31. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/set_operation.rs +1 -0
  32. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/transforms.rs +5 -0
  33. polyglot_sql-0.12.1/crates/polyglot-sql/src/validation/semantics.rs +534 -0
  34. polyglot_sql-0.12.1/crates/polyglot-sql/src/validation/tests.rs +2444 -0
  35. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/validation.rs +849 -565
  36. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/known_failures.rs +30 -0
  37. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +7 -7
  38. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/data_type_api.rs +146 -0
  39. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/deep_nesting_regression.rs +102 -0
  40. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/dialect_matrix.rs +67 -0
  41. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/query_analysis.rs +563 -4
  42. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/snowflake_regression_test.rs +96 -0
  43. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/README.md +1 -1
  44. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1/crates/polyglot-sql-python}/README.md +56 -5
  45. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/helpers.rs +48 -5
  46. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/parse.rs +25 -9
  47. polyglot_sql-0.12.1/crates/polyglot-sql-python/src/query_analysis.rs +54 -0
  48. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/transpile.rs +4 -29
  49. polyglot_sql-0.12.1/crates/polyglot-sql-python/src/validate.rs +89 -0
  50. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_format.py +26 -0
  51. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_parse.py +44 -0
  52. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_query_analysis.py +93 -1
  53. polyglot_sql-0.12.1/crates/polyglot-sql-python/tests/test_validate.py +448 -0
  54. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/python/polyglot_sql/__init__.py +59 -2
  55. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/python/polyglot_sql/__init__.pyi +52 -6
  56. polyglot_sql-0.12.1/python/polyglot_sql/analysis_types.py +171 -0
  57. polyglot_sql-0.11.0/crates/polyglot-sql/src/format_tokens.rs +0 -87
  58. polyglot_sql-0.11.0/crates/polyglot-sql/src/validation/tests.rs +0 -1417
  59. polyglot_sql-0.11.0/crates/polyglot-sql-python/src/query_analysis.rs +0 -33
  60. polyglot_sql-0.11.0/crates/polyglot-sql-python/src/validate.rs +0 -55
  61. polyglot_sql-0.11.0/crates/polyglot-sql-python/tests/test_validate.py +0 -173
  62. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -0
  63. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  64. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/in_list.rs +0 -0
  65. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/lineage.rs +0 -0
  66. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/parsing.rs +0 -0
  67. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  68. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/benches/transpile.rs +0 -0
  69. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  70. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  71. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_children.rs +0 -0
  72. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_json.rs +0 -0
  73. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_mutation.rs +0 -0
  74. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  75. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/builder/mod.rs +0 -0
  76. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  77. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  78. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/bigquery.rs +0 -0
  79. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  80. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  81. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  82. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  83. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  84. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  85. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  86. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  87. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  88. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  89. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  90. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  91. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  92. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  93. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  94. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/json.rs +0 -0
  95. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  96. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +0 -0
  97. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/statements.rs +0 -0
  98. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +0 -0
  99. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/normalization/types.rs +0 -0
  100. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  101. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  102. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  103. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  104. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  105. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  106. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  107. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  108. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  109. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  110. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  111. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  112. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  113. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  114. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/diff.rs +0 -0
  115. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/error.rs +0 -0
  116. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/expressions.rs +0 -0
  117. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/function_registry.rs +0 -0
  118. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/helper.rs +0 -0
  119. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/openlineage.rs +0 -0
  120. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  121. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  122. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  123. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  124. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  125. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  126. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  127. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  128. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  129. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  130. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  131. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  132. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  133. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  134. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/planner.rs +0 -0
  135. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/resolver.rs +0 -0
  136. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/time.rs +0 -0
  137. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/tokens.rs +0 -0
  138. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/traversal.rs +0 -0
  139. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/src/trie.rs +0 -0
  140. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  141. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  142. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  143. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  144. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  145. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  146. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  147. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  148. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  149. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  150. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  151. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  152. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  153. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  154. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  155. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  156. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  157. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  158. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  159. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  160. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  161. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  162. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  163. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  164. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  165. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
  166. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  167. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  168. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  169. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  170. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  171. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  172. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  173. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  174. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  175. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  176. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  177. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  178. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-ast-derive/src/lib.rs +0 -0
  179. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  180. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  181. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  182. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  183. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  184. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  185. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/Cargo.toml +0 -0
  186. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/docs/api.md +0 -0
  187. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/docs/index.md +0 -0
  188. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  189. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  190. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/builders.rs +0 -0
  191. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  192. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/diff.rs +0 -0
  193. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/errors.rs +0 -0
  194. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/expr.rs +0 -0
  195. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  196. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/format.rs +0 -0
  197. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/generate.rs +0 -0
  198. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/lib.rs +0 -0
  199. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  200. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  201. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  202. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  203. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  204. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/src/types.rs +0 -0
  205. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  206. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  207. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  208. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  209. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  210. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  211. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  212. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  213. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  214. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  215. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  216. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/crates/polyglot-sql-python/uv.lock +0 -0
  217. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/pyproject.toml +0 -0
  218. {polyglot_sql-0.11.0 → polyglot_sql-0.12.1}/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.11.0"
608
+ version = "0.12.1"
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.11.0"
626
+ version = "0.12.1"
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.11.0"
635
+ version = "0.12.1"
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.11.0"
645
+ version = "0.12.1"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.11.0"
649
+ version = "0.12.1"
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.11.0"
660
+ version = "0.12.1"
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.11.0"
9
+ version = "0.12.1"
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.11.0
3
+ Version: 0.12.1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -112,7 +112,9 @@ polyglot_sql.generate(ast)
112
112
 
113
113
  ### Complexity Guard Options
114
114
 
115
- `transpile` also accepts `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
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
116
118
  using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
117
119
  `maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
118
120
  Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
@@ -120,15 +122,26 @@ disables that check; a nonnegative integer overrides it. For example:
120
122
 
121
123
  ```python
122
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})
123
127
  ```
124
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
+
125
137
  Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
126
138
  checked during parsing, before an AST exists. Zero rejects parsing descents.
127
139
  Other checks remain independent.
128
140
  Raising or disabling limits can permit stack exhaustion and process termination,
129
141
  even for trusted generated SQL. Increasing a limit does not increase stack space;
130
142
  these limits are not general time/memory budgets. Application owners should control
131
- overrides. Parsing APIs without guard options inherit the default protection.
143
+ overrides. Other SQL-consuming helpers, including lineage and optimization,
144
+ continue to inherit default protection.
132
145
 
133
146
  ### Format Guard Behavior
134
147
 
@@ -365,9 +378,47 @@ Unknown dialect names raise built-in `ValueError`.
365
378
  - `bool(result)` works (`True` when valid)
366
379
 
367
380
  `strict_syntax=True` rejects compatibility forms such as trailing commas before
368
- clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
369
- `SELECT *`, mixed aggregate projections, `DISTINCT` with `ORDER BY`, and
370
- `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.
371
422
 
372
423
  Each `ValidationErrorInfo` has:
373
424
 
@@ -85,7 +85,9 @@ polyglot_sql.generate(ast)
85
85
 
86
86
  ### Complexity Guard Options
87
87
 
88
- `transpile` also accepts `complexity_guard`, a `ComplexityGuardOptions` typed dictionary
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
89
91
  using the shared camelCase keys: `maxParserDepth`, `maxInputBytes`, `maxTokens`,
90
92
  `maxAstNodes`, `maxAstDepth`, `maxParenthesisDepth`, and `maxFunctionCallDepth`.
91
93
  Omit the argument, pass `None`, or omit a key to use its default. A field-level `None`
@@ -93,15 +95,26 @@ disables that check; a nonnegative integer overrides it. For example:
93
95
 
94
96
  ```python
95
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})
96
100
  ```
97
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
+
98
110
  Parser depth defaults to 1024 logical levels on native targets (32 on WASM) and is
99
111
  checked during parsing, before an AST exists. Zero rejects parsing descents.
100
112
  Other checks remain independent.
101
113
  Raising or disabling limits can permit stack exhaustion and process termination,
102
114
  even for trusted generated SQL. Increasing a limit does not increase stack space;
103
115
  these limits are not general time/memory budgets. Application owners should control
104
- overrides. Parsing APIs without guard options inherit the default protection.
116
+ overrides. Other SQL-consuming helpers, including lineage and optimization,
117
+ continue to inherit default protection.
105
118
 
106
119
  ### Format Guard Behavior
107
120
 
@@ -338,9 +351,47 @@ Unknown dialect names raise built-in `ValueError`.
338
351
  - `bool(result)` works (`True` when valid)
339
352
 
340
353
  `strict_syntax=True` rejects compatibility forms such as trailing commas before
341
- clause boundaries. `semantic=True` adds warning diagnostics W001-W004 for
342
- `SELECT *`, mixed aggregate projections, `DISTINCT` with `ORDER BY`, and
343
- `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.
344
395
 
345
396
  Each `ValidationErrorInfo` has:
346
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.11.0" }
103
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.12.1" }
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.11.0", optional = true, default-features = false }
110
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.12.1", 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.11.0", default-features = false }
28
+ polyglot-sql = { version = "0.12.1", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.11.0",
33
+ version = "0.12.1",
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.11.0",
47
+ version = "0.12.1",
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.11.0",
54
+ version = "0.12.1",
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
 
@@ -210,10 +210,70 @@ fn bench_tokenize_and_parse(c: &mut Criterion) {
210
210
  guards.finish();
211
211
  }
212
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
+
213
272
  criterion_group!(
214
273
  benches,
215
274
  bench_dialect_construction,
216
275
  bench_fresh_vs_reused_dialect,
217
- bench_tokenize_and_parse
276
+ bench_tokenize_and_parse,
277
+ bench_validation_and_analysis
218
278
  );
219
279
  criterion_main!(benches);