polyglot-sql 0.4.0__tar.gz → 0.4.2__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 (174) hide show
  1. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/Cargo.lock +5 -5
  2. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/Cargo.toml +1 -1
  3. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/PKG-INFO +1 -1
  4. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/Cargo.toml +2 -2
  5. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/bigquery.rs +32 -0
  6. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/expressions.rs +2 -2
  7. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/generator.rs +10 -1
  8. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/lineage.rs +91 -5
  9. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/openlineage.rs +53 -1
  10. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/subquery.rs +19 -3
  11. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/parser.rs +70 -26
  12. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/identity_roundtrip.rs +1 -0
  13. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_compat.rs +16 -0
  14. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/README.md +0 -0
  15. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/README.md +0 -0
  16. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/in_list.rs +0 -0
  17. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/parsing.rs +0 -0
  18. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/rust_parsing.rs +0 -0
  19. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/benches/transpile.rs +0 -0
  20. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/examples/basic_usage.rs +0 -0
  21. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/examples/bench_json.rs +0 -0
  22. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/ast_transforms.rs +0 -0
  23. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/builder.rs +0 -0
  24. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/athena.rs +0 -0
  25. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/clickhouse.rs +0 -0
  26. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/cockroachdb.rs +0 -0
  27. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/databricks.rs +0 -0
  28. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/datafusion.rs +0 -0
  29. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/doris.rs +0 -0
  30. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/dremio.rs +0 -0
  31. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/drill.rs +0 -0
  32. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/druid.rs +0 -0
  33. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/duckdb.rs +0 -0
  34. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/dune.rs +0 -0
  35. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/exasol.rs +0 -0
  36. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/fabric.rs +0 -0
  37. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/generic.rs +0 -0
  38. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/hive.rs +0 -0
  39. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/materialize.rs +0 -0
  40. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/mod.rs +0 -0
  41. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/mysql.rs +0 -0
  42. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/oracle.rs +0 -0
  43. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/postgres.rs +0 -0
  44. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/presto.rs +0 -0
  45. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/redshift.rs +0 -0
  46. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/risingwave.rs +0 -0
  47. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/singlestore.rs +0 -0
  48. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/snowflake.rs +0 -0
  49. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/solr.rs +0 -0
  50. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/spark.rs +0 -0
  51. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/sqlite.rs +0 -0
  52. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/starrocks.rs +0 -0
  53. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tableau.rs +0 -0
  54. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/teradata.rs +0 -0
  55. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tidb.rs +0 -0
  56. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/trino.rs +0 -0
  57. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/dialects/tsql.rs +0 -0
  58. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/diff.rs +0 -0
  59. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/error.rs +0 -0
  60. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/function_catalog.rs +0 -0
  61. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/function_registry.rs +0 -0
  62. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/helper.rs +0 -0
  63. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/lib.rs +0 -0
  64. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/annotate_types.rs +0 -0
  65. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/canonicalize.rs +0 -0
  66. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/eliminate_ctes.rs +0 -0
  67. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/eliminate_joins.rs +0 -0
  68. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/isolate_table_selects.rs +0 -0
  69. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/mod.rs +0 -0
  70. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/normalize.rs +0 -0
  71. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/normalize_identifiers.rs +0 -0
  72. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/optimize_joins.rs +0 -0
  73. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/optimizer.rs +0 -0
  74. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/pushdown_predicates.rs +0 -0
  75. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/pushdown_projections.rs +0 -0
  76. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/qualify_columns.rs +0 -0
  77. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/qualify_tables.rs +0 -0
  78. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/optimizer/simplify.rs +0 -0
  79. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/planner.rs +0 -0
  80. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/resolver.rs +0 -0
  81. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/schema.rs +0 -0
  82. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/scope.rs +0 -0
  83. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/time.rs +0 -0
  84. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/tokens.rs +0 -0
  85. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/transforms.rs +0 -0
  86. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/traversal.rs +0 -0
  87. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/trie.rs +0 -0
  88. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/validation/tests.rs +0 -0
  89. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/src/validation.rs +0 -0
  90. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/analyze_failures.rs +0 -0
  91. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/clickhouse_regression.rs +0 -0
  92. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/known_failures.rs +0 -0
  93. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/mod.rs +0 -0
  94. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/test_data.rs +0 -0
  95. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/common/test_runner.rs +0 -0
  96. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_clickhouse_coverage.rs +0 -0
  97. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_clickhouse_parser.rs +0 -0
  98. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_dialect.rs +0 -0
  99. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_dialect_tests.rs +0 -0
  100. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/ddl.json +0 -0
  101. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/dml.json +0 -0
  102. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/functions.json +0 -0
  103. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/identity.json +0 -0
  104. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/operators.json +0 -0
  105. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/select.json +0 -0
  106. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/transpilation.json +0 -0
  107. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/custom_fixtures/datafusion/types.json +0 -0
  108. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/deep_nesting_regression.rs +0 -0
  109. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/dialect_matrix.rs +0 -0
  110. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/error_handling.rs +0 -0
  111. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/fabric_regression.rs +0 -0
  112. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/fabric_tpch_regression.rs +0 -0
  113. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/issue201_regression_test.rs +0 -0
  114. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/postgres_sqlite_regression.rs +0 -0
  115. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/snowflake_regression_test.rs +0 -0
  116. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_dialect_identity.rs +0 -0
  117. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_identity.rs +0 -0
  118. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_identity_detailed.rs +0 -0
  119. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_parser.rs +0 -0
  120. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_pretty.rs +0 -0
  121. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_transpilation.rs +0 -0
  122. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/sqlglot_transpile.rs +0 -0
  123. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/tpch_transpile_stack.rs +0 -0
  124. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/transform_regression.rs +0 -0
  125. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql/tests/tsql_regression.rs +0 -0
  126. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/Cargo.toml +0 -0
  127. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/README.md +0 -0
  128. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/clickhouse.rs +0 -0
  129. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/duckdb.rs +0 -0
  130. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/src/lib.rs +0 -0
  131. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/tools/clickhouse/extract_functions.py +0 -0
  132. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-function-catalogs/tools/duckdb/extract_functions.py +0 -0
  133. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/Cargo.toml +0 -0
  134. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/README.md +0 -0
  135. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/docs/api.md +0 -0
  136. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/docs/index.md +0 -0
  137. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/mkdocs.yml +0 -0
  138. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/annotate_types.rs +0 -0
  139. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/dialects.rs +0 -0
  140. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/diff.rs +0 -0
  141. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/errors.rs +0 -0
  142. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/expr.rs +0 -0
  143. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/expr_types.rs +0 -0
  144. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/format.rs +0 -0
  145. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/generate.rs +0 -0
  146. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/helpers.rs +0 -0
  147. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/lib.rs +0 -0
  148. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/lineage.rs +0 -0
  149. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/openlineage.rs +0 -0
  150. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/optimize.rs +0 -0
  151. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/parse.rs +0 -0
  152. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/tokenize.rs +0 -0
  153. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/transforms.rs +0 -0
  154. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/transpile.rs +0 -0
  155. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/types.rs +0 -0
  156. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/src/validate.rs +0 -0
  157. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/conftest.py +0 -0
  158. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_compat.py +0 -0
  159. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_dialects.py +0 -0
  160. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_diff.py +0 -0
  161. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_expression.py +0 -0
  162. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_format.py +0 -0
  163. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_generate.py +0 -0
  164. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_lineage.py +0 -0
  165. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_optimize.py +0 -0
  166. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_parse.py +0 -0
  167. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_transforms.py +0 -0
  168. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_transpile.py +0 -0
  169. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/tests/test_validate.py +0 -0
  170. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/crates/polyglot-sql-python/uv.lock +0 -0
  171. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/pyproject.toml +0 -0
  172. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/python/polyglot_sql/__init__.py +0 -0
  173. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/python/polyglot_sql/__init__.pyi +0 -0
  174. {polyglot_sql-0.4.0 → polyglot_sql-0.4.2}/python/polyglot_sql/py.typed +0 -0
@@ -605,7 +605,7 @@ dependencies = [
605
605
 
606
606
  [[package]]
607
607
  name = "polyglot-sql"
608
- version = "0.4.0"
608
+ version = "0.4.2"
609
609
  dependencies = [
610
610
  "criterion",
611
611
  "once_cell",
@@ -621,7 +621,7 @@ dependencies = [
621
621
 
622
622
  [[package]]
623
623
  name = "polyglot-sql-ffi"
624
- version = "0.4.0"
624
+ version = "0.4.2"
625
625
  dependencies = [
626
626
  "cbindgen",
627
627
  "polyglot-sql",
@@ -631,11 +631,11 @@ dependencies = [
631
631
 
632
632
  [[package]]
633
633
  name = "polyglot-sql-function-catalogs"
634
- version = "0.4.0"
634
+ version = "0.4.2"
635
635
 
636
636
  [[package]]
637
637
  name = "polyglot-sql-python"
638
- version = "0.4.0"
638
+ version = "0.4.2"
639
639
  dependencies = [
640
640
  "polyglot-sql",
641
641
  "pyo3",
@@ -646,7 +646,7 @@ dependencies = [
646
646
 
647
647
  [[package]]
648
648
  name = "polyglot-sql-wasm"
649
- version = "0.4.0"
649
+ version = "0.4.2"
650
650
  dependencies = [
651
651
  "console_error_panic_hook",
652
652
  "js-sys",
@@ -6,7 +6,7 @@ exclude = [
6
6
  ]
7
7
 
8
8
  [workspace.package]
9
- version = "0.4.0"
9
+ version = "0.4.2"
10
10
  edition = "2021"
11
11
  license = "MIT"
12
12
  authors = ["polyglot contributors"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: polyglot-sql
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -28,7 +28,7 @@ generate = []
28
28
  transpile = ["generate"]
29
29
  builder = ["generate"]
30
30
  ast-tools = []
31
- semantic = ["generate", "ast-tools"]
31
+ semantic = ["ast-tools"]
32
32
  openlineage = ["semantic"]
33
33
  diff = ["generate"]
34
34
  planner = []
@@ -106,7 +106,7 @@ thiserror = { workspace = true }
106
106
  unicode-segmentation = { workspace = true }
107
107
  stacker = { version = "0.1", optional = true }
108
108
  ts-rs = { version = "12.0", features = ["serde-compat"], optional = true }
109
- polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.4.0", optional = true, default-features = false }
109
+ polyglot-sql-function-catalogs = { path = "../polyglot-sql-function-catalogs", version = "0.4.2", optional = true, default-features = false }
110
110
 
111
111
  [dev-dependencies]
112
112
  pretty_assertions = "1.4"
@@ -1587,6 +1587,38 @@ mod tests {
1587
1587
  assert_eq!(result, expected, "SQL: {}", sql);
1588
1588
  }
1589
1589
 
1590
+ #[test]
1591
+ fn test_safe_namespace_parses_as_function() {
1592
+ let expr = parse_one(
1593
+ "SELECT SAFE.PARSE_JSON(data) AS json_data FROM t",
1594
+ DialectType::BigQuery,
1595
+ )
1596
+ .expect("parse");
1597
+
1598
+ let Expression::Select(select) = expr else {
1599
+ panic!("expected SELECT");
1600
+ };
1601
+ let Expression::Alias(alias) = &select.expressions[0] else {
1602
+ panic!("expected alias");
1603
+ };
1604
+ let Expression::Function(function) = &alias.this else {
1605
+ panic!("expected SAFE namespace call to parse as Function");
1606
+ };
1607
+
1608
+ assert_eq!(function.name, "SAFE.PARSE_JSON");
1609
+ assert_eq!(function.args.len(), 1);
1610
+ }
1611
+
1612
+ #[test]
1613
+ fn test_safe_namespace_identity() {
1614
+ bigquery_identity("SAFE.PARSE_JSON(data)", "SAFE.PARSE_JSON(data)");
1615
+ bigquery_identity(
1616
+ "SAFE.PARSE_DATE('%Y-%m-%d', date_col)",
1617
+ "SAFE.PARSE_DATE('%F', date_col)",
1618
+ );
1619
+ bigquery_identity("SAFE.DIVIDE(a, b)", "SAFE.DIVIDE(a, b)");
1620
+ }
1621
+
1590
1622
  #[test]
1591
1623
  fn test_cast_char_to_string() {
1592
1624
  bigquery_identity("CAST(x AS CHAR)", "CAST(x AS STRING)");
@@ -8346,7 +8346,7 @@ pub struct IndexColumn {
8346
8346
  #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8347
8347
  #[cfg_attr(feature = "bindings", derive(TS))]
8348
8348
  pub struct DropIndex {
8349
- pub name: Identifier,
8349
+ pub name: TableRef,
8350
8350
  pub table: Option<TableRef>,
8351
8351
  pub if_exists: bool,
8352
8352
  /// PostgreSQL CONCURRENTLY modifier
@@ -8357,7 +8357,7 @@ pub struct DropIndex {
8357
8357
  impl DropIndex {
8358
8358
  pub fn new(name: impl Into<String>) -> Self {
8359
8359
  Self {
8360
- name: Identifier::new(name),
8360
+ name: TableRef::new(name),
8361
8361
  table: None,
8362
8362
  if_exists: false,
8363
8363
  concurrently: false,
@@ -11108,7 +11108,7 @@ impl Generator {
11108
11108
  }
11109
11109
 
11110
11110
  self.write_space();
11111
- self.generate_identifier(&di.name)?;
11111
+ self.generate_table(&di.name)?;
11112
11112
 
11113
11113
  if let Some(ref table) = di.table {
11114
11114
  self.write_space();
@@ -38852,6 +38852,15 @@ mod tests {
38852
38852
  fn test_drop_index() {
38853
38853
  let result = roundtrip("DROP INDEX idx_name");
38854
38854
  assert_eq!(result, "DROP INDEX idx_name");
38855
+
38856
+ let result = roundtrip(r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#);
38857
+ assert_eq!(
38858
+ result,
38859
+ r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
38860
+ );
38861
+
38862
+ let result = roundtrip(r#"DROP INDEX "public"."IdxMixed""#);
38863
+ assert_eq!(result, r#"DROP INDEX "public"."IdxMixed""#);
38855
38864
  }
38856
38865
 
38857
38866
  #[test]
@@ -714,7 +714,7 @@ fn to_node_inner(
714
714
  }
715
715
 
716
716
  // 7. Column references — trace each column to its source
717
- let col_refs = find_column_refs_in_expr(&select_expr);
717
+ let col_refs = find_column_refs_in_expr(&select_expr, dialect);
718
718
  for col_ref in col_refs {
719
719
  let col_name = &col_ref.column;
720
720
  if let Some(ref table_id) = col_ref.table {
@@ -1265,13 +1265,30 @@ struct SimpleColumnRef {
1265
1265
  }
1266
1266
 
1267
1267
  /// Find all column references in an expression (does not recurse into subqueries).
1268
- fn find_column_refs_in_expr(expr: &Expression) -> Vec<SimpleColumnRef> {
1268
+ fn find_column_refs_in_expr(
1269
+ expr: &Expression,
1270
+ dialect: Option<DialectType>,
1271
+ ) -> Vec<SimpleColumnRef> {
1269
1272
  let mut refs = Vec::new();
1270
- collect_column_refs(expr, &mut refs);
1273
+ collect_column_refs(expr, dialect, &mut refs);
1271
1274
  refs
1272
1275
  }
1273
1276
 
1274
- fn collect_column_refs(expr: &Expression, refs: &mut Vec<SimpleColumnRef>) {
1277
+ fn is_bigquery_safe_namespace_receiver(expr: &Expression) -> bool {
1278
+ match expr {
1279
+ Expression::Column(col) => {
1280
+ col.table.is_none() && !col.name.quoted && col.name.name.eq_ignore_ascii_case("SAFE")
1281
+ }
1282
+ Expression::Identifier(id) => !id.quoted && id.name.eq_ignore_ascii_case("SAFE"),
1283
+ _ => false,
1284
+ }
1285
+ }
1286
+
1287
+ fn collect_column_refs(
1288
+ expr: &Expression,
1289
+ dialect: Option<DialectType>,
1290
+ refs: &mut Vec<SimpleColumnRef>,
1291
+ ) {
1275
1292
  let mut stack: Vec<&Expression> = vec![expr];
1276
1293
 
1277
1294
  while let Some(current) = stack.pop() {
@@ -1638,7 +1655,11 @@ fn collect_column_refs(expr: &Expression, refs: &mut Vec<SimpleColumnRef>) {
1638
1655
  stack.push(&d.this);
1639
1656
  }
1640
1657
  Expression::MethodCall(m) => {
1641
- stack.push(&m.this);
1658
+ if !matches!(dialect, Some(DialectType::BigQuery))
1659
+ || !is_bigquery_safe_namespace_receiver(&m.this)
1660
+ {
1661
+ stack.push(&m.this);
1662
+ }
1642
1663
  for arg in &m.args {
1643
1664
  stack.push(arg);
1644
1665
  }
@@ -2989,6 +3010,71 @@ mod tests {
2989
3010
  );
2990
3011
  }
2991
3012
 
3013
+ #[test]
3014
+ fn test_lineage_bigquery_safe_namespace_issue207() {
3015
+ let query = r#"
3016
+ WITH import_cte AS (
3017
+ SELECT timestamp, data, operation
3018
+ FROM `project`.`dataset`.`source_table`
3019
+ ),
3020
+ transform_cte AS (
3021
+ SELECT
3022
+ timestamp,
3023
+ SAFE.PARSE_JSON(data) AS json_data
3024
+ FROM import_cte
3025
+ )
3026
+ SELECT json_data FROM transform_cte
3027
+ "#;
3028
+ let expr = parse_one(query, DialectType::BigQuery).expect("parse");
3029
+ let node = lineage("json_data", &expr, Some(DialectType::BigQuery), false)
3030
+ .expect("lineage should resolve SAFE.PARSE_JSON arguments");
3031
+ let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
3032
+
3033
+ assert!(
3034
+ names.iter().any(|name| name == "source_table.data"),
3035
+ "expected source_table.data in lineage, got {names:?}"
3036
+ );
3037
+ assert!(
3038
+ !names
3039
+ .iter()
3040
+ .any(|name| name.eq_ignore_ascii_case("import_cte.safe")),
3041
+ "did not expect SAFE namespace receiver in lineage, got {names:?}"
3042
+ );
3043
+ }
3044
+
3045
+ #[test]
3046
+ fn test_lineage_bigquery_safe_namespace_method_call_guard() {
3047
+ let expr = parse("SELECT SAFE.PARSE_JSON(data) AS json_data FROM t");
3048
+ let node = lineage("json_data", &expr, Some(DialectType::BigQuery), false)
3049
+ .expect("lineage should resolve SAFE.PARSE_JSON arguments");
3050
+ let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
3051
+
3052
+ assert!(
3053
+ names.iter().any(|name| name == "t.data"),
3054
+ "expected t.data in lineage, got {names:?}"
3055
+ );
3056
+ assert!(
3057
+ !names.iter().any(|name| name.eq_ignore_ascii_case("t.safe")),
3058
+ "did not expect SAFE namespace receiver in lineage, got {names:?}"
3059
+ );
3060
+ }
3061
+
3062
+ #[test]
3063
+ fn test_lineage_method_call_receiver_control() {
3064
+ let expr = parse("SELECT obj.METHOD(arg) AS out FROM t");
3065
+ let node = lineage("out", &expr, None, false).expect("lineage");
3066
+ let names: Vec<_> = node.walk().map(|n| n.name.clone()).collect();
3067
+
3068
+ assert!(
3069
+ names.iter().any(|name| name == "t.obj"),
3070
+ "expected ordinary method receiver to remain in lineage, got {names:?}"
3071
+ );
3072
+ assert!(
3073
+ names.iter().any(|name| name == "t.arg"),
3074
+ "expected method argument in lineage, got {names:?}"
3075
+ );
3076
+ }
3077
+
2992
3078
  #[test]
2993
3079
  fn test_lineage_upper_function() {
2994
3080
  let expr = parse("SELECT UPPER(name) AS upper_name FROM users");
@@ -550,11 +550,24 @@ fn input_fields_for_output(
550
550
  let description = output_field
551
551
  .expression
552
552
  .as_ref()
553
- .map(|expr| expr.sql_for(options.dialect));
553
+ .and_then(|expr| transformation_description(expr, options.dialect));
554
554
 
555
555
  terminal_fields_to_openlineage(terminals, subtype, description, options, warnings)
556
556
  }
557
557
 
558
+ fn transformation_description(expr: &Expression, dialect: DialectType) -> Option<String> {
559
+ #[cfg(feature = "generate")]
560
+ {
561
+ Some(expr.sql_for(dialect))
562
+ }
563
+
564
+ #[cfg(not(feature = "generate"))]
565
+ {
566
+ let _ = (expr, dialect);
567
+ None
568
+ }
569
+ }
570
+
558
571
  fn terminal_fields_to_openlineage(
559
572
  terminals: Vec<TerminalField>,
560
573
  subtype: &str,
@@ -1113,6 +1126,45 @@ mod tests {
1113
1126
  .all(|f| f.transformations[0].subtype == "TRANSFORMATION"));
1114
1127
  }
1115
1128
 
1129
+ #[test]
1130
+ fn omits_bigquery_safe_namespace_from_column_lineage_issue207() {
1131
+ let mut opts = options();
1132
+ opts.dialect = DialectType::BigQuery;
1133
+
1134
+ let result = openlineage_column_lineage(
1135
+ r#"
1136
+ WITH import_cte AS (
1137
+ SELECT timestamp, data, operation
1138
+ FROM `project`.`dataset`.`source_table`
1139
+ ),
1140
+ transform_cte AS (
1141
+ SELECT
1142
+ timestamp,
1143
+ SAFE.PARSE_JSON(data) AS json_data
1144
+ FROM import_cte
1145
+ )
1146
+ SELECT json_data FROM transform_cte
1147
+ "#,
1148
+ &opts,
1149
+ )
1150
+ .expect("lineage");
1151
+ let field = result.facet.fields.get("json_data").expect("json_data");
1152
+
1153
+ assert!(
1154
+ field.input_fields.iter().any(|input| input.field == "data"),
1155
+ "expected data input field, got {:?}",
1156
+ field.input_fields
1157
+ );
1158
+ assert!(
1159
+ !field
1160
+ .input_fields
1161
+ .iter()
1162
+ .any(|input| input.field.eq_ignore_ascii_case("safe")),
1163
+ "did not expect SAFE namespace as input field, got {:?}",
1164
+ field.input_fields
1165
+ );
1166
+ }
1167
+
1116
1168
  #[test]
1117
1169
  fn emits_aggregation_column_lineage() {
1118
1170
  let result =
@@ -1176,7 +1176,7 @@ fn extract_subquery_to_cte(
1176
1176
  ) -> Expression {
1177
1177
  match source {
1178
1178
  Expression::Subquery(sub) => {
1179
- let inner_sql = crate::generator::Generator::sql(&sub.this).unwrap_or_default();
1179
+ let subquery_key = subquery_identity_key(&sub.this);
1180
1180
  let alias_name = sub
1181
1181
  .alias
1182
1182
  .as_ref()
@@ -1184,7 +1184,7 @@ fn extract_subquery_to_cte(
1184
1184
  .unwrap_or_default();
1185
1185
 
1186
1186
  // Check for duplicate subquery (reuse existing CTE)
1187
- if let Some(existing_name) = seen_sql.get(&inner_sql) {
1187
+ if let Some(existing_name) = seen_sql.get(&subquery_key) {
1188
1188
  let mut tref = TableRef::new(existing_name.as_str());
1189
1189
  if !alias_name.is_empty() {
1190
1190
  tref.alias = Some(Identifier::new(&alias_name));
@@ -1199,7 +1199,7 @@ fn extract_subquery_to_cte(
1199
1199
  find_new_name(taken, "_cte")
1200
1200
  };
1201
1201
  taken.insert(cte_name.clone());
1202
- seen_sql.insert(inner_sql, cte_name.clone());
1202
+ seen_sql.insert(subquery_key, cte_name.clone());
1203
1203
 
1204
1204
  // Create CTE
1205
1205
  new_ctes.push(Cte {
@@ -1223,6 +1223,22 @@ fn extract_subquery_to_cte(
1223
1223
  }
1224
1224
  }
1225
1225
 
1226
+ fn subquery_identity_key(expr: &Expression) -> String {
1227
+ #[cfg(feature = "generate")]
1228
+ {
1229
+ crate::generator::Generator::sql(expr).unwrap_or_else(|_| structural_subquery_key(expr))
1230
+ }
1231
+
1232
+ #[cfg(not(feature = "generate"))]
1233
+ {
1234
+ structural_subquery_key(expr)
1235
+ }
1236
+ }
1237
+
1238
+ fn structural_subquery_key(expr: &Expression) -> String {
1239
+ serde_json::to_string(expr).unwrap_or_else(|_| format!("{expr:?}"))
1240
+ }
1241
+
1226
1242
  /// Unnest correlated subqueries where possible.
1227
1243
  ///
1228
1244
  /// This transforms correlated subqueries into JOINs for better performance.
@@ -619,6 +619,39 @@ impl Parser {
619
619
  parser.parse()
620
620
  }
621
621
 
622
+ fn is_bigquery_safe_namespace_receiver(expr: &Expression) -> bool {
623
+ match expr {
624
+ Expression::Column(col) => {
625
+ col.table.is_none()
626
+ && !col.name.quoted
627
+ && col.name.name.eq_ignore_ascii_case("SAFE")
628
+ }
629
+ Expression::Identifier(id) => !id.quoted && id.name.eq_ignore_ascii_case("SAFE"),
630
+ _ => false,
631
+ }
632
+ }
633
+
634
+ fn parse_method_call_expression(
635
+ &self,
636
+ this: Expression,
637
+ method: Identifier,
638
+ args: Vec<Expression>,
639
+ ) -> Expression {
640
+ if matches!(
641
+ self.config.dialect,
642
+ Some(crate::dialects::DialectType::BigQuery)
643
+ ) && Self::is_bigquery_safe_namespace_receiver(&this)
644
+ && !method.quoted
645
+ {
646
+ return Expression::Function(Box::new(Function::new(
647
+ format!("SAFE.{}", method.name),
648
+ args,
649
+ )));
650
+ }
651
+
652
+ Expression::MethodCall(Box::new(MethodCall { this, method, args }))
653
+ }
654
+
622
655
  /// Parse all remaining statements from the token stream.
623
656
  ///
624
657
  /// Consumes tokens until the end of input, splitting on semicolons.
@@ -18529,12 +18562,9 @@ impl Parser {
18529
18562
 
18530
18563
  let if_exists = self.match_keywords(&[TokenType::If, TokenType::Exists]);
18531
18564
 
18532
- // Parse potentially qualified index name (a.b.c)
18533
- let mut name_parts = vec![self.expect_identifier()?];
18534
- while self.match_token(TokenType::Dot) {
18535
- name_parts.push(self.expect_identifier()?);
18536
- }
18537
- let name = Identifier::new(name_parts.join("."));
18565
+ // Parse potentially qualified index name (a.b.c), preserving quoted
18566
+ // state independently for every part.
18567
+ let name = self.parse_table_ref()?;
18538
18568
 
18539
18569
  // Optional ON table
18540
18570
  let table = if self.match_token(TokenType::On) {
@@ -30474,18 +30504,15 @@ impl Parser {
30474
30504
  self.parse_function_arguments()?
30475
30505
  };
30476
30506
  self.expect(TokenType::RParen)?;
30477
- let method_call = Expression::MethodCall(Box::new(MethodCall {
30478
- this: Expression::boxed_column(Column {
30479
- name: ident.clone(),
30480
- table: None,
30481
- join_mark: false,
30482
- trailing_comments: Vec::new(),
30483
- span: None,
30484
- inferred_type: None,
30485
- }),
30486
- method: col_ident,
30487
- args,
30488
- }));
30507
+ let this = Expression::boxed_column(Column {
30508
+ name: ident.clone(),
30509
+ table: None,
30510
+ join_mark: false,
30511
+ trailing_comments: Vec::new(),
30512
+ span: None,
30513
+ inferred_type: None,
30514
+ });
30515
+ let method_call = self.parse_method_call_expression(this, col_ident, args);
30489
30516
  return self.maybe_parse_subscript(method_call);
30490
30517
  }
30491
30518
 
@@ -32324,11 +32351,11 @@ impl Parser {
32324
32351
  self.parse_expression_list()?
32325
32352
  };
32326
32353
  self.expect(TokenType::RParen)?;
32327
- let method_call = Expression::MethodCall(Box::new(MethodCall {
32328
- this: Expression::Identifier(Identifier::new(name)),
32329
- method: col_ident,
32354
+ let method_call = self.parse_method_call_expression(
32355
+ Expression::Identifier(Identifier::new(name)),
32356
+ col_ident,
32330
32357
  args,
32331
- }));
32358
+ );
32332
32359
  return self.maybe_parse_subscript(method_call);
32333
32360
  }
32334
32361
 
@@ -37834,11 +37861,11 @@ impl Parser {
37834
37861
  };
37835
37862
  self.expect(TokenType::RParen)?;
37836
37863
  // Create a method call expression (DotAccess with function call)
37837
- expr = Expression::MethodCall(Box::new(MethodCall {
37838
- this: expr,
37839
- method: Identifier::new(field_name),
37864
+ expr = self.parse_method_call_expression(
37865
+ expr,
37866
+ Identifier::new(field_name),
37840
37867
  args,
37841
- }));
37868
+ );
37842
37869
  } else {
37843
37870
  let mut ident = Identifier::new(field_name);
37844
37871
  if is_quoted {
@@ -60646,10 +60673,27 @@ OPTIONS (
60646
60673
 
60647
60674
  if let Expression::DropIndex(di) = &result[0] {
60648
60675
  assert!(di.if_exists);
60676
+ assert_eq!(di.name.name.name, "idx_email");
60677
+ assert!(!di.name.name.quoted);
60649
60678
  assert!(di.table.is_some());
60650
60679
  }
60651
60680
  }
60652
60681
 
60682
+ #[test]
60683
+ fn test_parse_drop_index_preserves_qualified_quoted_name() {
60684
+ let result = Parser::parse_sql(r#"DROP INDEX IF EXISTS "public"."IdxEmail""#).unwrap();
60685
+
60686
+ if let Expression::DropIndex(di) = &result[0] {
60687
+ let schema = di.name.schema.as_ref().expect("schema");
60688
+ assert_eq!(schema.name, "public");
60689
+ assert!(schema.quoted);
60690
+ assert_eq!(di.name.name.name, "IdxEmail");
60691
+ assert!(di.name.name.quoted);
60692
+ } else {
60693
+ panic!("Expected DropIndex");
60694
+ }
60695
+ }
60696
+
60653
60697
  #[test]
60654
60698
  fn test_parse_create_view() {
60655
60699
  let result =
@@ -777,6 +777,7 @@ mod ddl_drop_tests {
777
777
  #[test]
778
778
  fn test_drop_index() {
779
779
  assert_roundtrip("DROP INDEX a.b.c");
780
+ assert_roundtrip(r#"DROP INDEX "a"."B""#);
780
781
  }
781
782
 
782
783
  #[test]
@@ -330,6 +330,22 @@ mod ddl_tests {
330
330
  roundtrip("DROP INDEX IF EXISTS idx"),
331
331
  "DROP INDEX IF EXISTS idx"
332
332
  );
333
+ assert_eq!(
334
+ transpile(
335
+ r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#,
336
+ DialectType::PostgreSQL,
337
+ DialectType::PostgreSQL
338
+ ),
339
+ r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
340
+ );
341
+ assert_eq!(
342
+ transpile(
343
+ "DROP INDEX IF EXISTS `idx_tokenKey__pb_users_auth_`",
344
+ DialectType::SQLite,
345
+ DialectType::PostgreSQL
346
+ ),
347
+ r#"DROP INDEX IF EXISTS "idx_tokenKey__pb_users_auth_""#
348
+ );
333
349
  }
334
350
 
335
351
  #[test]
File without changes