polyglot-sql 0.12.1__tar.gz → 0.13.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 (230) hide show
  1. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/Cargo.lock +6 -6
  2. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/Cargo.toml +1 -1
  3. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/PKG-INFO +2 -2
  4. {polyglot_sql-0.12.1/crates/polyglot-sql-python → polyglot_sql-0.13.1}/README.md +1 -1
  5. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/Cargo.toml +6 -3
  6. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/README.md +5 -5
  7. polyglot_sql-0.13.1/crates/polyglot-sql/benches/allocation_hotspots.rs +167 -0
  8. polyglot_sql-0.13.1/crates/polyglot-sql/benches/common/mod.rs +93 -0
  9. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/performance_hotspots.rs +44 -55
  10. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/transpile.rs +45 -1
  11. polyglot_sql-0.13.1/crates/polyglot-sql/src/ast_children.rs +190 -0
  12. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/ast_mutation.rs +38 -13
  13. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/ast_transforms.rs +253 -10
  14. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/builder/mod.rs +3 -0
  15. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/bigquery.rs +103 -4
  16. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/clickhouse.rs +10 -0
  17. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/databricks.rs +2 -0
  18. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/duckdb.rs +738 -28
  19. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/exasol.rs +2 -0
  20. polyglot_sql-0.13.1/crates/polyglot-sql/src/dialects/hana.rs +39 -0
  21. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/mod.rs +315 -69
  22. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/mysql.rs +3 -0
  23. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/aggregates.rs +19 -0
  24. polyglot_sql-0.13.1/crates/polyglot-sql/src/dialects/normalization/hana.rs +151 -0
  25. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/json.rs +6 -0
  26. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/mod.rs +51 -15
  27. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/operators.rs +5 -2
  28. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/scalar.rs +78 -4
  29. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/statements.rs +3 -24
  30. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/temporal.rs +430 -0
  31. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/types.rs +5 -4
  32. polyglot_sql-0.13.1/crates/polyglot-sql/src/dialects/normalization/vertica.rs +880 -0
  33. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/oracle.rs +2 -0
  34. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/postgres.rs +12 -0
  35. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/presto.rs +10 -0
  36. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/redshift.rs +4 -0
  37. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/snowflake.rs +30 -0
  38. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/spark.rs +4 -0
  39. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/trino.rs +4 -0
  40. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/tsql.rs +2 -2
  41. polyglot_sql-0.13.1/crates/polyglot-sql/src/dialects/vertica.rs +319 -0
  42. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/expressions.rs +650 -3
  43. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/format_tokens.rs +51 -0
  44. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/function_registry.rs +329 -0
  45. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/generator.rs +3685 -374
  46. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/lib.rs +1 -0
  47. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/lineage.rs +80 -18
  48. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/annotate_types.rs +64 -1
  49. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/canonicalize.rs +17 -27
  50. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +15 -3
  51. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +2 -0
  52. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +17 -0
  53. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/set_operation_types.rs +3 -1
  54. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/parser.rs +3212 -167
  55. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/resolver.rs +41 -3
  56. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/scope.rs +79 -18
  57. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/tokens.rs +4 -0
  58. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/transforms.rs +25 -8
  59. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/traversal.rs +131 -8
  60. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/validation/tests.rs +201 -0
  61. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/validation.rs +47 -8
  62. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/common/known_failures.rs +13 -0
  63. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/common/test_runner.rs +2 -0
  64. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_dialect_tests.rs +1639 -0
  65. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/ddl.json +66 -0
  66. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/dml.json +51 -0
  67. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/functions.json +136 -0
  68. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/identity.json +163 -0
  69. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/select.json +128 -0
  70. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/hana/types.json +39 -0
  71. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/vertica/identity.json +215 -0
  72. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/vertica/transpilation.json +188 -0
  73. polyglot_sql-0.13.1/crates/polyglot-sql/tests/custom_fixtures/vertica/types.json +50 -0
  74. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/deep_nesting_regression.rs +29 -0
  75. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/dialect_matrix.rs +1299 -2
  76. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/query_analysis.rs +83 -0
  77. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/transform_regression.rs +212 -0
  78. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-ast-derive/src/lib.rs +97 -55
  79. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/README.md +1 -1
  80. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1/crates/polyglot-sql-python}/README.md +1 -1
  81. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/dialects.rs +2 -0
  82. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/expr_types.rs +6 -0
  83. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_dialects.py +2 -0
  84. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_expression.py +25 -0
  85. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_transpile.py +22 -0
  86. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/python/polyglot_sql/__init__.py +12 -0
  87. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/python/polyglot_sql/__init__.pyi +6 -0
  88. polyglot_sql-0.12.1/crates/polyglot-sql/benches/allocation_hotspots.rs +0 -122
  89. polyglot_sql-0.12.1/crates/polyglot-sql/src/ast_children.rs +0 -105
  90. polyglot_sql-0.12.1/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -274
  91. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/ast_traversal.rs +0 -0
  92. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/in_list.rs +0 -0
  93. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/lineage.rs +0 -0
  94. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/parsing.rs +0 -0
  95. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  96. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  97. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  98. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/ast_json.rs +0 -0
  99. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/binding.rs +0 -0
  100. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/builder/plan.rs +0 -0
  101. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  102. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  103. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  104. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  105. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  106. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  107. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  108. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  109. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  110. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  111. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  112. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  113. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/collections.rs +0 -0
  114. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/normalization/postgres_interval.rs +0 -0
  115. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  116. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  117. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  118. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  119. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  120. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  121. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  122. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  123. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/diff.rs +0 -0
  124. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/error.rs +0 -0
  125. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  126. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/guard.rs +0 -0
  127. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/helper.rs +0 -0
  128. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/openlineage.rs +0 -0
  129. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  130. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  131. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  132. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  133. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  134. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  135. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  136. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  137. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  138. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  139. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/optimizer/subquery.rs +0 -0
  140. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/planner.rs +0 -0
  141. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/query_analysis/column_uses.rs +0 -0
  142. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/query_analysis.rs +0 -0
  143. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/schema.rs +0 -0
  144. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/set_operation.rs +0 -0
  145. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/time.rs +0 -0
  146. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/trie.rs +0 -0
  147. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/src/validation/semantics.rs +0 -0
  148. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  149. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  150. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  151. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  152. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/create_view_security_comment_regression.rs +0 -0
  153. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  154. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  155. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  156. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  157. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  158. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  159. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  160. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  161. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  162. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  163. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  164. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/data_type_api.rs +0 -0
  165. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  166. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  167. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  168. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/identity_roundtrip.rs +0 -0
  169. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/oracle_data_types_regression.rs +0 -0
  170. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/postgres_explain_options.rs +0 -0
  171. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/postgres_regexp_clickhouse.rs +0 -0
  172. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  173. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/query_analysis_regression.rs +0 -0
  174. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  175. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_compat.rs +0 -0
  176. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  177. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  178. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  179. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  180. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  181. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  182. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  183. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  184. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  185. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-ast-derive/Cargo.toml +0 -0
  186. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  187. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  188. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  189. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  190. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  191. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  192. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/Cargo.toml +0 -0
  193. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/docs/api.md +0 -0
  194. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/docs/index.md +0 -0
  195. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  196. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  197. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/builders.rs +0 -0
  198. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/diff.rs +0 -0
  199. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/errors.rs +0 -0
  200. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/expr.rs +0 -0
  201. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/format.rs +0 -0
  202. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/generate.rs +0 -0
  203. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  204. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/lib.rs +0 -0
  205. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  206. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  207. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  208. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/parse.rs +0 -0
  209. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/query_analysis.rs +0 -0
  210. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  211. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  212. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  213. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/types.rs +0 -0
  214. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/src/validate.rs +0 -0
  215. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  216. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_builders.py +0 -0
  217. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  218. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  219. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  220. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  221. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  222. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  223. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  224. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_query_analysis.py +0 -0
  225. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  226. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  227. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/crates/polyglot-sql-python/uv.lock +0 -0
  228. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/pyproject.toml +0 -0
  229. {polyglot_sql-0.12.1 → polyglot_sql-0.13.1}/python/polyglot_sql/analysis_types.py +0 -0
  230. {polyglot_sql-0.12.1 → polyglot_sql-0.13.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.12.1"
608
+ version = "0.13.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.12.1"
626
+ version = "0.13.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.12.1"
635
+ version = "0.13.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.12.1"
645
+ version = "0.13.1"
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-python"
649
- version = "0.12.1"
649
+ version = "0.13.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.12.1"
660
+ version = "0.13.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.12.1"
9
+ version = "0.13.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.12.1
3
+ Version: 0.13.1
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -356,7 +356,7 @@ All functions are exported from `polyglot_sql`.
356
356
 
357
357
  Current dialect names returned by `polyglot_sql.dialects()`:
358
358
 
359
- `athena`, `bigquery`, `clickhouse`, `cockroachdb`, `datafusion`, `databricks`, `doris`, `dremio`, `drill`, `druid`, `duckdb`, `dune`, `exasol`, `fabric`, `generic`, `hive`, `materialize`, `mysql`, `oracle`, `postgres`, `presto`, `redshift`, `risingwave`, `singlestore`, `snowflake`, `solr`, `spark`, `sqlite`, `starrocks`, `tableau`, `teradata`, `tidb`, `trino`, `tsql`.
359
+ `athena`, `bigquery`, `clickhouse`, `cockroachdb`, `datafusion`, `databricks`, `doris`, `dremio`, `drill`, `druid`, `duckdb`, `dune`, `exasol`, `fabric`, `generic`, `hana`, `hive`, `materialize`, `mysql`, `oracle`, `postgres`, `presto`, `redshift`, `risingwave`, `singlestore`, `snowflake`, `solr`, `spark`, `sqlite`, `starrocks`, `tableau`, `teradata`, `tidb`, `trino`, `tsql`, `vertica`.
360
360
 
361
361
  ## Error Handling
362
362
 
@@ -329,7 +329,7 @@ All functions are exported from `polyglot_sql`.
329
329
 
330
330
  Current dialect names returned by `polyglot_sql.dialects()`:
331
331
 
332
- `athena`, `bigquery`, `clickhouse`, `cockroachdb`, `datafusion`, `databricks`, `doris`, `dremio`, `drill`, `druid`, `duckdb`, `dune`, `exasol`, `fabric`, `generic`, `hive`, `materialize`, `mysql`, `oracle`, `postgres`, `presto`, `redshift`, `risingwave`, `singlestore`, `snowflake`, `solr`, `spark`, `sqlite`, `starrocks`, `tableau`, `teradata`, `tidb`, `trino`, `tsql`.
332
+ `athena`, `bigquery`, `clickhouse`, `cockroachdb`, `datafusion`, `databricks`, `doris`, `dremio`, `drill`, `druid`, `duckdb`, `dune`, `exasol`, `fabric`, `generic`, `hana`, `hive`, `materialize`, `mysql`, `oracle`, `postgres`, `presto`, `redshift`, `risingwave`, `singlestore`, `snowflake`, `solr`, `spark`, `sqlite`, `starrocks`, `tableau`, `teradata`, `tidb`, `trino`, `tsql`, `vertica`.
333
333
 
334
334
  ## Error Handling
335
335
 
@@ -48,7 +48,8 @@ all-dialects = [
48
48
  "dialect-singlestore", "dialect-cockroachdb", "dialect-tidb",
49
49
  "dialect-druid", "dialect-solr", "dialect-tableau",
50
50
  "dialect-dune", "dialect-fabric", "dialect-drill",
51
- "dialect-dremio", "dialect-exasol", "dialect-datafusion",
51
+ "dialect-dremio", "dialect-exasol", "dialect-datafusion", "dialect-hana",
52
+ "dialect-vertica",
52
53
  ]
53
54
  dialect-postgresql = []
54
55
  dialect-mysql = []
@@ -83,6 +84,8 @@ dialect-drill = []
83
84
  dialect-dremio = []
84
85
  dialect-exasol = []
85
86
  dialect-datafusion = []
87
+ dialect-hana = []
88
+ dialect-vertica = []
86
89
  function-catalog-clickhouse = [
87
90
  "semantic",
88
91
  "dep:polyglot-sql-function-catalogs",
@@ -100,14 +103,14 @@ function-catalog-all-dialects = [
100
103
  ]
101
104
 
102
105
  [dependencies]
103
- polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.12.1" }
106
+ polyglot-sql-ast-derive = { path = "../polyglot-sql-ast-derive", version = "0.13.1" }
104
107
  serde = { workspace = true }
105
108
  serde_json = { workspace = true }
106
109
  thiserror = { workspace = true }
107
110
  unicode-segmentation = { workspace = true }
108
111
  stacker = { version = "0.1", optional = true }
109
112
  ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
110
- polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.12.1", optional = true, default-features = false }
113
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.13.1", optional = true, default-features = false }
111
114
 
112
115
  [dev-dependencies]
113
116
  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.12.1", default-features = false }
28
+ polyglot-sql = { version = "0.13.1", default-features = false }
29
29
  ```
30
30
 
31
31
  ```toml
32
32
  polyglot-sql = {
33
- version = "0.12.1",
33
+ version = "0.13.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.12.1",
47
+ version = "0.13.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.12.1",
54
+ version = "0.13.1",
55
55
  default-features = false,
56
56
  features = ["transpile", "dialect-clickhouse", "dialect-postgresql"],
57
57
  }
@@ -488,7 +488,7 @@ assert_eq!(err.line(), None);
488
488
 
489
489
  ## Supported Dialects
490
490
 
491
- Athena, BigQuery, ClickHouse, CockroachDB, DataFusion, Databricks, Doris, Dremio, Drill, Druid, DuckDB, Dune, Exasol, Fabric, Generic SQL, Hive, Materialize, MySQL, Oracle, PostgreSQL, Presto, Redshift, RisingWave, SingleStore, Snowflake, Solr, Spark, SQLite, StarRocks, Tableau, Teradata, TiDB, Trino, TSQL
491
+ Athena, BigQuery, ClickHouse, CockroachDB, DataFusion, Databricks, Doris, Dremio, Drill, Druid, DuckDB, Dune, Exasol, Fabric, Generic SQL, SAP HANA, Hive, Materialize, MySQL, Oracle, PostgreSQL, Presto, Redshift, RisingWave, SingleStore, Snowflake, Solr, Spark, SQLite, StarRocks, Tableau, Teradata, TiDB, Trino, TSQL, Vertica
492
492
 
493
493
  ## Feature Flags
494
494
 
@@ -0,0 +1,167 @@
1
+ use polyglot_sql::dialects::{Dialect, DialectType};
2
+ use stats_alloc::{Region, Stats, StatsAlloc, INSTRUMENTED_SYSTEM};
3
+ use std::alloc::System;
4
+ use std::hint::black_box;
5
+
6
+ mod common;
7
+
8
+ use common::{
9
+ large_strings, large_token_list, many_columns, many_numbers, nested_functions,
10
+ COMMENT_AND_STRING_HEAVY, SHORT_ASCII, UNICODE,
11
+ };
12
+
13
+ #[global_allocator]
14
+ static GLOBAL: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;
15
+
16
+ fn measure<T>(operation: impl FnOnce() -> T) -> Stats {
17
+ let region = Region::new(GLOBAL);
18
+ black_box(operation());
19
+ region.change()
20
+ }
21
+
22
+ fn print_stats(case: &str, operation: &str, input_bytes: usize, stats: Stats) {
23
+ println!(
24
+ "{{\"case\":\"{case}\",\"operation\":\"{operation}\",\"input_bytes\":{input_bytes},\"allocations\":{},\"deallocations\":{},\"bytes_allocated\":{},\"bytes_deallocated\":{}}}",
25
+ stats.allocations,
26
+ stats.deallocations,
27
+ stats.bytes_allocated,
28
+ stats.bytes_deallocated,
29
+ );
30
+ }
31
+
32
+ fn compound_row_limits() {
33
+ for branches in [1, 10, 100] {
34
+ let body = vec!["SELECT a FROM t"; branches].join(" UNION ALL ");
35
+ for (name, source, target, tail) in [
36
+ (
37
+ "count",
38
+ DialectType::PostgreSQL,
39
+ DialectType::Oracle,
40
+ "LIMIT 5 OFFSET 2",
41
+ ),
42
+ (
43
+ "percent",
44
+ DialectType::DuckDB,
45
+ DialectType::Oracle,
46
+ "LIMIT 10 PERCENT",
47
+ ),
48
+ (
49
+ "fetch",
50
+ DialectType::Oracle,
51
+ DialectType::DuckDB,
52
+ "OFFSET 2 ROWS FETCH NEXT 5 ROWS ONLY",
53
+ ),
54
+ ] {
55
+ let sql = format!("{body} ORDER BY a {tail}");
56
+ let dialect = Dialect::get(source);
57
+ let writer = Dialect::get(target);
58
+ let ast = dialect.parse(&sql).unwrap();
59
+ let case = format!("compound/{name}/{branches}");
60
+ print_stats(
61
+ &case,
62
+ "parse",
63
+ sql.len(),
64
+ measure(|| dialect.parse(&sql).unwrap()),
65
+ );
66
+ print_stats(
67
+ &case,
68
+ "generate",
69
+ sql.len(),
70
+ measure(|| writer.generate(&ast[0]).unwrap()),
71
+ );
72
+ print_stats(
73
+ &case,
74
+ "transpile",
75
+ sql.len(),
76
+ measure(|| dialect.transpile(&sql, target).unwrap()),
77
+ );
78
+ }
79
+ }
80
+ }
81
+
82
+ fn main() {
83
+ compound_row_limits();
84
+ let dialect = Dialect::get(DialectType::PostgreSQL);
85
+ let large = large_token_list();
86
+ let columns = many_columns();
87
+ let functions = nested_functions();
88
+ let strings = large_strings();
89
+ let numbers = many_numbers();
90
+ let generic_functions = format!(
91
+ "SELECT {} FROM t",
92
+ (0..1_000)
93
+ .map(|i| format!("my_udf(c{i}) AS v{i}"))
94
+ .collect::<Vec<_>>()
95
+ .join(", ")
96
+ );
97
+ let inputs = [
98
+ ("short_ascii", SHORT_ASCII),
99
+ ("unicode", UNICODE),
100
+ ("comments_strings", COMMENT_AND_STRING_HEAVY),
101
+ ("large_tokens", large.as_str()),
102
+ ("many_columns", columns.as_str()),
103
+ ("nested_functions", functions.as_str()),
104
+ ("large_strings", strings.as_str()),
105
+ ("many_numbers", numbers.as_str()),
106
+ ("generic_functions", generic_functions.as_str()),
107
+ ];
108
+
109
+ black_box(dialect.tokenize(SHORT_ASCII).unwrap());
110
+ black_box(dialect.parse(SHORT_ASCII).unwrap());
111
+ black_box(Dialect::get(DialectType::PostgreSQL));
112
+
113
+ for (case, sql) in inputs {
114
+ print_stats(
115
+ case,
116
+ "tokenize",
117
+ sql.len(),
118
+ measure(|| dialect.tokenize(sql).unwrap()),
119
+ );
120
+ print_stats(
121
+ case,
122
+ "parse",
123
+ sql.len(),
124
+ measure(|| dialect.parse(sql).unwrap()),
125
+ );
126
+ }
127
+
128
+ print_stats(
129
+ "postgresql",
130
+ "dialect_get",
131
+ 0,
132
+ measure(|| Dialect::get(DialectType::PostgreSQL)),
133
+ );
134
+
135
+ for depth in [10, 20, 40, 80] {
136
+ let mut sql = "SELECT 1".to_owned();
137
+ for _ in 0..depth {
138
+ sql = format!("SELECT ({sql})");
139
+ }
140
+ for kind in [DialectType::PostgreSQL, DialectType::HANA] {
141
+ let dialect = Dialect::get(kind);
142
+ black_box(dialect.parse(&sql).unwrap());
143
+ print_stats(
144
+ &format!("nested_{depth}_{kind}"),
145
+ "parse",
146
+ sql.len(),
147
+ measure(|| dialect.parse(&sql).unwrap()),
148
+ );
149
+ }
150
+ }
151
+
152
+ #[cfg(feature = "transpile")]
153
+ {
154
+ let options = polyglot_sql::TranspileOptions::strict();
155
+ for (name, sql) in common::transpilation_queries() {
156
+ let run =
157
+ || polyglot_sql::transpile_with_by_name(&sql, "hana", "duckdb", &options).unwrap();
158
+ black_box(run());
159
+ print_stats(
160
+ &format!("hana_{name}"),
161
+ "transpile",
162
+ sql.len(),
163
+ measure(run),
164
+ );
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,93 @@
1
+ //! SQL inputs shared by the latency and allocation hotspot benchmarks.
2
+ //! Dialect selection stays in the callers, so both suites use identical fixtures.
3
+
4
+ pub(super) const SHORT_ASCII: &str =
5
+ "SELECT a, b, SUM(c) AS total FROM events WHERE created_at >= '2025-01-01' GROUP BY a, b";
6
+
7
+ pub(super) const UNICODE: &str =
8
+ "SELECT \"Kundennummer\", 'Gr\u{00fc}\u{00df}e aus Z\u{00fc}rich' AS \"Mitteilung\" FROM \"Bestellungen\" WHERE \"Stadt\" = 'M\u{00fc}nchen'";
9
+
10
+ pub(super) const COMMENT_AND_STRING_HEAVY: &str = r#"
11
+ -- leading comment
12
+ SELECT 'alpha''beta' AS value, "quoted name", E'line\nvalue'
13
+ FROM events /* source comment */
14
+ WHERE payload = '{"key":"value"}' -- trailing comment
15
+ "#;
16
+
17
+ pub(super) fn large_token_list() -> String {
18
+ let values = (0..20_000)
19
+ .map(|value| value.to_string())
20
+ .collect::<Vec<_>>()
21
+ .join(", ");
22
+ format!("SELECT * FROM events WHERE event_id IN ({values})")
23
+ }
24
+
25
+ pub(super) fn many_columns() -> String {
26
+ format!(
27
+ "SELECT {} FROM t",
28
+ (0..1_000)
29
+ .map(|index| format!("c{index}"))
30
+ .collect::<Vec<_>>()
31
+ .join(", ")
32
+ )
33
+ }
34
+
35
+ pub(super) fn nested_functions() -> String {
36
+ format!(
37
+ "SELECT {}x{} FROM t",
38
+ "COALESCE(".repeat(20),
39
+ ", NULL)".repeat(20)
40
+ )
41
+ }
42
+
43
+ pub(super) fn large_strings() -> String {
44
+ format!(
45
+ "SELECT {} FROM t",
46
+ vec![format!("'{}'", "x".repeat(100)); 500].join(", ")
47
+ )
48
+ }
49
+
50
+ pub(super) fn many_numbers() -> String {
51
+ format!(
52
+ "SELECT {} FROM t",
53
+ (0..10_000)
54
+ .map(|value| value.to_string())
55
+ .collect::<Vec<_>>()
56
+ .join(", ")
57
+ )
58
+ }
59
+
60
+ #[cfg(feature = "transpile")]
61
+ pub(super) fn transpilation_queries() -> Vec<(&'static str, String)> {
62
+ vec![
63
+ ("short", "SELECT COALESCE(x, 0) FROM t".to_owned()),
64
+ (
65
+ "wide",
66
+ format!(
67
+ "SELECT {} FROM t",
68
+ (0..100)
69
+ .map(|i| format!("COALESCE(c{i}, 0) AS v{i}"))
70
+ .collect::<Vec<_>>()
71
+ .join(", ")
72
+ ),
73
+ ),
74
+ (
75
+ "nested",
76
+ format!(
77
+ "SELECT {}x{} FROM t",
78
+ "COALESCE(".repeat(20),
79
+ ", 0)".repeat(20)
80
+ ),
81
+ ),
82
+ (
83
+ "casts",
84
+ format!(
85
+ "SELECT {}",
86
+ (0..100)
87
+ .map(|i| format!("CAST({i}.123 AS DECIMAL(10, 2)) AS v{i}"))
88
+ .collect::<Vec<_>>()
89
+ .join(", ")
90
+ ),
91
+ ),
92
+ ]
93
+ }
@@ -4,18 +4,12 @@ use polyglot_sql::parser::{Parser, ParserConfig};
4
4
  use polyglot_sql::ComplexityGuardOptions;
5
5
  use std::time::Duration;
6
6
 
7
- const SHORT_ASCII: &str =
8
- "SELECT a, b, SUM(c) AS total FROM events WHERE created_at >= '2025-01-01' GROUP BY a, b";
7
+ mod common;
9
8
 
10
- const UNICODE: &str =
11
- "SELECT \"Kundennummer\", 'Gr\u{00fc}\u{00df}e aus Z\u{00fc}rich' AS \"Mitteilung\" FROM \"Bestellungen\" WHERE \"Stadt\" = 'M\u{00fc}nchen'";
12
-
13
- const COMMENT_AND_STRING_HEAVY: &str = r#"
14
- -- leading comment
15
- SELECT 'alpha''beta' AS value, "quoted name", E'line\nvalue'
16
- FROM events /* source comment */
17
- WHERE payload = '{"key":"value"}' -- trailing comment
18
- "#;
9
+ use common::{
10
+ large_strings, large_token_list, many_columns, many_numbers, nested_functions,
11
+ COMMENT_AND_STRING_HEAVY, SHORT_ASCII, UNICODE,
12
+ };
19
13
 
20
14
  const TPCH_STYLE: &str = r#"
21
15
  WITH regional_sales AS (
@@ -36,49 +30,6 @@ WHERE ranked.position <= 10
36
30
  ORDER BY ranked.revenue DESC
37
31
  "#;
38
32
 
39
- fn large_token_list() -> String {
40
- let values = (0..20_000)
41
- .map(|value| value.to_string())
42
- .collect::<Vec<_>>()
43
- .join(", ");
44
- format!("SELECT * FROM events WHERE event_id IN ({values})")
45
- }
46
-
47
- fn many_columns() -> String {
48
- format!(
49
- "SELECT {} FROM t",
50
- (0..1_000)
51
- .map(|index| format!("c{index}"))
52
- .collect::<Vec<_>>()
53
- .join(", ")
54
- )
55
- }
56
-
57
- fn nested_functions() -> String {
58
- format!(
59
- "SELECT {}x{} FROM t",
60
- "COALESCE(".repeat(20),
61
- ", NULL)".repeat(20)
62
- )
63
- }
64
-
65
- fn large_strings() -> String {
66
- format!(
67
- "SELECT {} FROM t",
68
- vec![format!("'{}'", "x".repeat(100)); 500].join(", ")
69
- )
70
- }
71
-
72
- fn many_numbers() -> String {
73
- format!(
74
- "SELECT {} FROM t",
75
- (0..10_000)
76
- .map(|value| value.to_string())
77
- .collect::<Vec<_>>()
78
- .join(", ")
79
- )
80
- }
81
-
82
33
  fn disabled_guards() -> ComplexityGuardOptions {
83
34
  ComplexityGuardOptions {
84
35
  max_parser_depth: None,
@@ -269,11 +220,49 @@ fn bench_validation_and_analysis(c: &mut Criterion) {
269
220
  let _ = c;
270
221
  }
271
222
 
223
+ fn bench_hana_nested_queries(c: &mut Criterion) {
224
+ let mut group = c.benchmark_group("nested_query_dialects");
225
+ for depth in [10, 20, 40, 80] {
226
+ let mut sql = "SELECT 1".to_owned();
227
+ for _ in 0..depth {
228
+ sql = format!("SELECT ({sql})");
229
+ }
230
+ for kind in [DialectType::PostgreSQL, DialectType::HANA] {
231
+ let dialect = Dialect::get(kind);
232
+ group.bench_with_input(BenchmarkId::new(kind.to_string(), depth), &sql, |b, sql| {
233
+ b.iter(|| dialect.parse(black_box(sql)).unwrap());
234
+ });
235
+ }
236
+ }
237
+ group.finish();
238
+ }
239
+
240
+ fn bench_hana_source_validation(c: &mut Criterion) {
241
+ #[cfg(feature = "transpile")]
242
+ {
243
+ let options = polyglot_sql::TranspileOptions::strict();
244
+ let mut group = c.benchmark_group("hana_source_validation");
245
+ for (name, sql) in common::transpilation_queries() {
246
+ group.bench_with_input(BenchmarkId::from_parameter(name), &sql, |b, sql| {
247
+ b.iter(|| {
248
+ polyglot_sql::transpile_with_by_name(black_box(sql), "hana", "duckdb", &options)
249
+ .unwrap()
250
+ });
251
+ });
252
+ }
253
+ group.finish();
254
+ }
255
+ #[cfg(not(feature = "transpile"))]
256
+ let _ = c;
257
+ }
258
+
272
259
  criterion_group!(
273
260
  benches,
274
261
  bench_dialect_construction,
275
262
  bench_fresh_vs_reused_dialect,
276
263
  bench_tokenize_and_parse,
277
- bench_validation_and_analysis
264
+ bench_validation_and_analysis,
265
+ bench_hana_nested_queries,
266
+ bench_hana_source_validation
278
267
  );
279
268
  criterion_main!(benches);
@@ -167,10 +167,54 @@ fn bench_roundtrip(c: &mut Criterion) {
167
167
  group.finish();
168
168
  }
169
169
 
170
+ fn bench_compound_row_limits(c: &mut Criterion) {
171
+ use polyglot_sql::dialects::Dialect;
172
+ use std::time::Duration;
173
+
174
+ let mut group = c.benchmark_group("compound_row_limits");
175
+ group.sample_size(30);
176
+ group.warm_up_time(Duration::from_millis(500));
177
+ group.measurement_time(Duration::from_secs(2));
178
+ for branches in [1, 10, 100] {
179
+ let body = vec!["SELECT a FROM t"; branches].join(" UNION ALL ");
180
+ for (name, source, target, tail) in [
181
+ (
182
+ "count",
183
+ DialectType::PostgreSQL,
184
+ DialectType::Oracle,
185
+ "LIMIT 5 OFFSET 2",
186
+ ),
187
+ (
188
+ "percent",
189
+ DialectType::DuckDB,
190
+ DialectType::Oracle,
191
+ "LIMIT 10 PERCENT",
192
+ ),
193
+ (
194
+ "fetch",
195
+ DialectType::Oracle,
196
+ DialectType::DuckDB,
197
+ "OFFSET 2 ROWS FETCH NEXT 5 ROWS ONLY",
198
+ ),
199
+ ] {
200
+ let sql = format!("{body} ORDER BY a {tail}");
201
+ let dialect = Dialect::get(source);
202
+ group.bench_function(format!("parse/{name}/{branches}"), |b| {
203
+ b.iter(|| dialect.parse(black_box(&sql)).unwrap())
204
+ });
205
+ group.bench_function(format!("transpile/{name}/{branches}"), |b| {
206
+ b.iter(|| transpile(black_box(&sql), source, target).unwrap())
207
+ });
208
+ }
209
+ }
210
+ group.finish();
211
+ }
212
+
170
213
  criterion_group!(
171
214
  benches,
172
215
  bench_transpile_by_query_size,
173
216
  bench_transpile_dialect_pairs,
174
- bench_roundtrip
217
+ bench_roundtrip,
218
+ bench_compound_row_limits
175
219
  );
176
220
  criterion_main!(benches);