diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml
new file mode 100644
index 000000000..c851bff31
--- /dev/null
+++ b/.github/workflows/license.yml
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: license
+
+# trigger for all PRs and changes to main
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+
+  rat:
+    name: Release Audit Tool (RAT)
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Setup Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: 3.8
+      - name: Audit licenses
+        run: ./dev/release/run-rat.sh .
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 2502abe9d..3abf9d387 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -19,6 +19,9 @@ name: Rust
 
 on: [push, pull_request]
 
+permissions:
+  contents: read
+
 jobs:
 
   codestyle:
@@ -27,7 +30,7 @@ jobs:
       - uses: actions/checkout@v4
       - name: Setup Rust Toolchain
         uses: ./.github/actions/setup-builder
-      - run: cargo fmt -- --check 
+      - run: cargo fmt --all -- --check
 
   lint:
     runs-on: ubuntu-latest
@@ -37,6 +40,14 @@ jobs:
         uses: ./.github/actions/setup-builder
       - run: cargo clippy --all-targets --all-features -- -D warnings
 
+  benchmark-lint:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Setup Rust Toolchain
+        uses: ./.github/actions/setup-builder
+      - run: cd sqlparser_bench && cargo clippy --all-targets --all-features -- -D warnings
+
   compile:
     runs-on: ubuntu-latest
     steps:
@@ -77,11 +88,8 @@ jobs:
       uses: ./.github/actions/setup-builder
       with:
         rust-version: ${{ matrix.rust }}
+    - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
     - name: Install Tarpaulin
-      uses: actions-rs/install@v0.1
-      with:
-        crate: cargo-tarpaulin
-        version: 0.14.2
-        use-tool-cache: true
+      run: cargo install cargo-tarpaulin
     - name: Test
       run: cargo test --all-features
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ec74bf633..a5511a053 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,13 +18,19 @@
 -->
 
 # Changelog
-All notable changes to this project will be documented in this file.
+All notable changes to this project will be documented in one of the linked
+files. 
 
 This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
 Given that the parser produces a typed AST, any changes to the AST will
 technically be breaking and thus will result in a `0.(N+1)` version. 
 
 
 - Unreleased: Check https://github.com/sqlparser-rs/sqlparser-rs/commits/main for undocumented changes.
+- `0.56.0`: [changelog/0.56.0.md](changelog/0.56.0.md)
+- `0.55.0`: [changelog/0.55.0.md](changelog/0.55.0.md)
+- `0.54.0`: [changelog/0.54.0.md](changelog/0.54.0.md)
+- `0.53.0`: [changelog/0.53.0.md](changelog/0.53.0.md)
 - `0.52.0`: [changelog/0.52.0.md](changelog/0.52.0.md)
 - `0.51.0` and earlier: [changelog/0.51.0-pre.md](changelog/0.51.0-pre.md)
diff --git a/Cargo.toml b/Cargo.toml
index 18b246e04..2e48f9d0d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,7 +18,7 @@
 [package]
 name = "sqlparser"
 description = "Extensible SQL Lexer and Parser with support for ANSI SQL:2011"
-version = "0.52.0"
+version = "0.58.0"
 authors = ["Apache DataFusion <dev@datafusion.apache.org>"]
 homepage = "https://github.com/apache/datafusion-sqlparser-rs"
 documentation = "https://docs.rs/sqlparser/"
@@ -37,8 +37,9 @@ name = "sqlparser"
 path = "src/lib.rs"
 
 [features]
-default = ["std"]
+default = ["std", "recursive-protection"]
 std = []
+recursive-protection = ["std", "recursive"]
 # Enable JSON output in the `cli` example:
 json_example = ["serde_json", "serde"]
 visitor = ["sqlparser_derive"]
@@ -46,12 +47,14 @@ visitor = ["sqlparser_derive"]
 [dependencies]
 bigdecimal = { version = "0.4.1", features = ["serde"], optional = true }
 log = "0.4"
-serde = { version = "1.0", features = ["derive"], optional = true }
+recursive = { version = "0.1.1", optional = true}
+
+serde = { version = "1.0", default-features = false, features = ["derive", "alloc"], optional = true }
 # serde_json is only used in examples/cli, but we have to put it outside
 # of dev-dependencies because of
 # https://github.com/rust-lang/cargo/issues/1596
 serde_json = { version = "1.0", optional = true }
-sqlparser_derive = { version = "0.2.0", path = "derive", optional = true }
+sqlparser_derive = { version = "0.3.0", path = "derive", optional = true }
 
 [dev-dependencies]
 simple_logger = "5.0"
diff --git a/README.md b/README.md
index 934d9d06d..9dfe50810 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,7 @@
 
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 [![Version](https://img.shields.io/crates/v/sqlparser.svg)](https://crates.io/crates/sqlparser)
-[![Build Status](https://github.com/sqlparser-rs/sqlparser-rs/workflows/Rust/badge.svg?branch=main)](https://github.com/sqlparser-rs/sqlparser-rs/actions?query=workflow%3ARust+branch%3Amain)
+[![Build Status](https://github.com/apache/datafusion-sqlparser-rs/actions/workflows/rust.yml/badge.svg)](https://github.com/sqlparser-rs/sqlparser-rs/actions?query=workflow%3ARust+branch%3Amain)
 [![Coverage Status](https://coveralls.io/repos/github/sqlparser-rs/sqlparser-rs/badge.svg?branch=main)](https://coveralls.io/github/sqlparser-rs/sqlparser-rs?branch=main)
 [![Gitter Chat](https://badges.gitter.im/sqlparser-rs/community.svg)](https://gitter.im/sqlparser-rs/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
 
@@ -53,7 +53,7 @@ println!("AST: {:?}", ast);
 This outputs
 
 ```rust
-AST: [Query(Query { ctes: [], body: Select(Select { distinct: false, projection: [UnnamedExpr(Identifier("a")), UnnamedExpr(Identifier("b")), UnnamedExpr(Value(Long(123))), UnnamedExpr(Function(Function { name: ObjectName(["myfunc"]), args: [Identifier("b")], filter: None, over: None, distinct: false }))], from: [TableWithJoins { relation: Table { name: ObjectName(["table_1"]), alias: None, args: [], with_hints: [] }, joins: [] }], selection: Some(BinaryOp { left: BinaryOp { left: Identifier("a"), op: Gt, right: Identifier("b") }, op: And, right: BinaryOp { left: Identifier("b"), op: Lt, right: Value(Long(100)) } }), group_by: [], having: None }), order_by: [OrderByExpr { expr: Identifier("a"), asc: Some(false) }, OrderByExpr { expr: Identifier("b"), asc: None }], limit: None, offset: None, fetch: None })]
+AST: [Query(Query { ctes: [], body: Select(Select { distinct: false, projection: [UnnamedExpr(Identifier("a")), UnnamedExpr(Identifier("b")), UnnamedExpr(Value(Long(123))), UnnamedExpr(Function(Function { name:ObjectName([Identifier(Ident { value: "myfunc", quote_style: None })]), args: [Identifier("b")], filter: None, over: None, distinct: false }))], from: [TableWithJoins { relation: Table { name: ObjectName([Identifier(Ident { value: "table_1", quote_style: None })]), alias: None, args: [], with_hints: [] }, joins: [] }], selection: Some(BinaryOp { left: BinaryOp { left: Identifier("a"), op: Gt, right: Identifier("b") }, op: And, right: BinaryOp { left: Identifier("b"), op: Lt, right: Value(Long(100)) } }), group_by: [], having: None }), order_by: [OrderByExpr { expr: Identifier("a"), asc: Some(false) }, OrderByExpr { expr: Identifier("b"), asc: None }], limit: None, offset: None, fetch: None })]
 ```
 
 
@@ -63,7 +63,7 @@ The following optional [crate  features](https://doc.rust-lang.org/cargo/referen
 
 * `serde`: Adds [Serde](https://serde.rs/) support by implementing  `Serialize` and `Deserialize` for all AST nodes.
 * `visitor`: Adds a `Visitor` capable of recursively walking the AST tree.
-
+* `recursive-protection` (enabled by default), uses [recursive](https://docs.rs/recursive/latest/recursive/) for stack overflow protection. 
 
 ## Syntax vs Semantics
 
@@ -89,10 +89,14 @@ keywords, the following should hold true for all SQL:
 
 ```rust
 // Parse SQL
+let sql = "SELECT 'hello'";
 let ast = Parser::parse_sql(&GenericDialect, sql).unwrap();
 
 // The original SQL text can be generated from the AST
 assert_eq!(ast[0].to_string(), sql);
+
+// The SQL can also be pretty-printed with newlines and indentation
+assert_eq!(format!("{:#}", ast[0]), "SELECT\n  'hello'");
 ```
 
 There are still some cases in this crate where different SQL with seemingly
@@ -100,15 +104,37 @@ similar semantics are represented with the same AST. We welcome PRs to fix such
 issues and distinguish different syntaxes in the AST.
 
 
+## Source Locations (Work in Progress)
+
+This crate allows recovering source locations from AST nodes via the [Spanned]
+trait, which can be used for advanced diagnostics tooling. Note that this
+feature is a work in progress and many nodes report missing or inaccurate spans.
+Please see [this ticket] for information on how to contribute missing
+improvements.
+
+[Spanned]: https://docs.rs/sqlparser/latest/sqlparser/ast/trait.Spanned.html
+[this ticket]: https://github.com/apache/datafusion-sqlparser-rs/issues/1548
+
+```rust
+// Parse SQL
+let ast = Parser::parse_sql(&GenericDialect, "SELECT A FROM B").unwrap();
+
+// The source span can be retrieved with start and end locations
+assert_eq!(ast[0].span(), Span {
+  start: Location::of(1, 1),
+  end: Location::of(1, 16),
+});
+```
+
 ## SQL compliance
 
 SQL was first standardized in 1987, and revisions of the standard have been
 published regularly since. Most revisions have added significant new features to
 the language, and as a result no database claims to support the full breadth of
 features. This parser currently supports most of the SQL-92 syntax, plus some
-syntax from newer versions that have been explicitly requested, plus some MSSQL,
-PostgreSQL, and other dialect-specific syntax. Whenever possible, the [online
-SQL:2016 grammar][sql-2016-grammar] is used to guide what syntax to accept.
+syntax from newer versions that have been explicitly requested, plus various
+other dialect-specific syntax. Whenever possible, the [online SQL:2016
+grammar][sql-2016-grammar] is used to guide what syntax to accept.
 
 Unfortunately, stating anything more specific about compliance is difficult.
 There is no publicly available test suite that can assess compliance
@@ -134,7 +160,8 @@ $ cargo run --features json_example --example cli FILENAME.sql [--dialectname]
 ## Users
 
 This parser is currently being used by the [DataFusion] query engine, [LocustDB],
-[Ballista], [GlueSQL], [Opteryx], [Polars], [PRQL], [Qrlew], [JumpWire], and [ParadeDB].
+[Ballista], [GlueSQL], [Opteryx], [Polars], [PRQL], [Qrlew], [JumpWire], [ParadeDB], [CipherStash Proxy],
+and [GreptimeDB].
 
 If your project is using sqlparser-rs feel free to make a PR to add it
 to this list.
@@ -210,6 +237,21 @@ Our goal as maintainers is to facilitate the integration
 of various features from various contributors, but not to provide the
 implementations ourselves, as we simply don't have the resources.
 
+### Benchmarking
+
+There are several micro benchmarks in the `sqlparser_bench` directory. 
+You can run them with:
+
+```
+git checkout main
+cd sqlparser_bench
+cargo bench -- --save-baseline main
+git checkout <your branch>
+cargo bench -- --baseline main
+```
+
+By adding the `--save-baseline main` and `--baseline main` you can track the
+progress of your improvements as you continue working on the feature branch.
 
 ## Licensing
 
@@ -238,3 +280,5 @@ licensed as above, without any additional terms or conditions.
 [sql-standard]: https://en.wikipedia.org/wiki/ISO/IEC_9075
 [`Dialect`]: https://docs.rs/sqlparser/latest/sqlparser/dialect/trait.Dialect.html
 [`GenericDialect`]: https://docs.rs/sqlparser/latest/sqlparser/dialect/struct.GenericDialect.html
+[CipherStash Proxy]: https://github.com/cipherstash/proxy
+[GreptimeDB]: https://github.com/GreptimeTeam/greptimedb
diff --git a/changelog/0.53.0.md b/changelog/0.53.0.md
new file mode 100644
index 000000000..5b9de07d3
--- /dev/null
+++ b/changelog/0.53.0.md
@@ -0,0 +1,95 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.53.0 Changelog
+
+This release consists of 47 commits from 16 contributors. See credits at the end of this changelog for more information.
+
+**Other:**
+
+- hive: support for special not expression `!a` and raise error for `a!` factorial operator [#1472](https://github.com/apache/datafusion-sqlparser-rs/pull/1472) (wugeer)
+- Add support for MSSQL's `OPENJSON WITH` clause [#1498](https://github.com/apache/datafusion-sqlparser-rs/pull/1498) (gaoqiangz)
+- Parse true and false as identifiers in mssql [#1510](https://github.com/apache/datafusion-sqlparser-rs/pull/1510) (lovasoa)
+- Fix the parsing error in MSSQL for multiple statements that include `DECLARE` statements [#1497](https://github.com/apache/datafusion-sqlparser-rs/pull/1497) (wugeer)
+- Add support for Snowflake SHOW DATABASES/SCHEMAS/TABLES/VIEWS/COLUMNS statements [#1501](https://github.com/apache/datafusion-sqlparser-rs/pull/1501) (yoavcloud)
+- Add support of COMMENT ON syntax for Snowflake [#1516](https://github.com/apache/datafusion-sqlparser-rs/pull/1516) (git-hulk)
+- Add support for MYSQL's `CREATE TABLE SELECT` expr [#1515](https://github.com/apache/datafusion-sqlparser-rs/pull/1515) (wugeer)
+- Add support for MSSQL's `XQuery` methods [#1500](https://github.com/apache/datafusion-sqlparser-rs/pull/1500) (gaoqiangz)
+- Add support for Hive's `LOAD DATA` expr [#1520](https://github.com/apache/datafusion-sqlparser-rs/pull/1520) (wugeer)
+- Fix ClickHouse document link from `Russian` to `English` [#1527](https://github.com/apache/datafusion-sqlparser-rs/pull/1527) (git-hulk)
+- Support ANTI and SEMI joins without LEFT/RIGHT [#1528](https://github.com/apache/datafusion-sqlparser-rs/pull/1528) (delamarch3)
+- support sqlite's OR clauses in update statements [#1530](https://github.com/apache/datafusion-sqlparser-rs/pull/1530) (lovasoa)
+- support column type definitions in table aliases [#1526](https://github.com/apache/datafusion-sqlparser-rs/pull/1526) (lovasoa)
+- Add support for MSSQL's `JSON_ARRAY`/`JSON_OBJECT` expr [#1507](https://github.com/apache/datafusion-sqlparser-rs/pull/1507) (gaoqiangz)
+- Add support for PostgreSQL `UNLISTEN` syntax and Add support for Postgres `LOAD extension` expr [#1531](https://github.com/apache/datafusion-sqlparser-rs/pull/1531) (wugeer)
+- Parse byte/bit string literals in MySQL and Postgres [#1532](https://github.com/apache/datafusion-sqlparser-rs/pull/1532) (mvzink)
+- Allow example CLI to read from stdin [#1536](https://github.com/apache/datafusion-sqlparser-rs/pull/1536) (mvzink)
+- recursive select calls are parsed with bad trailing_commas parameter [#1521](https://github.com/apache/datafusion-sqlparser-rs/pull/1521) (tomershaniii)
+- PartiQL queries in Redshift [#1534](https://github.com/apache/datafusion-sqlparser-rs/pull/1534) (yoavcloud)
+- Include license file in sqlparser_derive crate [#1543](https://github.com/apache/datafusion-sqlparser-rs/pull/1543) (ankane)
+- Fallback to identifier parsing if expression parsing fails [#1513](https://github.com/apache/datafusion-sqlparser-rs/pull/1513) (yoavcloud)
+- support `json_object('k':'v')` in postgres [#1546](https://github.com/apache/datafusion-sqlparser-rs/pull/1546) (lovasoa)
+- Document micro benchmarks [#1555](https://github.com/apache/datafusion-sqlparser-rs/pull/1555) (alamb)
+- Implement `Spanned` to retrieve source locations on AST nodes [#1435](https://github.com/apache/datafusion-sqlparser-rs/pull/1435) (Nyrox)
+- Fix error in benchmark queries [#1560](https://github.com/apache/datafusion-sqlparser-rs/pull/1560) (alamb)
+- Fix clippy warnings on rust 1.83 [#1570](https://github.com/apache/datafusion-sqlparser-rs/pull/1570) (iffyio)
+- Support relation visitor to visit the `Option` field [#1556](https://github.com/apache/datafusion-sqlparser-rs/pull/1556) (goldmedal)
+- Rename `TokenWithLocation` to `TokenWithSpan`, in backwards compatible way [#1562](https://github.com/apache/datafusion-sqlparser-rs/pull/1562) (alamb)
+- Support MySQL size variants for BLOB and TEXT columns [#1564](https://github.com/apache/datafusion-sqlparser-rs/pull/1564) (mvzink)
+- Increase version of sqlparser_derive from 0.2.2 to 0.3.0 [#1571](https://github.com/apache/datafusion-sqlparser-rs/pull/1571) (alamb)
+- `json_object('k' VALUE 'v')` in postgres [#1547](https://github.com/apache/datafusion-sqlparser-rs/pull/1547) (lovasoa)
+- Support snowflake double dot notation for object name [#1540](https://github.com/apache/datafusion-sqlparser-rs/pull/1540) (ayman-sigma)
+- Update comments / docs for `Spanned` [#1549](https://github.com/apache/datafusion-sqlparser-rs/pull/1549) (alamb)
+- Support Databricks struct literal [#1542](https://github.com/apache/datafusion-sqlparser-rs/pull/1542) (ayman-sigma)
+- Encapsulate CreateFunction [#1573](https://github.com/apache/datafusion-sqlparser-rs/pull/1573) (philipcristiano)
+- Support BIT column types [#1577](https://github.com/apache/datafusion-sqlparser-rs/pull/1577) (mvzink)
+- Support parsing optional nulls handling for unique constraint [#1567](https://github.com/apache/datafusion-sqlparser-rs/pull/1567) (mvzink)
+- Fix displaying WORK or TRANSACTION after BEGIN [#1565](https://github.com/apache/datafusion-sqlparser-rs/pull/1565) (mvzink)
+- Add support of the ENUM8|ENUM16 for ClickHouse dialect [#1574](https://github.com/apache/datafusion-sqlparser-rs/pull/1574) (git-hulk)
+- Parse Snowflake USE ROLE and USE SECONDARY ROLES [#1578](https://github.com/apache/datafusion-sqlparser-rs/pull/1578) (yoavcloud)
+- Snowflake ALTER TABLE clustering options [#1579](https://github.com/apache/datafusion-sqlparser-rs/pull/1579) (yoavcloud)
+- Support INSERT OVERWRITE INTO syntax [#1584](https://github.com/apache/datafusion-sqlparser-rs/pull/1584) (yuval-illumex)
+- Parse `INSERT` with subquery when lacking column names [#1586](https://github.com/apache/datafusion-sqlparser-rs/pull/1586) (iffyio)
+- Add support for ODBC functions [#1585](https://github.com/apache/datafusion-sqlparser-rs/pull/1585) (iffyio)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+     8	Andrew Lamb
+     6	Michael Victor Zink
+     5	Ophir LOJKINE
+     5	Yoav Cohen
+     5	wugeer
+     3	Ifeanyi Ubah
+     3	gaoqiangz
+     3	hulk
+     2	Ayman Elkfrawy
+     1	Andrew Kane
+     1	Jax Liu
+     1	Mark-Oliver Junge
+     1	Philip Cristiano
+     1	Yuval Shkolar
+     1	delamarch3
+     1	tomershaniii
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/changelog/0.54.0.md b/changelog/0.54.0.md
new file mode 100644
index 000000000..c0a63ae45
--- /dev/null
+++ b/changelog/0.54.0.md
@@ -0,0 +1,118 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.54.0 Changelog
+
+This release consists of 57 commits from 24 contributors. See credits at the end of this changelog for more information.
+
+**Implemented enhancements:**
+
+- feat: support `INSERT INTO [TABLE] FUNCTION` of Clickhouse [#1633](https://github.com/apache/datafusion-sqlparser-rs/pull/1633) (byte-sourcerer)
+
+**Other:**
+
+- Run cargo fmt on `derive` crate [#1595](https://github.com/apache/datafusion-sqlparser-rs/pull/1595) (alamb)
+- Add Apache license header to spans.rs [#1594](https://github.com/apache/datafusion-sqlparser-rs/pull/1594) (alamb)
+- Add support for BigQuery `ANY TYPE` data type [#1602](https://github.com/apache/datafusion-sqlparser-rs/pull/1602) (MartinSahlen)
+- Add support for TABLESAMPLE [#1580](https://github.com/apache/datafusion-sqlparser-rs/pull/1580) (yoavcloud)
+- Redshift: Fix parsing for quoted numbered columns [#1576](https://github.com/apache/datafusion-sqlparser-rs/pull/1576) (7phs)
+- Add the alter table ON COMMIT option to Snowflake [#1606](https://github.com/apache/datafusion-sqlparser-rs/pull/1606) (yoavcloud)
+- Support parsing `EXPLAIN ESTIMATE` of Clickhouse [#1605](https://github.com/apache/datafusion-sqlparser-rs/pull/1605) (byte-sourcerer)
+- Fix BigQuery hyphenated ObjectName with numbers [#1598](https://github.com/apache/datafusion-sqlparser-rs/pull/1598) (ayman-sigma)
+- Fix test compilation issue [#1609](https://github.com/apache/datafusion-sqlparser-rs/pull/1609) (iffyio)
+- Allow foreign table constraint without columns [#1608](https://github.com/apache/datafusion-sqlparser-rs/pull/1608) (ramnivas)
+- Support optional table for `ANALYZE` statement [#1599](https://github.com/apache/datafusion-sqlparser-rs/pull/1599) (yuyang-ok)
+- Support DOUBLE data types with precision for Mysql [#1611](https://github.com/apache/datafusion-sqlparser-rs/pull/1611) (artorias1024)
+- Add `#[recursive]` [#1522](https://github.com/apache/datafusion-sqlparser-rs/pull/1522) (blaginin)
+- Support arbitrary composite access expressions [#1600](https://github.com/apache/datafusion-sqlparser-rs/pull/1600) (ayman-sigma)
+- Consolidate `MapAccess`, and `Subscript` into `CompoundExpr` to handle the complex field access chain  [#1551](https://github.com/apache/datafusion-sqlparser-rs/pull/1551) (goldmedal)
+- Handle empty projection in Postgres SELECT  statements [#1613](https://github.com/apache/datafusion-sqlparser-rs/pull/1613) (tobyhede)
+- Merge composite and compound expr test cases [#1615](https://github.com/apache/datafusion-sqlparser-rs/pull/1615) (iffyio)
+- Support Snowflake Update-From-Select [#1604](https://github.com/apache/datafusion-sqlparser-rs/pull/1604) (yuval-illumex)
+- Improve parsing performance by reducing token cloning [#1587](https://github.com/apache/datafusion-sqlparser-rs/pull/1587) (davisp)
+- Improve Parser documentation [#1617](https://github.com/apache/datafusion-sqlparser-rs/pull/1617) (alamb)
+- Add support for DROP EXTENSION [#1610](https://github.com/apache/datafusion-sqlparser-rs/pull/1610) (ramnivas)
+- Refactor advancing token to avoid duplication, avoid borrow checker issues [#1618](https://github.com/apache/datafusion-sqlparser-rs/pull/1618) (alamb)
+- Fix the parsing result for the special double number [#1621](https://github.com/apache/datafusion-sqlparser-rs/pull/1621) (goldmedal)
+- SQLite: Allow dollar signs in placeholder names [#1620](https://github.com/apache/datafusion-sqlparser-rs/pull/1620) (hansott)
+- Improve error for an unexpected token after DROP [#1623](https://github.com/apache/datafusion-sqlparser-rs/pull/1623) (ramnivas)
+- Fix `sqlparser_bench` benchmark compilation [#1625](https://github.com/apache/datafusion-sqlparser-rs/pull/1625) (alamb)
+- Improve parsing speed by avoiding some clones in parse_identifier [#1624](https://github.com/apache/datafusion-sqlparser-rs/pull/1624) (alamb)
+- Simplify `parse_keyword_apis` more [#1626](https://github.com/apache/datafusion-sqlparser-rs/pull/1626) (alamb)
+- Test benchmarks and Improve benchmark README.md [#1627](https://github.com/apache/datafusion-sqlparser-rs/pull/1627) (alamb)
+- Add support for MYSQL's `RENAME TABLE` [#1616](https://github.com/apache/datafusion-sqlparser-rs/pull/1616) (wugeer)
+- Correctly tokenize nested comments [#1629](https://github.com/apache/datafusion-sqlparser-rs/pull/1629) (hansott)
+- Add support for USE SECONDARY ROLE (vs. ROLES) [#1637](https://github.com/apache/datafusion-sqlparser-rs/pull/1637) (yoavcloud)
+- Add support for various Snowflake grantees [#1640](https://github.com/apache/datafusion-sqlparser-rs/pull/1640) (yoavcloud)
+- Add support for the SQL OVERLAPS predicate [#1638](https://github.com/apache/datafusion-sqlparser-rs/pull/1638) (yoavcloud)
+- Add support for Snowflake LIST and REMOVE [#1639](https://github.com/apache/datafusion-sqlparser-rs/pull/1639) (yoavcloud)
+- Add support for MySQL's INSERT INTO ... SET syntax [#1641](https://github.com/apache/datafusion-sqlparser-rs/pull/1641) (yoavcloud)
+- Start new line if \r in Postgres dialect [#1647](https://github.com/apache/datafusion-sqlparser-rs/pull/1647) (hansott)
+- Support pluralized time units [#1630](https://github.com/apache/datafusion-sqlparser-rs/pull/1630) (wugeer)
+- Replace `ReferentialAction` enum in `DROP` statements [#1648](https://github.com/apache/datafusion-sqlparser-rs/pull/1648) (stepancheg)
+- Add support for MS-SQL BEGIN/END TRY/CATCH [#1649](https://github.com/apache/datafusion-sqlparser-rs/pull/1649) (yoavcloud)
+- Fix MySQL parsing of GRANT, REVOKE, and CREATE VIEW [#1538](https://github.com/apache/datafusion-sqlparser-rs/pull/1538) (mvzink)
+- Add support for the Snowflake MINUS set operator [#1652](https://github.com/apache/datafusion-sqlparser-rs/pull/1652) (yoavcloud)
+- ALTER TABLE DROP {COLUMN|CONSTRAINT} RESTRICT [#1651](https://github.com/apache/datafusion-sqlparser-rs/pull/1651) (stepancheg)
+- Add support for ClickHouse `FORMAT` on `INSERT` [#1628](https://github.com/apache/datafusion-sqlparser-rs/pull/1628) (bombsimon)
+- MsSQL SET for session params [#1646](https://github.com/apache/datafusion-sqlparser-rs/pull/1646) (yoavcloud)
+- Correctly look for end delimiter dollar quoted string [#1650](https://github.com/apache/datafusion-sqlparser-rs/pull/1650) (hansott)
+- Support single line comments starting with '#' for Hive [#1654](https://github.com/apache/datafusion-sqlparser-rs/pull/1654) (wugeer)
+- Support trailing commas in `FROM` clause [#1645](https://github.com/apache/datafusion-sqlparser-rs/pull/1645) (barsela1)
+- Allow empty options for BigQuery [#1657](https://github.com/apache/datafusion-sqlparser-rs/pull/1657) (MartinSahlen)
+- Add support for parsing RAISERROR [#1656](https://github.com/apache/datafusion-sqlparser-rs/pull/1656) (AvivDavid-Satori)
+- Add support for Snowflake column aliases that use SQL keywords [#1632](https://github.com/apache/datafusion-sqlparser-rs/pull/1632) (yoavcloud)
+- fix parsing of `INSERT INTO ... SELECT ... RETURNING ` [#1661](https://github.com/apache/datafusion-sqlparser-rs/pull/1661) (lovasoa)
+- Add support for `IS [NOT] [form] NORMALIZED` [#1655](https://github.com/apache/datafusion-sqlparser-rs/pull/1655) (alexander-beedie)
+- Add support for qualified column names in JOIN ... USING [#1663](https://github.com/apache/datafusion-sqlparser-rs/pull/1663) (yoavcloud)
+- Add support for Snowflake AT/BEFORE [#1667](https://github.com/apache/datafusion-sqlparser-rs/pull/1667) (yoavcloud)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+    13	Yoav Cohen
+     9	Andrew Lamb
+     4	Hans Ott
+     3	Ramnivas Laddad
+     3	wugeer
+     2	Ayman Elkfrawy
+     2	Ifeanyi Ubah
+     2	Jax Liu
+     2	Martin Abelson Sahlen
+     2	Stepan Koltsov
+     2	cjw
+     1	Aleksei Piianin
+     1	Alexander Beedie
+     1	AvivDavid-Satori
+     1	Dmitrii Blaginin
+     1	Michael Victor Zink
+     1	Ophir LOJKINE
+     1	Paul J. Davis
+     1	Simon Sawert
+     1	Toby Hede
+     1	Yuval Shkolar
+     1	artorias1024
+     1	bar sela
+     1	yuyang
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/changelog/0.55.0.md b/changelog/0.55.0.md
new file mode 100644
index 000000000..046bf22bc
--- /dev/null
+++ b/changelog/0.55.0.md
@@ -0,0 +1,173 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.55.0 Changelog
+
+This release consists of 55 commits from 25 contributors. See credits at the end of this changelog for more information.
+
+## Migrating usages of `Expr::Value`
+
+In v0.55 of sqlparser the `Expr::Value` enum variant contains a `ValueWithSpan` instead of a `Value`. Here is how to migrate.
+
+### When pattern matching
+
+```diff
+- Expr::Value(Value::SingleQuotedString(my_string)) => { ... }
++ Expr::Value(ValueWithSpan{ value: Value::SingleQuotedString(my_string), span: _ }) => { ... }
+```
+
+### When creating an `Expr`
+
+Use the new `Expr::value` method (notice the lowercase `v`), which will create a `ValueWithSpan` containing an empty span:
+
+```diff
+- Expr::Value(Value::SingleQuotedString(my_string))
++ Expr::value(Value::SingleQuotedString(my_string))
+```
+
+## Migrating usages of `ObjectName`
+
+In v0.55 of sqlparser, the `ObjectName` structure has been changed as shown below. Here is now to migrate.
+
+```diff
+- pub struct ObjectName(pub Vec<Ident>);
++ pub struct ObjectName(pub Vec<ObjectNamePart>)
+```
+
+### When constructing `ObjectName`
+
+Use the `From` impl:
+
+```diff
+- name: ObjectName(vec![Ident::new("f")]),
++ name: ObjectName::from(vec![Ident::new("f")]),
+```
+
+### Accessing Spans
+
+Use the `span()` function
+
+```diff
+- name.span
++ name.span()
+```
+
+
+
+**Breaking changes:**
+
+- Enhance object name path segments [#1539](https://github.com/apache/datafusion-sqlparser-rs/pull/1539) (ayman-sigma)
+- Store spans for Value expressions [#1738](https://github.com/apache/datafusion-sqlparser-rs/pull/1738) (lovasoa)
+
+**Implemented enhancements:**
+
+- feat: adjust create and drop trigger for mysql dialect [#1734](https://github.com/apache/datafusion-sqlparser-rs/pull/1734) (invm)
+
+**Fixed bugs:**
+
+- fix: make `serde` feature no_std [#1730](https://github.com/apache/datafusion-sqlparser-rs/pull/1730) (iajoiner)
+
+**Other:**
+
+- Update rat_exclude_file.txt [#1670](https://github.com/apache/datafusion-sqlparser-rs/pull/1670) (alamb)
+- Add support for Snowflake account privileges [#1666](https://github.com/apache/datafusion-sqlparser-rs/pull/1666) (yoavcloud)
+- Add support for Create Iceberg Table statement for Snowflake parser [#1664](https://github.com/apache/datafusion-sqlparser-rs/pull/1664) (Vedin)
+- National strings: check if dialect supports backslash escape [#1672](https://github.com/apache/datafusion-sqlparser-rs/pull/1672) (hansott)
+- Only support escape literals for Postgres, Redshift and generic dialect [#1674](https://github.com/apache/datafusion-sqlparser-rs/pull/1674) (hansott)
+- BigQuery: Support trailing commas in column definitions list [#1682](https://github.com/apache/datafusion-sqlparser-rs/pull/1682) (iffyio)
+- Enable GROUP BY exp for Snowflake dialect [#1683](https://github.com/apache/datafusion-sqlparser-rs/pull/1683) (yoavcloud)
+- Add support for parsing empty dictionary expressions [#1684](https://github.com/apache/datafusion-sqlparser-rs/pull/1684) (yoavcloud)
+- Support multiple tables in `UPDATE FROM` clause [#1681](https://github.com/apache/datafusion-sqlparser-rs/pull/1681) (iffyio)
+- Add support for mysql table hints [#1675](https://github.com/apache/datafusion-sqlparser-rs/pull/1675) (AvivDavid-Satori)
+- BigQuery: Add support for select expr star [#1680](https://github.com/apache/datafusion-sqlparser-rs/pull/1680) (iffyio)
+- Support underscore separators in numbers for Clickhouse. Fixes #1659 [#1677](https://github.com/apache/datafusion-sqlparser-rs/pull/1677) (graup)
+- BigQuery: Fix column identifier reserved keywords list [#1678](https://github.com/apache/datafusion-sqlparser-rs/pull/1678) (iffyio)
+- Fix bug when parsing a Snowflake stage with `;` suffix [#1688](https://github.com/apache/datafusion-sqlparser-rs/pull/1688) (yoavcloud)
+- Allow plain JOIN without turning it into INNER [#1692](https://github.com/apache/datafusion-sqlparser-rs/pull/1692) (mvzink)
+- Fix DDL generation in case of an empty arguments function. [#1690](https://github.com/apache/datafusion-sqlparser-rs/pull/1690) (remysaissy)
+- Fix `CREATE FUNCTION` round trip for Hive dialect [#1693](https://github.com/apache/datafusion-sqlparser-rs/pull/1693) (iffyio)
+- Make numeric literal underscore test dialect agnostic [#1685](https://github.com/apache/datafusion-sqlparser-rs/pull/1685) (iffyio)
+- Extend lambda support for ClickHouse and DuckDB dialects [#1686](https://github.com/apache/datafusion-sqlparser-rs/pull/1686) (gstvg)
+- Make TypedString preserve quote style [#1679](https://github.com/apache/datafusion-sqlparser-rs/pull/1679) (graup)
+- Do not parse ASOF and MATCH_CONDITION as table factor aliases [#1698](https://github.com/apache/datafusion-sqlparser-rs/pull/1698) (yoavcloud)
+- Add support for GRANT on some common Snowflake objects [#1699](https://github.com/apache/datafusion-sqlparser-rs/pull/1699) (yoavcloud)
+- Add RETURNS TABLE() support for CREATE FUNCTION in Postgresql [#1687](https://github.com/apache/datafusion-sqlparser-rs/pull/1687) (remysaissy)
+- Add parsing for GRANT ROLE and GRANT DATABASE ROLE in Snowflake dialect [#1689](https://github.com/apache/datafusion-sqlparser-rs/pull/1689) (yoavcloud)
+- Add support for `CREATE/ALTER/DROP CONNECTOR` syntax [#1701](https://github.com/apache/datafusion-sqlparser-rs/pull/1701) (wugeer)
+- Parse Snowflake COPY INTO <location> [#1669](https://github.com/apache/datafusion-sqlparser-rs/pull/1669) (yoavcloud)
+- Require space after -- to start single line comment in MySQL [#1705](https://github.com/apache/datafusion-sqlparser-rs/pull/1705) (hansott)
+- Add suppport for Show Objects statement for the Snowflake parser [#1702](https://github.com/apache/datafusion-sqlparser-rs/pull/1702) (DanCodedThis)
+- Fix incorrect parsing of JsonAccess bracket notation after cast in Snowflake [#1708](https://github.com/apache/datafusion-sqlparser-rs/pull/1708) (yoavcloud)
+- Parse Postgres VARBIT datatype [#1703](https://github.com/apache/datafusion-sqlparser-rs/pull/1703) (mvzink)
+- Implement FROM-first selects [#1713](https://github.com/apache/datafusion-sqlparser-rs/pull/1713) (mitsuhiko)
+- Enable custom dialects to support `MATCH() AGAINST()` [#1719](https://github.com/apache/datafusion-sqlparser-rs/pull/1719) (joocer)
+- Support group by cube/rollup etc in BigQuery [#1720](https://github.com/apache/datafusion-sqlparser-rs/pull/1720) (Groennbeck)
+- Add support for MS Varbinary(MAX) (#1714) [#1715](https://github.com/apache/datafusion-sqlparser-rs/pull/1715) (TylerBrinks)
+- Add supports for Hive's `SELECT ... GROUP BY .. GROUPING SETS` syntax [#1653](https://github.com/apache/datafusion-sqlparser-rs/pull/1653) (wugeer)
+- Differentiate LEFT JOIN from LEFT OUTER JOIN [#1726](https://github.com/apache/datafusion-sqlparser-rs/pull/1726) (mvzink)
+- Add support for Postgres `ALTER TYPE` [#1727](https://github.com/apache/datafusion-sqlparser-rs/pull/1727) (jvatic)
+- Replace `Method` and `CompositeAccess` with `CompoundFieldAccess` [#1716](https://github.com/apache/datafusion-sqlparser-rs/pull/1716) (iffyio)
+- Add support for `EXECUTE IMMEDIATE` [#1717](https://github.com/apache/datafusion-sqlparser-rs/pull/1717) (iffyio)
+- Treat COLLATE like any other column option [#1731](https://github.com/apache/datafusion-sqlparser-rs/pull/1731) (mvzink)
+- Add support for PostgreSQL/Redshift geometric operators [#1723](https://github.com/apache/datafusion-sqlparser-rs/pull/1723) (benrsatori)
+- Implement SnowFlake ALTER SESSION [#1712](https://github.com/apache/datafusion-sqlparser-rs/pull/1712) (osipovartem)
+- Extend Visitor trait for Value type [#1725](https://github.com/apache/datafusion-sqlparser-rs/pull/1725) (tomershaniii)
+- Add support for `ORDER BY ALL` [#1724](https://github.com/apache/datafusion-sqlparser-rs/pull/1724) (PokIsemaine)
+- Parse casting to array using double colon operator in Redshift [#1737](https://github.com/apache/datafusion-sqlparser-rs/pull/1737) (yoavcloud)
+- Replace parallel condition/result vectors with single CaseWhen vector in Expr::Case. This fixes the iteration order when using the `Visitor` trait. Expressions are now visited in the same order as they appear in the sql source. [#1733](https://github.com/apache/datafusion-sqlparser-rs/pull/1733) (lovasoa)
+- BigQuery: Add support for `BEGIN` [#1718](https://github.com/apache/datafusion-sqlparser-rs/pull/1718) (iffyio)
+- Parse SIGNED INTEGER type in MySQL CAST [#1739](https://github.com/apache/datafusion-sqlparser-rs/pull/1739) (mvzink)
+- Parse MySQL ALTER TABLE ALGORITHM option [#1745](https://github.com/apache/datafusion-sqlparser-rs/pull/1745) (mvzink)
+- Random test cleanups use Expr::value [#1749](https://github.com/apache/datafusion-sqlparser-rs/pull/1749) (alamb)
+- Parse ALTER TABLE AUTO_INCREMENT operation for MySQL [#1748](https://github.com/apache/datafusion-sqlparser-rs/pull/1748) (mvzink)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+    10	Yoav Cohen
+     9	Ifeanyi Ubah
+     7	Michael Victor Zink
+     3	Hans Ott
+     2	Andrew Lamb
+     2	Ophir LOJKINE
+     2	Paul Grau
+     2	Rémy SAISSY
+     2	wugeer
+     1	Armin Ronacher
+     1	Artem Osipov
+     1	AvivDavid-Satori
+     1	Ayman Elkfrawy
+     1	DanCodedThis
+     1	Denys Tsomenko
+     1	Emil
+     1	Ian Alexander Joiner
+     1	Jesse Stuart
+     1	Justin Joyce
+     1	Michael
+     1	SiLe Zhou
+     1	Tyler Brinks
+     1	benrsatori
+     1	gstvg
+     1	tomershaniii
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/changelog/0.56.0.md b/changelog/0.56.0.md
new file mode 100644
index 000000000..b3c8a67aa
--- /dev/null
+++ b/changelog/0.56.0.md
@@ -0,0 +1,102 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.56.0 Changelog
+
+This release consists of 48 commits from 19 contributors. See credits at the end of this changelog for more information.
+
+**Other:**
+
+- Ignore escaped LIKE wildcards in MySQL [#1735](https://github.com/apache/datafusion-sqlparser-rs/pull/1735) (mvzink)
+- Parse SET NAMES syntax in Postgres [#1752](https://github.com/apache/datafusion-sqlparser-rs/pull/1752) (mvzink)
+- re-add support for nested comments in mssql [#1754](https://github.com/apache/datafusion-sqlparser-rs/pull/1754) (lovasoa)
+- Extend support for INDEX parsing [#1707](https://github.com/apache/datafusion-sqlparser-rs/pull/1707) (LucaCappelletti94)
+- Parse MySQL `ALTER TABLE DROP FOREIGN KEY` syntax [#1762](https://github.com/apache/datafusion-sqlparser-rs/pull/1762) (mvzink)
+- add support for `with` clauses (CTEs) in `delete` statements [#1764](https://github.com/apache/datafusion-sqlparser-rs/pull/1764) (lovasoa)
+- SET with a list of comma separated assignments [#1757](https://github.com/apache/datafusion-sqlparser-rs/pull/1757) (MohamedAbdeen21)
+- Preserve MySQL-style `LIMIT <offset>, <limit>` syntax [#1765](https://github.com/apache/datafusion-sqlparser-rs/pull/1765) (mvzink)
+- Add support for `DROP MATERIALIZED VIEW` [#1743](https://github.com/apache/datafusion-sqlparser-rs/pull/1743) (iffyio)
+- Add `CASE` and `IF` statement support [#1741](https://github.com/apache/datafusion-sqlparser-rs/pull/1741) (iffyio)
+- BigQuery: Add support for `CREATE SCHEMA` options [#1742](https://github.com/apache/datafusion-sqlparser-rs/pull/1742) (iffyio)
+- Snowflake: Support dollar quoted comments [#1755](https://github.com/apache/datafusion-sqlparser-rs/pull/1755) 
+- Add LOCK operation for ALTER TABLE [#1768](https://github.com/apache/datafusion-sqlparser-rs/pull/1768) (MohamedAbdeen21)
+- Add support for `RAISE` statement [#1766](https://github.com/apache/datafusion-sqlparser-rs/pull/1766) (iffyio)
+- Add GLOBAL context/modifier to SET statements [#1767](https://github.com/apache/datafusion-sqlparser-rs/pull/1767) (MohamedAbdeen21)
+- Parse `SUBSTR` as alias for `SUBSTRING` [#1769](https://github.com/apache/datafusion-sqlparser-rs/pull/1769) (mvzink)
+- SET statements: scope modifier for multiple assignments [#1772](https://github.com/apache/datafusion-sqlparser-rs/pull/1772) (MohamedAbdeen21)
+- Support qualified column names in `MATCH AGAINST` clause [#1774](https://github.com/apache/datafusion-sqlparser-rs/pull/1774) (tomershaniii)
+- Mysql: Add support for := operator [#1779](https://github.com/apache/datafusion-sqlparser-rs/pull/1779) (barsela1)
+- Add cipherstash-proxy to list of users in README.md [#1782](https://github.com/apache/datafusion-sqlparser-rs/pull/1782) (coderdan)
+- Fix typos [#1785](https://github.com/apache/datafusion-sqlparser-rs/pull/1785) (jayvdb)
+- Add support for Databricks TIMESTAMP_NTZ. [#1781](https://github.com/apache/datafusion-sqlparser-rs/pull/1781) (romanb)
+- Enable double-dot-notation for mssql. [#1787](https://github.com/apache/datafusion-sqlparser-rs/pull/1787) (romanb)
+- Fix: Snowflake ALTER SESSION cannot be followed by other statements. [#1786](https://github.com/apache/datafusion-sqlparser-rs/pull/1786) (romanb)
+- Add GreptimeDB to the "Users" in README [#1788](https://github.com/apache/datafusion-sqlparser-rs/pull/1788) (MichaelScofield)
+- Extend snowflake grant options support [#1794](https://github.com/apache/datafusion-sqlparser-rs/pull/1794) (yoavcloud)
+- Fix clippy lint on rust 1.86 [#1796](https://github.com/apache/datafusion-sqlparser-rs/pull/1796) (iffyio)
+- Allow single quotes in EXTRACT() for Redshift. [#1795](https://github.com/apache/datafusion-sqlparser-rs/pull/1795) (romanb)
+- MSSQL: Add support for functionality `MERGE` output clause [#1790](https://github.com/apache/datafusion-sqlparser-rs/pull/1790) (dilovancelik)
+- Support additional DuckDB integer types such as HUGEINT, UHUGEINT, etc [#1797](https://github.com/apache/datafusion-sqlparser-rs/pull/1797) (alexander-beedie)
+- Add support for MSSQL IF/ELSE statements. [#1791](https://github.com/apache/datafusion-sqlparser-rs/pull/1791) (romanb)
+- Allow literal backslash escapes for string literals in Redshift dialect. [#1801](https://github.com/apache/datafusion-sqlparser-rs/pull/1801) (romanb)
+- Add support for MySQL's STRAIGHT_JOIN join operator. [#1802](https://github.com/apache/datafusion-sqlparser-rs/pull/1802) (romanb)
+- Snowflake COPY INTO target columns, select items and optional alias [#1805](https://github.com/apache/datafusion-sqlparser-rs/pull/1805) (yoavcloud)
+- Fix tokenization of qualified identifiers with numeric prefix. [#1803](https://github.com/apache/datafusion-sqlparser-rs/pull/1803) (romanb)
+- Add support for `INHERITS` option in `CREATE TABLE` statement [#1806](https://github.com/apache/datafusion-sqlparser-rs/pull/1806) (LucaCappelletti94)
+- Add `DROP TRIGGER` support for SQL Server [#1813](https://github.com/apache/datafusion-sqlparser-rs/pull/1813) (aharpervc)
+- Snowflake: support nested join without parentheses [#1799](https://github.com/apache/datafusion-sqlparser-rs/pull/1799) (barsela1)
+- Add support for parenthesized subquery as `IN` predicate [#1793](https://github.com/apache/datafusion-sqlparser-rs/pull/1793) (adamchainz)
+- Fix `STRAIGHT_JOIN` constraint when table alias is absent [#1812](https://github.com/apache/datafusion-sqlparser-rs/pull/1812) (killertux)
+- Add support for `PRINT` statement for SQL Server [#1811](https://github.com/apache/datafusion-sqlparser-rs/pull/1811) (aharpervc)
+- enable `supports_filter_during_aggregation` for Generic dialect [#1815](https://github.com/apache/datafusion-sqlparser-rs/pull/1815) (goldmedal)
+- Add support for `XMLTABLE` [#1817](https://github.com/apache/datafusion-sqlparser-rs/pull/1817) (lovasoa)
+- Add `CREATE FUNCTION` support for SQL Server [#1808](https://github.com/apache/datafusion-sqlparser-rs/pull/1808) (aharpervc)
+- Add `OR ALTER` support for `CREATE VIEW` [#1818](https://github.com/apache/datafusion-sqlparser-rs/pull/1818) (aharpervc)
+- Add `DECLARE ... CURSOR FOR` support for SQL Server [#1821](https://github.com/apache/datafusion-sqlparser-rs/pull/1821) (aharpervc)
+- Handle missing login in changelog generate script [#1823](https://github.com/apache/datafusion-sqlparser-rs/pull/1823) (iffyio)
+- Snowflake: Add support for `CONNECT_BY_ROOT` [#1780](https://github.com/apache/datafusion-sqlparser-rs/pull/1780) (tomershaniii)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+     8	Roman Borschel
+     6	Ifeanyi Ubah
+     5	Andrew Harper
+     5	Michael Victor Zink
+     4	Mohamed Abdeen
+     3	Ophir LOJKINE
+     2	Luca Cappelletti
+     2	Yoav Cohen
+     2	bar sela
+     2	tomershaniii
+     1	Adam Johnson
+     1	Aleksei Piianin
+     1	Alexander Beedie
+     1	Bruno Clemente
+     1	Dan Draper
+     1	DilovanCelik
+     1	Jax Liu
+     1	John Vandenberg
+     1	LFC
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/changelog/0.57.0.md b/changelog/0.57.0.md
new file mode 100644
index 000000000..200bb73af
--- /dev/null
+++ b/changelog/0.57.0.md
@@ -0,0 +1,95 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.57.0 Changelog
+
+This release consists of 39 commits from 19 contributors. See credits at the end of this changelog for more information.
+
+**Implemented enhancements:**
+
+- feat: Hive: support `SORT BY` direction [#1873](https://github.com/apache/datafusion-sqlparser-rs/pull/1873) (chenkovsky)
+
+**Other:**
+
+- Support some of pipe operators [#1759](https://github.com/apache/datafusion-sqlparser-rs/pull/1759) (simonvandel)
+- Added support for `DROP DOMAIN` [#1828](https://github.com/apache/datafusion-sqlparser-rs/pull/1828) (LucaCappelletti94)
+- Improve support for cursors for SQL Server [#1831](https://github.com/apache/datafusion-sqlparser-rs/pull/1831) (aharpervc)
+- Add all missing table options to be handled in any order [#1747](https://github.com/apache/datafusion-sqlparser-rs/pull/1747) (benrsatori)
+- Add `CREATE TRIGGER` support for SQL Server [#1810](https://github.com/apache/datafusion-sqlparser-rs/pull/1810) (aharpervc)
+- Added support for `CREATE DOMAIN` [#1830](https://github.com/apache/datafusion-sqlparser-rs/pull/1830) (LucaCappelletti94)
+- Allow stored procedures to be defined without `BEGIN`/`END` [#1834](https://github.com/apache/datafusion-sqlparser-rs/pull/1834) (aharpervc)
+- Add support for the MATCH and REGEXP binary operators [#1840](https://github.com/apache/datafusion-sqlparser-rs/pull/1840) (lovasoa)
+- Fix: parsing ident starting with underscore in certain dialects [#1835](https://github.com/apache/datafusion-sqlparser-rs/pull/1835) (MohamedAbdeen21)
+- implement pretty-printing with `{:#}` [#1847](https://github.com/apache/datafusion-sqlparser-rs/pull/1847) (lovasoa)
+- Fix big performance issue in string serialization [#1848](https://github.com/apache/datafusion-sqlparser-rs/pull/1848) (lovasoa)
+- Add support for `DENY` statements [#1836](https://github.com/apache/datafusion-sqlparser-rs/pull/1836) (aharpervc)
+- Postgresql: Add `REPLICA IDENTITY` operation for `ALTER TABLE` [#1844](https://github.com/apache/datafusion-sqlparser-rs/pull/1844) (MohamedAbdeen21)
+- Add support for INCLUDE/EXCLUDE NULLS for UNPIVOT [#1849](https://github.com/apache/datafusion-sqlparser-rs/pull/1849) (Vedin)
+- pretty print improvements [#1851](https://github.com/apache/datafusion-sqlparser-rs/pull/1851) (lovasoa)
+- fix new rust 1.87 cargo clippy warnings [#1856](https://github.com/apache/datafusion-sqlparser-rs/pull/1856) (lovasoa)
+- Update criterion requirement from 0.5 to 0.6 in /sqlparser_bench [#1857](https://github.com/apache/datafusion-sqlparser-rs/pull/1857) (dependabot[bot])
+- pretty-print CREATE TABLE statements [#1854](https://github.com/apache/datafusion-sqlparser-rs/pull/1854) (lovasoa)
+- pretty-print CREATE VIEW statements [#1855](https://github.com/apache/datafusion-sqlparser-rs/pull/1855) (lovasoa)
+- Handle optional datatypes properly in `CREATE FUNCTION` statements [#1826](https://github.com/apache/datafusion-sqlparser-rs/pull/1826) (LucaCappelletti94)
+- Mysql: Add `SRID` column option [#1852](https://github.com/apache/datafusion-sqlparser-rs/pull/1852) (MohamedAbdeen21)
+- Add support for table valued functions for SQL Server [#1839](https://github.com/apache/datafusion-sqlparser-rs/pull/1839) (aharpervc)
+- Keep the COLUMN keyword only if it exists when dropping the column [#1862](https://github.com/apache/datafusion-sqlparser-rs/pull/1862) (git-hulk)
+- Add support for parameter default values in SQL Server [#1866](https://github.com/apache/datafusion-sqlparser-rs/pull/1866) (aharpervc)
+- Add support for `TABLESAMPLE` pipe operator [#1860](https://github.com/apache/datafusion-sqlparser-rs/pull/1860) (hendrikmakait)
+- Adds support for mysql's drop index [#1864](https://github.com/apache/datafusion-sqlparser-rs/pull/1864) (dmzmk)
+- Fix: GROUPING SETS accept values without parenthesis [#1867](https://github.com/apache/datafusion-sqlparser-rs/pull/1867) (Vedin)
+- Add ICEBERG keyword support to ALTER TABLE statement [#1869](https://github.com/apache/datafusion-sqlparser-rs/pull/1869) (osipovartem)
+- MySQL: Support `index_name` in FK constraints [#1871](https://github.com/apache/datafusion-sqlparser-rs/pull/1871) (MohamedAbdeen21)
+- Postgres: Apply `ONLY` keyword per table in TRUNCATE stmt [#1872](https://github.com/apache/datafusion-sqlparser-rs/pull/1872) (MohamedAbdeen21)
+- Fix `CASE` expression spans [#1874](https://github.com/apache/datafusion-sqlparser-rs/pull/1874) (eliaperantoni)
+- MySQL: `[[NOT] ENFORCED]` in CHECK constraint [#1870](https://github.com/apache/datafusion-sqlparser-rs/pull/1870) (MohamedAbdeen21)
+- Add support for `CREATE SCHEMA WITH ( <properties> )` [#1877](https://github.com/apache/datafusion-sqlparser-rs/pull/1877) (utay)
+- Add support for `ALTER TABLE DROP INDEX` [#1865](https://github.com/apache/datafusion-sqlparser-rs/pull/1865) (vimko)
+- chore: Replace archived actions-rs/install action  [#1876](https://github.com/apache/datafusion-sqlparser-rs/pull/1876) (assignUser)
+- Allow `IF NOT EXISTS` after table name for Snowflake [#1881](https://github.com/apache/datafusion-sqlparser-rs/pull/1881) (bombsimon)
+- Support `DISTINCT AS { STRUCT | VALUE }` for BigQuery [#1880](https://github.com/apache/datafusion-sqlparser-rs/pull/1880) (bombsimon)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+     7	Ophir LOJKINE
+     6	Andrew Harper
+     6	Mohamed Abdeen
+     3	Luca Cappelletti
+     2	Denys Tsomenko
+     2	Simon Sawert
+     1	Andrew Lamb
+     1	Artem Osipov
+     1	Chen Chongchen
+     1	Dmitriy Mazurin
+     1	Elia Perantoni
+     1	Hendrik Makait
+     1	Jacob Wujciak-Jens
+     1	Simon Vandel Sillesen
+     1	Yannick Utard
+     1	benrsatori
+     1	dependabot[bot]
+     1	hulk
+     1	vimko
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/changelog/0.58.0.md b/changelog/0.58.0.md
new file mode 100644
index 000000000..27a985d7c
--- /dev/null
+++ b/changelog/0.58.0.md
@@ -0,0 +1,106 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# sqlparser-rs 0.58.0 Changelog
+
+This release consists of 47 commits from 18 contributors. See credits at the end of this changelog for more information.
+
+**Fixed bugs:**
+
+- fix: parse snowflake fetch clause [#1894](https://github.com/apache/datafusion-sqlparser-rs/pull/1894) (Vedin)
+
+**Documentation updates:**
+
+- docs: Update rust badge [#1943](https://github.com/apache/datafusion-sqlparser-rs/pull/1943) (Olexandr88)
+
+**Other:**
+
+- Add license header check to CI [#1888](https://github.com/apache/datafusion-sqlparser-rs/pull/1888) (alamb)
+- Add support of parsing struct field's options in BigQuery [#1890](https://github.com/apache/datafusion-sqlparser-rs/pull/1890) (git-hulk)
+- Fix parsing error when having fields after nested struct in BigQuery [#1897](https://github.com/apache/datafusion-sqlparser-rs/pull/1897) (git-hulk)
+- Extend exception handling [#1884](https://github.com/apache/datafusion-sqlparser-rs/pull/1884) (bombsimon)
+- Postgres: Add support for text search types [#1889](https://github.com/apache/datafusion-sqlparser-rs/pull/1889) (MohamedAbdeen21)
+- Fix `limit` in subqueries [#1899](https://github.com/apache/datafusion-sqlparser-rs/pull/1899) (Dimchikkk)
+- Use `IndexColumn` in all index definitions [#1900](https://github.com/apache/datafusion-sqlparser-rs/pull/1900) (mvzink)
+- Support procedure argmode [#1901](https://github.com/apache/datafusion-sqlparser-rs/pull/1901) (ZacJW)
+- Fix `impl Ord for Ident` [#1893](https://github.com/apache/datafusion-sqlparser-rs/pull/1893) (eliaperantoni)
+- Snowflake: support multiple column options in `CREATE VIEW` [#1891](https://github.com/apache/datafusion-sqlparser-rs/pull/1891) (eliaperantoni)
+- Add support for `LANGUAGE` clause in `CREATE PROCEDURE` [#1903](https://github.com/apache/datafusion-sqlparser-rs/pull/1903) (ZacJW)
+- Fix clippy lints on 1.88.0 [#1910](https://github.com/apache/datafusion-sqlparser-rs/pull/1910) (iffyio)
+- Snowflake: Add support for future grants [#1906](https://github.com/apache/datafusion-sqlparser-rs/pull/1906) (yoavcloud)
+- Support for Map values in ClickHouse settings [#1896](https://github.com/apache/datafusion-sqlparser-rs/pull/1896) (solontsev)
+- Fix join precedence for non-snowflake queries [#1905](https://github.com/apache/datafusion-sqlparser-rs/pull/1905) (Dimchikkk)
+- Support remaining pipe operators [#1879](https://github.com/apache/datafusion-sqlparser-rs/pull/1879) (simonvandel)
+- Make `GenericDialect` support from-first syntax [#1911](https://github.com/apache/datafusion-sqlparser-rs/pull/1911) (simonvandel)
+- Redshift utf8 idents [#1915](https://github.com/apache/datafusion-sqlparser-rs/pull/1915) (yoavcloud)
+- DuckDB: Add support for multiple `TRIM` arguments [#1916](https://github.com/apache/datafusion-sqlparser-rs/pull/1916) (ryanschneider)
+- Redshift alter column type no set [#1912](https://github.com/apache/datafusion-sqlparser-rs/pull/1912) (yoavcloud)
+- Postgres: support `ADD CONSTRAINT NOT VALID` and `VALIDATE CONSTRAINT` [#1908](https://github.com/apache/datafusion-sqlparser-rs/pull/1908) (achristmascarl)
+- Add support for MySQL MEMBER OF [#1917](https://github.com/apache/datafusion-sqlparser-rs/pull/1917) (yoavcloud)
+- Add span for `Expr::TypedString` [#1919](https://github.com/apache/datafusion-sqlparser-rs/pull/1919) (feral-dot-io)
+- Support for Postgres `CREATE SERVER` [#1914](https://github.com/apache/datafusion-sqlparser-rs/pull/1914) (solontsev)
+- Change tag and policy names to `ObjectName` [#1892](https://github.com/apache/datafusion-sqlparser-rs/pull/1892) (eliaperantoni)
+- Add support for NULL escape char in pattern match searches [#1913](https://github.com/apache/datafusion-sqlparser-rs/pull/1913) (yoavcloud)
+- Add support for dropping multiple columns in Snowflake [#1918](https://github.com/apache/datafusion-sqlparser-rs/pull/1918) (yoavcloud)
+- Align Snowflake dialect to new test of reserved keywords [#1924](https://github.com/apache/datafusion-sqlparser-rs/pull/1924) (yoavcloud)
+- Make `GenericDialect` support trailing commas in projections [#1921](https://github.com/apache/datafusion-sqlparser-rs/pull/1921) (simonvandel)
+- Add support for several Snowflake grant statements [#1922](https://github.com/apache/datafusion-sqlparser-rs/pull/1922) (yoavcloud)
+- Clickhouse: support empty parenthesized options [#1925](https://github.com/apache/datafusion-sqlparser-rs/pull/1925) (solontsev)
+- Add Snowflake `COPY/REVOKE CURRENT GRANTS` option [#1926](https://github.com/apache/datafusion-sqlparser-rs/pull/1926) (yoavcloud)
+- Add support for Snowflake identifier function [#1929](https://github.com/apache/datafusion-sqlparser-rs/pull/1929) (yoavcloud)
+- Add support for granting privileges to procedures and functions in Snowflake [#1930](https://github.com/apache/datafusion-sqlparser-rs/pull/1930) (yoavcloud)
+- Add support for `+` char in Snowflake stage names [#1935](https://github.com/apache/datafusion-sqlparser-rs/pull/1935) (yoavcloud)
+- Snowflake Reserved SQL Keywords as Implicit Table Alias [#1934](https://github.com/apache/datafusion-sqlparser-rs/pull/1934) (yoavcloud)
+- Add support for Redshift `SELECT * EXCLUDE` [#1936](https://github.com/apache/datafusion-sqlparser-rs/pull/1936) (yoavcloud)
+- Support optional semicolon between statements [#1937](https://github.com/apache/datafusion-sqlparser-rs/pull/1937) (yoavcloud)
+- Snowflake: support trailing options in `CREATE TABLE` [#1931](https://github.com/apache/datafusion-sqlparser-rs/pull/1931) (yoavcloud)
+- MSSQL: Add support for EXEC output and default keywords [#1940](https://github.com/apache/datafusion-sqlparser-rs/pull/1940) (yoavcloud)
+- Add identifier unicode support in Mysql, Postgres and Redshift [#1933](https://github.com/apache/datafusion-sqlparser-rs/pull/1933) (etgarperets)
+- Add identifier start unicode support for Postegres, MySql and Redshift [#1944](https://github.com/apache/datafusion-sqlparser-rs/pull/1944) (etgarperets)
+- Fix for Postgres regex and like binary operators [#1928](https://github.com/apache/datafusion-sqlparser-rs/pull/1928) (solontsev)
+- Snowflake: Improve accuracy of lookahead in implicit LIMIT alias [#1941](https://github.com/apache/datafusion-sqlparser-rs/pull/1941) (yoavcloud)
+- Add support for `DROP USER` statement [#1951](https://github.com/apache/datafusion-sqlparser-rs/pull/1951) (yoavcloud)
+
+## Credits
+
+Thank you to everyone who contributed to this release. Here is a breakdown of commits (PRs merged) per contributor.
+
+```
+    19	Yoav Cohen
+     4	Sergey Olontsev
+     3	Elia Perantoni
+     3	Simon Vandel Sillesen
+     2	Dima
+     2	ZacJW
+     2	etgarperets
+     2	hulk
+     1	Andrew Lamb
+     1	Denys Tsomenko
+     1	Ifeanyi Ubah
+     1	Michael Victor Zink
+     1	Mohamed Abdeen
+     1	Olexandr88
+     1	Ryan Schneider
+     1	Simon Sawert
+     1	carl
+     1	feral-dot-io
+```
+
+Thank you also to everyone who contributed in other ways such as filing issues, reviewing PRs, and providing feedback on this release.
+
diff --git a/derive/Cargo.toml b/derive/Cargo.toml
index 0c5852c4c..7b6477300 100644
--- a/derive/Cargo.toml
+++ b/derive/Cargo.toml
@@ -17,8 +17,8 @@
 
 [package]
 name = "sqlparser_derive"
-description = "proc macro for sqlparser"
-version = "0.2.2"
+description = "Procedural (proc) macros for sqlparser"
+version = "0.3.0"
 authors = ["sqlparser-rs authors"]
 homepage = "https://github.com/sqlparser-rs/sqlparser-rs"
 documentation = "https://docs.rs/sqlparser_derive/"
@@ -28,6 +28,7 @@ license = "Apache-2.0"
 include = [
     "src/**/*.rs",
     "Cargo.toml",
+    "LICENSE.TXT",
 ]
 edition = "2021"
 
diff --git a/derive/LICENSE.TXT b/derive/LICENSE.TXT
new file mode 120000
index 000000000..14259afe2
--- /dev/null
+++ b/derive/LICENSE.TXT
@@ -0,0 +1 @@
+../LICENSE.TXT
\ No newline at end of file
diff --git a/derive/README.md b/derive/README.md
index aa70e7c71..b5ccc69e0 100644
--- a/derive/README.md
+++ b/derive/README.md
@@ -151,6 +151,55 @@ visitor.post_visit_expr(<is null operand>)
 visitor.post_visit_expr(<is null expr>)
 ```
 
+If the field is a `Option` and add `#[with = "visit_xxx"]` to the field, the generated code
+will try to access the field only if it is `Some`:
+
+```rust
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ShowStatementIn {
+    pub clause: ShowStatementInClause,
+    pub parent_type: Option<ShowStatementInParentType>,
+    #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
+    pub parent_name: Option<ObjectName>,
+}
+```
+
+This will generate
+
+```rust
+impl sqlparser::ast::Visit for ShowStatementIn {
+    fn visit<V: sqlparser::ast::Visitor>(
+        &self,
+        visitor: &mut V,
+    ) -> ::std::ops::ControlFlow<V::Break> {
+        sqlparser::ast::Visit::visit(&self.clause, visitor)?;
+        sqlparser::ast::Visit::visit(&self.parent_type, visitor)?;
+        if let Some(value) = &self.parent_name {
+            visitor.pre_visit_relation(value)?;
+            sqlparser::ast::Visit::visit(value, visitor)?;
+            visitor.post_visit_relation(value)?;
+        }
+        ::std::ops::ControlFlow::Continue(())
+    }
+}
+
+impl sqlparser::ast::VisitMut for ShowStatementIn {
+    fn visit<V: sqlparser::ast::VisitorMut>(
+        &mut self,
+        visitor: &mut V,
+    ) -> ::std::ops::ControlFlow<V::Break> {
+        sqlparser::ast::VisitMut::visit(&mut self.clause, visitor)?;
+        sqlparser::ast::VisitMut::visit(&mut self.parent_type, visitor)?;
+        if let Some(value) = &mut self.parent_name {
+            visitor.pre_visit_relation(value)?;
+            sqlparser::ast::VisitMut::visit(value, visitor)?;
+            visitor.post_visit_relation(value)?;
+        }
+        ::std::ops::ControlFlow::Continue(())
+    }
+}
+```
+
 ## Releasing
 
 This crate's release is not automated. Instead it is released manually as needed
diff --git a/derive/src/lib.rs b/derive/src/lib.rs
index 5ad1607f9..08c5c5db4 100644
--- a/derive/src/lib.rs
+++ b/derive/src/lib.rs
@@ -21,8 +21,9 @@ use syn::spanned::Spanned;
 use syn::{
     parse::{Parse, ParseStream},
     parse_macro_input, parse_quote, Attribute, Data, DeriveInput, Fields, GenericParam, Generics,
-    Ident, Index, LitStr, Meta, Token,
+    Ident, Index, LitStr, Meta, Token, Type, TypePath,
 };
+use syn::{Path, PathArguments};
 
 /// Implementation of `[#derive(Visit)]`
 #[proc_macro_derive(VisitMut, attributes(visit))]
@@ -77,7 +78,10 @@ fn derive_visit(input: proc_macro::TokenStream, visit_type: &VisitType) -> proc_
 
     let expanded = quote! {
         // The generated impl.
+        // Note that it uses [`recursive::recursive`] to protect from stack overflow.
+        // See tests in https://github.com/apache/datafusion-sqlparser-rs/pull/1522/ for more info.
         impl #impl_generics sqlparser::ast::#visit_trait for #name #ty_generics #where_clause {
+             #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
             fn visit<V: sqlparser::ast::#visitor_trait>(
                 &#modifier self,
                 visitor: &mut V
@@ -182,9 +186,21 @@ fn visit_children(
             Fields::Named(fields) => {
                 let recurse = fields.named.iter().map(|f| {
                     let name = &f.ident;
+                    let is_option = is_option(&f.ty);
                     let attributes = Attributes::parse(&f.attrs);
-                    let (pre_visit, post_visit) = attributes.visit(quote!(&#modifier self.#name));
-                    quote_spanned!(f.span() => #pre_visit sqlparser::ast::#visit_trait::visit(&#modifier self.#name, visitor)?; #post_visit)
+                    if is_option && attributes.with.is_some() {
+                        let (pre_visit, post_visit) = attributes.visit(quote!(value));
+                        quote_spanned!(f.span() =>
+                            if let Some(value) = &#modifier self.#name {
+                                #pre_visit sqlparser::ast::#visit_trait::visit(value, visitor)?; #post_visit
+                            }
+                        )
+                    } else {
+                        let (pre_visit, post_visit) = attributes.visit(quote!(&#modifier self.#name));
+                        quote_spanned!(f.span() =>
+                            #pre_visit sqlparser::ast::#visit_trait::visit(&#modifier self.#name, visitor)?; #post_visit
+                        )
+                    }
                 });
                 quote! {
                     #(#recurse)*
@@ -256,3 +272,20 @@ fn visit_children(
         Data::Union(_) => unimplemented!(),
     }
 }
+
+fn is_option(ty: &Type) -> bool {
+    if let Type::Path(TypePath {
+        path: Path { segments, .. },
+        ..
+    }) = ty
+    {
+        if let Some(segment) = segments.last() {
+            if segment.ident == "Option" {
+                if let PathArguments::AngleBracketed(args) = &segment.arguments {
+                    return args.args.len() == 1;
+                }
+            }
+        }
+    }
+    false
+}
diff --git a/dev/release/README.md b/dev/release/README.md
index c440f7387..c3018dd68 100644
--- a/dev/release/README.md
+++ b/dev/release/README.md
@@ -146,6 +146,12 @@ Move artifacts to the release location in SVN, using the `release-tarball.sh` sc
 ```shell
 ./dev/release/release-tarball.sh 0.52.0 1
 ```
+ 
+Promote the rc tag to the release tag
+```shell
+git tag v0.52.0 v0.52.0-rc3
+git push apache v0.52.0
+```
 
 Congratulations! The release is now official!
 
diff --git a/dev/release/generate-changelog.py b/dev/release/generate-changelog.py
index 52fd2e548..6f2b7c41c 100755
--- a/dev/release/generate-changelog.py
+++ b/dev/release/generate-changelog.py
@@ -28,7 +28,8 @@ def print_pulls(repo_name, title, pulls):
         print()
         for (pull, commit) in pulls:
             url = "https://github.com/{}/pull/{}".format(repo_name, pull.number)
-            print("- {} [#{}]({}) ({})".format(pull.title, pull.number, url, commit.author.login))
+            author = f"({commit.author.login})" if commit.author else ''
+            print("- {} [#{}]({}) {}".format(pull.title, pull.number, url, author))
         print()
 
 
@@ -161,4 +162,4 @@ def cli(args=None):
     generate_changelog(repo, project, args.tag1, args.tag2, args.version)
 
 if __name__ == "__main__":
-    cli()
\ No newline at end of file
+    cli()
diff --git a/dev/release/rat_exclude_files.txt b/dev/release/rat_exclude_files.txt
index a567eda9c..280b1bce6 100644
--- a/dev/release/rat_exclude_files.txt
+++ b/dev/release/rat_exclude_files.txt
@@ -1,6 +1,8 @@
-# Files to exclude from the Apache Rat (license) check
-.gitignore
 .tool-versions
+target/*
+**.gitignore
+rat.txt
 dev/release/rat_exclude_files.txt
-fuzz/.gitignore
-
+sqlparser_bench/img/flamegraph.svg
+**Cargo.lock
+filtered_rat.txt
diff --git a/examples/cli.rs b/examples/cli.rs
index 8a5d6501e..08a40a6dd 100644
--- a/examples/cli.rs
+++ b/examples/cli.rs
@@ -17,9 +17,11 @@
 
 #![warn(clippy::all)]
 
-/// A small command-line app to run the parser.
-/// Run with `cargo run --example cli`
+//! A small command-line app to run the parser.
+//! Run with `cargo run --example cli`
+
 use std::fs;
+use std::io::{stdin, Read};
 
 use simple_logger::SimpleLogger;
 use sqlparser::dialect::*;
@@ -38,6 +40,9 @@ $ cargo run --example cli FILENAME.sql [--dialectname]
 To print the parse results as JSON:
 $ cargo run --feature json_example --example cli FILENAME.sql [--dialectname]
 
+To read from stdin instead of a file:
+$ cargo run --example cli - [--dialectname]
+
 "#,
     );
 
@@ -57,9 +62,18 @@ $ cargo run --feature json_example --example cli FILENAME.sql [--dialectname]
         s => panic!("Unexpected parameter: {s}"),
     };
 
-    println!("Parsing from file '{}' using {:?}", &filename, dialect);
-    let contents = fs::read_to_string(&filename)
-        .unwrap_or_else(|_| panic!("Unable to read the file {}", &filename));
+    let contents = if filename == "-" {
+        println!("Parsing from stdin using {dialect:?}");
+        let mut buf = Vec::new();
+        stdin()
+            .read_to_end(&mut buf)
+            .expect("failed to read from stdin");
+        String::from_utf8(buf).expect("stdin content wasn't valid utf8")
+    } else {
+        println!("Parsing from file '{}' using {:?}", &filename, dialect);
+        fs::read_to_string(&filename)
+            .unwrap_or_else(|_| panic!("Unable to read the file {}", &filename))
+    };
     let without_bom = if contents.chars().next().unwrap() as u64 != 0xfeff {
         contents.as_str()
     } else {
diff --git a/sqlparser_bench/Cargo.toml b/sqlparser_bench/Cargo.toml
index 9c33658a2..4fb9af16e 100644
--- a/sqlparser_bench/Cargo.toml
+++ b/sqlparser_bench/Cargo.toml
@@ -17,6 +17,7 @@
 
 [package]
 name = "sqlparser_bench"
+description = "Benchmarks for sqlparser"
 version = "0.1.0"
 authors = ["Dandandan <danielheres@gmail.com>"]
 edition = "2018"
@@ -25,7 +26,7 @@ edition = "2018"
 sqlparser = { path = "../" }
 
 [dev-dependencies]
-criterion = "0.5"
+criterion = "0.7"
 
 [[bench]]
 name = "sqlparser_bench"
diff --git a/sqlparser_bench/README.md b/sqlparser_bench/README.md
new file mode 100644
index 000000000..7f2c26254
--- /dev/null
+++ b/sqlparser_bench/README.md
@@ -0,0 +1,42 @@
+<!---
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+Benchmarks for sqlparser. See [the main README](../README.md) for more information.
+
+Note: this is in a separate, non workspace crate to avoid adding a dependency 
+on `criterion` to the main crate (which complicates testing without std).
+
+# Running Benchmarks
+
+```shell
+cargo bench --bench sqlparser_bench
+```
+
+# Profiling
+
+Note you can generate a [flamegraph] using the following command:
+
+```shell
+cargo flamegraph --bench sqlparser_bench
+```
+
+[flamegraph]: https://crates.io/crates/flamegraph
+
+Here is an example flamegraph:
+![flamegraph](img/flamegraph.svg)
diff --git a/sqlparser_bench/benches/sqlparser_bench.rs b/sqlparser_bench/benches/sqlparser_bench.rs
index 27c58b450..6132ee432 100644
--- a/sqlparser_bench/benches/sqlparser_bench.rs
+++ b/sqlparser_bench/benches/sqlparser_bench.rs
@@ -23,9 +23,9 @@ fn basic_queries(c: &mut Criterion) {
     let mut group = c.benchmark_group("sqlparser-rs parsing benchmark");
     let dialect = GenericDialect {};
 
-    let string = "SELECT * FROM table WHERE 1 = 1";
+    let string = "SELECT * FROM my_table WHERE 1 = 1";
     group.bench_function("sqlparser::select", |b| {
-        b.iter(|| Parser::parse_sql(&dialect, string));
+        b.iter(|| Parser::parse_sql(&dialect, string).unwrap());
     });
 
     let with_query = "
@@ -33,14 +33,52 @@ fn basic_queries(c: &mut Criterion) {
             SELECT MAX(a) AS max_a,
                    COUNT(b) AS b_num,
                    user_id
-            FROM TABLE
+            FROM MY_TABLE
             GROUP BY user_id
         )
-        SELECT * FROM table
+        SELECT * FROM my_table
         LEFT JOIN derived USING (user_id)
     ";
     group.bench_function("sqlparser::with_select", |b| {
-        b.iter(|| Parser::parse_sql(&dialect, with_query));
+        b.iter(|| Parser::parse_sql(&dialect, with_query).unwrap());
+    });
+
+    let large_statement = {
+        let expressions = (0..1000)
+            .map(|n| format!("FN_{n}(COL_{n})"))
+            .collect::<Vec<_>>()
+            .join(", ");
+        let tables = (0..1000)
+            .map(|n| format!("TABLE_{n}"))
+            .collect::<Vec<_>>()
+            .join(" JOIN ");
+        let where_condition = (0..1000)
+            .map(|n| format!("COL_{n} = {n}"))
+            .collect::<Vec<_>>()
+            .join(" OR ");
+        let order_condition = (0..1000)
+            .map(|n| format!("COL_{n} DESC"))
+            .collect::<Vec<_>>()
+            .join(", ");
+
+        format!(
+            "SELECT {expressions} FROM {tables} WHERE {where_condition} ORDER BY {order_condition}"
+        )
+    };
+
+    group.bench_function("parse_large_statement", |b| {
+        b.iter(|| Parser::parse_sql(&dialect, std::hint::black_box(large_statement.as_str())));
+    });
+
+    let large_statement = Parser::parse_sql(&dialect, large_statement.as_str())
+        .unwrap()
+        .pop()
+        .unwrap();
+
+    group.bench_function("format_large_statement", |b| {
+        b.iter(|| {
+            let _formatted_query = large_statement.to_string();
+        });
     });
 }
 
diff --git a/sqlparser_bench/img/flamegraph.svg b/sqlparser_bench/img/flamegraph.svg
new file mode 100644
index 000000000..0aaa17e06
--- /dev/null
+++ b/sqlparser_bench/img/flamegraph.svg
@@ -0,0 +1,491 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg version="1.1" width="1200" height="1686" onload="init(evt)" viewBox="0 0 1200 1686" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fg="http://github.com/jonhoo/inferno"><!--Flame graph stack visualization. See https://github.com/brendangregg/FlameGraph for latest version, and http://www.brendangregg.com/flamegraphs.html for examples.--><!--NOTES: --><defs><linearGradient id="background" y1="0" y2="1" x1="0" x2="0"><stop stop-color="#eeeeee" offset="5%"/><stop stop-color="#eeeeb0" offset="95%"/></linearGradient></defs><style type="text/css">
+text { font-family:monospace; font-size:12px }
+#title { text-anchor:middle; font-size:17px; }
+#matched { text-anchor:end; }
+#search { text-anchor:end; opacity:0.1; cursor:pointer; }
+#search:hover, #search.show { opacity:1; }
+#subtitle { text-anchor:middle; font-color:rgb(160,160,160); }
+#unzoom { cursor:pointer; }
+#frames > *:hover { stroke:black; stroke-width:0.5; cursor:pointer; }
+.hide { display:none; }
+.parent { opacity:0.5; }
+</style><script type="text/ecmascript"><![CDATA[
+        var nametype = 'Function:';
+        var fontsize = 12;
+        var fontwidth = 0.59;
+        var xpad = 10;
+        var inverted = false;
+        var searchcolor = 'rgb(230,0,230)';
+        var fluiddrawing = true;
+        var truncate_text_right = false;
+    ]]><![CDATA["use strict";
+var details, searchbtn, unzoombtn, matchedtxt, svg, searching, frames, known_font_width;
+function init(evt) {
+    details = document.getElementById("details").firstChild;
+    searchbtn = document.getElementById("search");
+    unzoombtn = document.getElementById("unzoom");
+    matchedtxt = document.getElementById("matched");
+    svg = document.getElementsByTagName("svg")[0];
+    frames = document.getElementById("frames");
+    known_font_width = get_monospace_width(frames);
+    total_samples = parseInt(frames.attributes.total_samples.value);
+    searching = 0;
+
+    // Use GET parameters to restore a flamegraph's state.
+    var restore_state = function() {
+        var params = get_params();
+        if (params.x && params.y)
+            zoom(find_group(document.querySelector('[*|x="' + params.x + '"][y="' + params.y + '"]')));
+        if (params.s)
+            search(params.s);
+    };
+
+    if (fluiddrawing) {
+        // Make width dynamic so the SVG fits its parent's width.
+        svg.removeAttribute("width");
+        // Edge requires us to have a viewBox that gets updated with size changes.
+        var isEdge = /Edge\/\d./i.test(navigator.userAgent);
+        if (!isEdge) {
+            svg.removeAttribute("viewBox");
+        }
+        var update_for_width_change = function() {
+            if (isEdge) {
+                svg.attributes.viewBox.value = "0 0 " + svg.width.baseVal.value + " " + svg.height.baseVal.value;
+            }
+
+            // Keep consistent padding on left and right of frames container.
+            frames.attributes.width.value = svg.width.baseVal.value - xpad * 2;
+
+            // Text truncation needs to be adjusted for the current width.
+            update_text_for_elements(frames.children);
+
+            // Keep search elements at a fixed distance from right edge.
+            var svgWidth = svg.width.baseVal.value;
+            searchbtn.attributes.x.value = svgWidth - xpad;
+            matchedtxt.attributes.x.value = svgWidth - xpad;
+        };
+        window.addEventListener('resize', function() {
+            update_for_width_change();
+        });
+        // This needs to be done asynchronously for Safari to work.
+        setTimeout(function() {
+            unzoom();
+            update_for_width_change();
+            restore_state();
+        }, 0);
+    } else {
+        restore_state();
+    }
+}
+// event listeners
+window.addEventListener("click", function(e) {
+    var target = find_group(e.target);
+    if (target) {
+        if (target.nodeName == "a") {
+            if (e.ctrlKey === false) return;
+            e.preventDefault();
+        }
+        if (target.classList.contains("parent")) unzoom();
+        zoom(target);
+
+        // set parameters for zoom state
+        var el = target.querySelector("rect");
+        if (el && el.attributes && el.attributes.y && el.attributes["fg:x"]) {
+            var params = get_params()
+            params.x = el.attributes["fg:x"].value;
+            params.y = el.attributes.y.value;
+            history.replaceState(null, null, parse_params(params));
+        }
+    }
+    else if (e.target.id == "unzoom") {
+        unzoom();
+
+        // remove zoom state
+        var params = get_params();
+        if (params.x) delete params.x;
+        if (params.y) delete params.y;
+        history.replaceState(null, null, parse_params(params));
+    }
+    else if (e.target.id == "search") search_prompt();
+}, false)
+// mouse-over for info
+// show
+window.addEventListener("mouseover", function(e) {
+    var target = find_group(e.target);
+    if (target) details.nodeValue = nametype + " " + g_to_text(target);
+}, false)
+// clear
+window.addEventListener("mouseout", function(e) {
+    var target = find_group(e.target);
+    if (target) details.nodeValue = ' ';
+}, false)
+// ctrl-F for search
+window.addEventListener("keydown",function (e) {
+    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
+        e.preventDefault();
+        search_prompt();
+    }
+}, false)
+// functions
+function get_params() {
+    var params = {};
+    var paramsarr = window.location.search.substr(1).split('&');
+    for (var i = 0; i < paramsarr.length; ++i) {
+        var tmp = paramsarr[i].split("=");
+        if (!tmp[0] || !tmp[1]) continue;
+        params[tmp[0]]  = decodeURIComponent(tmp[1]);
+    }
+    return params;
+}
+function parse_params(params) {
+    var uri = "?";
+    for (var key in params) {
+        uri += key + '=' + encodeURIComponent(params[key]) + '&';
+    }
+    if (uri.slice(-1) == "&")
+        uri = uri.substring(0, uri.length - 1);
+    if (uri == '?')
+        uri = window.location.href.split('?')[0];
+    return uri;
+}
+function find_child(node, selector) {
+    var children = node.querySelectorAll(selector);
+    if (children.length) return children[0];
+    return;
+}
+function find_group(node) {
+    var parent = node.parentElement;
+    if (!parent) return;
+    if (parent.id == "frames") return node;
+    return find_group(parent);
+}
+function orig_save(e, attr, val) {
+    if (e.attributes["fg:orig_" + attr] != undefined) return;
+    if (e.attributes[attr] == undefined) return;
+    if (val == undefined) val = e.attributes[attr].value;
+    e.setAttribute("fg:orig_" + attr, val);
+}
+function orig_load(e, attr) {
+    if (e.attributes["fg:orig_"+attr] == undefined) return;
+    e.attributes[attr].value = e.attributes["fg:orig_" + attr].value;
+    e.removeAttribute("fg:orig_" + attr);
+}
+function g_to_text(e) {
+    var text = find_child(e, "title").firstChild.nodeValue;
+    return (text)
+}
+function g_to_func(e) {
+    var func = g_to_text(e);
+    // if there's any manipulation we want to do to the function
+    // name before it's searched, do it here before returning.
+    return (func);
+}
+function get_monospace_width(frames) {
+    // Given the id="frames" element, return the width of text characters if
+    // this is a monospace font, otherwise return 0.
+    text = find_child(frames.children[0], "text");
+    originalContent = text.textContent;
+    text.textContent = "!";
+    bangWidth = text.getComputedTextLength();
+    text.textContent = "W";
+    wWidth = text.getComputedTextLength();
+    text.textContent = originalContent;
+    if (bangWidth === wWidth) {
+        return bangWidth;
+    } else {
+        return 0;
+    }
+}
+function update_text_for_elements(elements) {
+    // In order to render quickly in the browser, you want to do one pass of
+    // reading attributes, and one pass of mutating attributes. See
+    // https://web.dev/avoid-large-complex-layouts-and-layout-thrashing/ for details.
+
+    // Fall back to inefficient calculation, if we're variable-width font.
+    // TODO This should be optimized somehow too.
+    if (known_font_width === 0) {
+        for (var i = 0; i < elements.length; i++) {
+            update_text(elements[i]);
+        }
+        return;
+    }
+
+    var textElemNewAttributes = [];
+    for (var i = 0; i < elements.length; i++) {
+        var e = elements[i];
+        var r = find_child(e, "rect");
+        var t = find_child(e, "text");
+        var w = parseFloat(r.attributes.width.value) * frames.attributes.width.value / 100 - 3;
+        var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,"");
+        var newX = format_percent((parseFloat(r.attributes.x.value) + (100 * 3 / frames.attributes.width.value)));
+
+        // Smaller than this size won't fit anything
+        if (w < 2 * known_font_width) {
+            textElemNewAttributes.push([newX, ""]);
+            continue;
+        }
+
+        // Fit in full text width
+        if (txt.length * known_font_width < w) {
+            textElemNewAttributes.push([newX, txt]);
+            continue;
+        }
+
+        var substringLength = Math.floor(w / known_font_width) - 2;
+        if (truncate_text_right) {
+            // Truncate the right side of the text.
+            textElemNewAttributes.push([newX, txt.substring(0, substringLength) + ".."]);
+            continue;
+        } else {
+            // Truncate the left side of the text.
+            textElemNewAttributes.push([newX, ".." + txt.substring(txt.length - substringLength, txt.length)]);
+            continue;
+        }
+    }
+
+    console.assert(textElemNewAttributes.length === elements.length, "Resize failed, please file a bug at https://github.com/jonhoo/inferno/");
+
+    // Now that we know new textContent, set it all in one go so we don't refresh a bazillion times.
+    for (var i = 0; i < elements.length; i++) {
+        var e = elements[i];
+        var values = textElemNewAttributes[i];
+        var t = find_child(e, "text");
+        t.attributes.x.value = values[0];
+        t.textContent = values[1];
+    }
+}
+
+function update_text(e) {
+    var r = find_child(e, "rect");
+    var t = find_child(e, "text");
+    var w = parseFloat(r.attributes.width.value) * frames.attributes.width.value / 100 - 3;
+    var txt = find_child(e, "title").textContent.replace(/\([^(]*\)$/,"");
+    t.attributes.x.value = format_percent((parseFloat(r.attributes.x.value) + (100 * 3 / frames.attributes.width.value)));
+
+    // Smaller than this size won't fit anything
+    if (w < 2 * fontsize * fontwidth) {
+        t.textContent = "";
+        return;
+    }
+    t.textContent = txt;
+    // Fit in full text width
+    if (t.getComputedTextLength() < w)
+        return;
+    if (truncate_text_right) {
+        // Truncate the right side of the text.
+        for (var x = txt.length - 2; x > 0; x--) {
+            if (t.getSubStringLength(0, x + 2) <= w) {
+                t.textContent = txt.substring(0, x) + "..";
+                return;
+            }
+        }
+    } else {
+        // Truncate the left side of the text.
+        for (var x = 2; x < txt.length; x++) {
+            if (t.getSubStringLength(x - 2, txt.length) <= w) {
+                t.textContent = ".." + txt.substring(x, txt.length);
+                return;
+            }
+        }
+    }
+    t.textContent = "";
+}
+// zoom
+function zoom_reset(e) {
+    if (e.tagName == "rect") {
+        e.attributes.x.value = format_percent(100 * parseInt(e.attributes["fg:x"].value) / total_samples);
+        e.attributes.width.value = format_percent(100 * parseInt(e.attributes["fg:w"].value) / total_samples);
+    }
+    if (e.childNodes == undefined) return;
+    for(var i = 0, c = e.childNodes; i < c.length; i++) {
+        zoom_reset(c[i]);
+    }
+}
+function zoom_child(e, x, zoomed_width_samples) {
+    if (e.tagName == "text") {
+        var parent_x = parseFloat(find_child(e.parentNode, "rect[x]").attributes.x.value);
+        e.attributes.x.value = format_percent(parent_x + (100 * 3 / frames.attributes.width.value));
+    } else if (e.tagName == "rect") {
+        e.attributes.x.value = format_percent(100 * (parseInt(e.attributes["fg:x"].value) - x) / zoomed_width_samples);
+        e.attributes.width.value = format_percent(100 * parseInt(e.attributes["fg:w"].value) / zoomed_width_samples);
+    }
+    if (e.childNodes == undefined) return;
+    for(var i = 0, c = e.childNodes; i < c.length; i++) {
+        zoom_child(c[i], x, zoomed_width_samples);
+    }
+}
+function zoom_parent(e) {
+    if (e.attributes) {
+        if (e.attributes.x != undefined) {
+            e.attributes.x.value = "0.0%";
+        }
+        if (e.attributes.width != undefined) {
+            e.attributes.width.value = "100.0%";
+        }
+    }
+    if (e.childNodes == undefined) return;
+    for(var i = 0, c = e.childNodes; i < c.length; i++) {
+        zoom_parent(c[i]);
+    }
+}
+function zoom(node) {
+    var attr = find_child(node, "rect").attributes;
+    var width = parseInt(attr["fg:w"].value);
+    var xmin = parseInt(attr["fg:x"].value);
+    var xmax = xmin + width;
+    var ymin = parseFloat(attr.y.value);
+    unzoombtn.classList.remove("hide");
+    var el = frames.children;
+    var to_update_text = [];
+    for (var i = 0; i < el.length; i++) {
+        var e = el[i];
+        var a = find_child(e, "rect").attributes;
+        var ex = parseInt(a["fg:x"].value);
+        var ew = parseInt(a["fg:w"].value);
+        // Is it an ancestor
+        if (!inverted) {
+            var upstack = parseFloat(a.y.value) > ymin;
+        } else {
+            var upstack = parseFloat(a.y.value) < ymin;
+        }
+        if (upstack) {
+            // Direct ancestor
+            if (ex <= xmin && (ex+ew) >= xmax) {
+                e.classList.add("parent");
+                zoom_parent(e);
+                to_update_text.push(e);
+            }
+            // not in current path
+            else
+                e.classList.add("hide");
+        }
+        // Children maybe
+        else {
+            // no common path
+            if (ex < xmin || ex >= xmax) {
+                e.classList.add("hide");
+            }
+            else {
+                zoom_child(e, xmin, width);
+                to_update_text.push(e);
+            }
+        }
+    }
+    update_text_for_elements(to_update_text);
+}
+function unzoom() {
+    unzoombtn.classList.add("hide");
+    var el = frames.children;
+    for(var i = 0; i < el.length; i++) {
+        el[i].classList.remove("parent");
+        el[i].classList.remove("hide");
+        zoom_reset(el[i]);
+    }
+    update_text_for_elements(el);
+}
+// search
+function reset_search() {
+    var el = document.querySelectorAll("#frames rect");
+    for (var i = 0; i < el.length; i++) {
+        orig_load(el[i], "fill")
+    }
+    var params = get_params();
+    delete params.s;
+    history.replaceState(null, null, parse_params(params));
+}
+function search_prompt() {
+    if (!searching) {
+        var term = prompt("Enter a search term (regexp " +
+            "allowed, eg: ^ext4_)", "");
+        if (term != null) {
+            search(term)
+        }
+    } else {
+        reset_search();
+        searching = 0;
+        searchbtn.classList.remove("show");
+        searchbtn.firstChild.nodeValue = "Search"
+        matchedtxt.classList.add("hide");
+        matchedtxt.firstChild.nodeValue = ""
+    }
+}
+function search(term) {
+    var re = new RegExp(term);
+    var el = frames.children;
+    var matches = new Object();
+    var maxwidth = 0;
+    for (var i = 0; i < el.length; i++) {
+        var e = el[i];
+        // Skip over frames which are either not visible, or below the zoomed-to frame
+        if (e.classList.contains("hide") || e.classList.contains("parent")) {
+            continue;
+        }
+        var func = g_to_func(e);
+        var rect = find_child(e, "rect");
+        if (func == null || rect == null)
+            continue;
+        // Save max width. Only works as we have a root frame
+        var w = parseInt(rect.attributes["fg:w"].value);
+        if (w > maxwidth)
+            maxwidth = w;
+        if (func.match(re)) {
+            // highlight
+            var x = parseInt(rect.attributes["fg:x"].value);
+            orig_save(rect, "fill");
+            rect.attributes.fill.value = searchcolor;
+            // remember matches
+            if (matches[x] == undefined) {
+                matches[x] = w;
+            } else {
+                if (w > matches[x]) {
+                    // overwrite with parent
+                    matches[x] = w;
+                }
+            }
+            searching = 1;
+        }
+    }
+    if (!searching)
+        return;
+    var params = get_params();
+    params.s = term;
+    history.replaceState(null, null, parse_params(params));
+
+    searchbtn.classList.add("show");
+    searchbtn.firstChild.nodeValue = "Reset Search";
+    // calculate percent matched, excluding vertical overlap
+    var count = 0;
+    var lastx = -1;
+    var lastw = 0;
+    var keys = Array();
+    for (k in matches) {
+        if (matches.hasOwnProperty(k))
+            keys.push(k);
+    }
+    // sort the matched frames by their x location
+    // ascending, then width descending
+    keys.sort(function(a, b){
+        return a - b;
+    });
+    // Step through frames saving only the biggest bottom-up frames
+    // thanks to the sort order. This relies on the tree property
+    // where children are always smaller than their parents.
+    for (var k in keys) {
+        var x = parseInt(keys[k]);
+        var w = matches[keys[k]];
+        if (x >= lastx + lastw) {
+            count += w;
+            lastx = x;
+            lastw = w;
+        }
+    }
+    // display matched percent
+    matchedtxt.classList.remove("hide");
+    var pct = 100 * count / maxwidth;
+    if (pct != 100) pct = pct.toFixed(1);
+    matchedtxt.firstChild.nodeValue = "Matched: " + pct + "%";
+}
+function format_percent(n) {
+    return n.toFixed(4) + "%";
+}
+]]></script><rect x="0" y="0" width="100%" height="1686" fill="url(#background)"/><text id="title" fill="rgb(0,0,0)" x="50.0000%" y="24.00">Flame Graph</text><text id="details" fill="rgb(0,0,0)" x="10" y="1669.00"> </text><text id="unzoom" class="hide" fill="rgb(0,0,0)" x="10" y="24.00">Reset Zoom</text><text id="search" fill="rgb(0,0,0)" x="1190" y="24.00">Search</text><text id="matched" fill="rgb(0,0,0)" x="1190" y="1669.00"> </text><svg id="frames" x="10" width="1180" total_samples="47617"><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;plotters_svg::svg::SVGBackend&gt; (5 samples, 0.01%)</title><rect x="0.0105%" y="1445" width="0.0105%" height="15" fill="rgb(227,0,7)" fg:x="5" fg:w="5"/><text x="0.2605%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;plotters_svg::svg::SVGBackend as core::ops::drop::Drop&gt;::drop (5 samples, 0.01%)</title><rect x="0.0105%" y="1429" width="0.0105%" height="15" fill="rgb(217,0,24)" fg:x="5" fg:w="5"/><text x="0.2605%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::kde::sweep_and_estimate (13 samples, 0.03%)</title><rect x="0.0210%" y="1445" width="0.0273%" height="15" fill="rgb(221,193,54)" fg:x="10" fg:w="13"/><text x="0.2710%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;criterion::plot::plotters_backend::PlottersBackend as criterion::plot::Plotter&gt;::abs_distributions (26 samples, 0.05%)</title><rect x="0.0063%" y="1477" width="0.0546%" height="15" fill="rgb(248,212,6)" fg:x="3" fg:w="26"/><text x="0.2563%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::plot::plotters_backend::distributions::abs_distributions (25 samples, 0.05%)</title><rect x="0.0084%" y="1461" width="0.0525%" height="15" fill="rgb(208,68,35)" fg:x="4" fg:w="25"/><text x="0.2584%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;criterion::plot::plotters_backend::PlottersBackend as criterion::plot::Plotter&gt;::pdf (5 samples, 0.01%)</title><rect x="0.0609%" y="1477" width="0.0105%" height="15" fill="rgb(232,128,0)" fg:x="29" fg:w="5"/><text x="0.3109%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;criterion::html::Html as criterion::report::Report&gt;::measurement_complete (38 samples, 0.08%)</title><rect x="0.0063%" y="1493" width="0.0798%" height="15" fill="rgb(207,160,47)" fg:x="3" fg:w="38"/><text x="0.2563%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::estimate::build_estimates (6 samples, 0.01%)</title><rect x="0.0987%" y="1477" width="0.0126%" height="15" fill="rgb(228,23,34)" fg:x="47" fg:w="6"/><text x="0.3487%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates (7 samples, 0.01%)</title><rect x="0.0987%" y="1493" width="0.0147%" height="15" fill="rgb(218,30,26)" fg:x="47" fg:w="7"/><text x="0.3487%" y="1503.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="0.1176%" y="1461" width="0.0126%" height="15" fill="rgb(220,122,19)" fg:x="56" fg:w="6"/><text x="0.3676%" y="1471.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="0.1302%" y="1461" width="0.0126%" height="15" fill="rgb(250,228,42)" fg:x="62" fg:w="6"/><text x="0.3802%" y="1471.50"></text></g><g><title>libsystem_malloc.dylib`_free (38 samples, 0.08%)</title><rect x="0.1701%" y="1445" width="0.0798%" height="15" fill="rgb(240,193,28)" fg:x="81" fg:w="38"/><text x="0.4201%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="0.2499%" y="1445" width="0.0105%" height="15" fill="rgb(216,20,37)" fg:x="119" fg:w="5"/><text x="0.4999%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (32 samples, 0.07%)</title><rect x="0.2604%" y="1445" width="0.0672%" height="15" fill="rgb(206,188,39)" fg:x="124" fg:w="32"/><text x="0.5104%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (13 samples, 0.03%)</title><rect x="0.3276%" y="1445" width="0.0273%" height="15" fill="rgb(217,207,13)" fg:x="156" fg:w="13"/><text x="0.5776%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (12 samples, 0.03%)</title><rect x="0.4032%" y="1429" width="0.0252%" height="15" fill="rgb(231,73,38)" fg:x="192" fg:w="12"/><text x="0.6532%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr (5 samples, 0.01%)</title><rect x="0.4368%" y="1429" width="0.0105%" height="15" fill="rgb(225,20,46)" fg:x="208" fg:w="5"/><text x="0.6868%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`free_small (55 samples, 0.12%)</title><rect x="0.3549%" y="1445" width="0.1155%" height="15" fill="rgb(210,31,41)" fg:x="169" fg:w="55"/><text x="0.6049%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (11 samples, 0.02%)</title><rect x="0.4473%" y="1429" width="0.0231%" height="15" fill="rgb(221,200,47)" fg:x="213" fg:w="11"/><text x="0.6973%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (17 samples, 0.04%)</title><rect x="0.4956%" y="1333" width="0.0357%" height="15" fill="rgb(226,26,5)" fg:x="236" fg:w="17"/><text x="0.7456%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderByExpr as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="0.5313%" y="1333" width="0.0168%" height="15" fill="rgb(249,33,26)" fg:x="253" fg:w="8"/><text x="0.7813%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="0.5481%" y="1333" width="0.0168%" height="15" fill="rgb(235,183,28)" fg:x="261" fg:w="8"/><text x="0.7981%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (10 samples, 0.02%)</title><rect x="0.5649%" y="1333" width="0.0210%" height="15" fill="rgb(221,5,38)" fg:x="269" fg:w="10"/><text x="0.8149%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (25 samples, 0.05%)</title><rect x="0.7014%" y="1317" width="0.0525%" height="15" fill="rgb(247,18,42)" fg:x="334" fg:w="25"/><text x="0.9514%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (21 samples, 0.04%)</title><rect x="0.7539%" y="1317" width="0.0441%" height="15" fill="rgb(241,131,45)" fg:x="359" fg:w="21"/><text x="1.0039%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (56 samples, 0.12%)</title><rect x="0.8568%" y="1301" width="0.1176%" height="15" fill="rgb(249,31,29)" fg:x="408" fg:w="56"/><text x="1.1068%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (16 samples, 0.03%)</title><rect x="0.9744%" y="1301" width="0.0336%" height="15" fill="rgb(225,111,53)" fg:x="464" fg:w="16"/><text x="1.2244%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (10 samples, 0.02%)</title><rect x="1.0080%" y="1301" width="0.0210%" height="15" fill="rgb(238,160,17)" fg:x="480" fg:w="10"/><text x="1.2580%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (10 samples, 0.02%)</title><rect x="1.0290%" y="1301" width="0.0210%" height="15" fill="rgb(214,148,48)" fg:x="490" fg:w="10"/><text x="1.2790%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="1.0500%" y="1301" width="0.0126%" height="15" fill="rgb(232,36,49)" fg:x="500" fg:w="6"/><text x="1.3000%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="1.1571%" y="1269" width="0.0147%" height="15" fill="rgb(209,103,24)" fg:x="551" fg:w="7"/><text x="1.4071%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="1.1719%" y="1269" width="0.0105%" height="15" fill="rgb(229,88,8)" fg:x="558" fg:w="5"/><text x="1.4219%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (11 samples, 0.02%)</title><rect x="1.1824%" y="1269" width="0.0231%" height="15" fill="rgb(213,181,19)" fg:x="563" fg:w="11"/><text x="1.4324%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (53 samples, 0.11%)</title><rect x="1.2916%" y="1253" width="0.1113%" height="15" fill="rgb(254,191,54)" fg:x="615" fg:w="53"/><text x="1.5416%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="1.4029%" y="1253" width="0.0273%" height="15" fill="rgb(241,83,37)" fg:x="668" fg:w="13"/><text x="1.6529%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (17 samples, 0.04%)</title><rect x="1.4302%" y="1253" width="0.0357%" height="15" fill="rgb(233,36,39)" fg:x="681" fg:w="17"/><text x="1.6802%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (164 samples, 0.34%)</title><rect x="1.1298%" y="1285" width="0.3444%" height="15" fill="rgb(226,3,54)" fg:x="538" fg:w="164"/><text x="1.3798%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (128 samples, 0.27%)</title><rect x="1.2055%" y="1269" width="0.2688%" height="15" fill="rgb(245,192,40)" fg:x="574" fg:w="128"/><text x="1.4555%" y="1279.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (15 samples, 0.03%)</title><rect x="1.4743%" y="1269" width="0.0315%" height="15" fill="rgb(238,167,29)" fg:x="702" fg:w="15"/><text x="1.7243%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (8 samples, 0.02%)</title><rect x="1.5058%" y="1269" width="0.0168%" height="15" fill="rgb(232,182,51)" fg:x="717" fg:w="8"/><text x="1.7558%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (18 samples, 0.04%)</title><rect x="1.5226%" y="1269" width="0.0378%" height="15" fill="rgb(231,60,39)" fg:x="725" fg:w="18"/><text x="1.7726%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (58 samples, 0.12%)</title><rect x="1.4743%" y="1285" width="0.1218%" height="15" fill="rgb(208,69,12)" fg:x="702" fg:w="58"/><text x="1.7243%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (17 samples, 0.04%)</title><rect x="1.5604%" y="1269" width="0.0357%" height="15" fill="rgb(235,93,37)" fg:x="743" fg:w="17"/><text x="1.8104%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_fmt (5 samples, 0.01%)</title><rect x="1.5961%" y="1285" width="0.0105%" height="15" fill="rgb(213,116,39)" fg:x="760" fg:w="5"/><text x="1.8461%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (19 samples, 0.04%)</title><rect x="1.6066%" y="1285" width="0.0399%" height="15" fill="rgb(222,207,29)" fg:x="765" fg:w="19"/><text x="1.8566%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (14 samples, 0.03%)</title><rect x="1.6465%" y="1285" width="0.0294%" height="15" fill="rgb(206,96,30)" fg:x="784" fg:w="14"/><text x="1.8965%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (7 samples, 0.01%)</title><rect x="1.6759%" y="1285" width="0.0147%" height="15" fill="rgb(218,138,4)" fg:x="798" fg:w="7"/><text x="1.9259%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderByExpr as core::fmt::Display&gt;::fmt (435 samples, 0.91%)</title><rect x="0.7980%" y="1317" width="0.9135%" height="15" fill="rgb(250,191,14)" fg:x="380" fg:w="435"/><text x="1.0480%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (309 samples, 0.65%)</title><rect x="1.0626%" y="1301" width="0.6489%" height="15" fill="rgb(239,60,40)" fg:x="506" fg:w="309"/><text x="1.3126%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (10 samples, 0.02%)</title><rect x="1.6906%" y="1285" width="0.0210%" height="15" fill="rgb(206,27,48)" fg:x="805" fg:w="10"/><text x="1.9406%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="1.7116%" y="1317" width="0.0147%" height="15" fill="rgb(225,35,8)" fg:x="815" fg:w="7"/><text x="1.9616%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (14 samples, 0.03%)</title><rect x="1.7263%" y="1317" width="0.0294%" height="15" fill="rgb(250,213,24)" fg:x="822" fg:w="14"/><text x="1.9763%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (629 samples, 1.32%)</title><rect x="0.4788%" y="1349" width="1.3210%" height="15" fill="rgb(247,123,22)" fg:x="228" fg:w="629"/><text x="0.7288%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (578 samples, 1.21%)</title><rect x="0.5859%" y="1333" width="1.2139%" height="15" fill="rgb(231,138,38)" fg:x="279" fg:w="578"/><text x="0.8359%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="1.7557%" y="1317" width="0.0441%" height="15" fill="rgb(231,145,46)" fg:x="836" fg:w="21"/><text x="2.0057%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderBy as core::fmt::Display&gt;::fmt (661 samples, 1.39%)</title><rect x="0.4788%" y="1381" width="1.3882%" height="15" fill="rgb(251,118,11)" fg:x="228" fg:w="661"/><text x="0.7288%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (661 samples, 1.39%)</title><rect x="0.4788%" y="1365" width="1.3882%" height="15" fill="rgb(217,147,25)" fg:x="228" fg:w="661"/><text x="0.7288%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (32 samples, 0.07%)</title><rect x="1.7998%" y="1349" width="0.0672%" height="15" fill="rgb(247,81,37)" fg:x="857" fg:w="32"/><text x="2.0498%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (20 samples, 0.04%)</title><rect x="1.8964%" y="1301" width="0.0420%" height="15" fill="rgb(209,12,38)" fg:x="903" fg:w="20"/><text x="2.1464%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (6 samples, 0.01%)</title><rect x="1.9384%" y="1301" width="0.0126%" height="15" fill="rgb(227,1,9)" fg:x="923" fg:w="6"/><text x="2.1884%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::SelectItem as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="1.9510%" y="1301" width="0.0189%" height="15" fill="rgb(248,47,43)" fg:x="929" fg:w="9"/><text x="2.2010%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="1.9699%" y="1301" width="0.0105%" height="15" fill="rgb(221,10,30)" fg:x="938" fg:w="5"/><text x="2.2199%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (14 samples, 0.03%)</title><rect x="1.9804%" y="1301" width="0.0294%" height="15" fill="rgb(210,229,1)" fg:x="943" fg:w="14"/><text x="2.2304%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (20 samples, 0.04%)</title><rect x="2.1148%" y="1285" width="0.0420%" height="15" fill="rgb(222,148,37)" fg:x="1007" fg:w="20"/><text x="2.3648%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="2.1736%" y="1269" width="0.0189%" height="15" fill="rgb(234,67,33)" fg:x="1035" fg:w="9"/><text x="2.4236%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt (12 samples, 0.03%)</title><rect x="2.1925%" y="1269" width="0.0252%" height="15" fill="rgb(247,98,35)" fg:x="1044" fg:w="12"/><text x="2.4425%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="2.3101%" y="1237" width="0.0105%" height="15" fill="rgb(247,138,52)" fg:x="1100" fg:w="5"/><text x="2.5601%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt::suffix::Suffix as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="2.3206%" y="1237" width="0.0168%" height="15" fill="rgb(213,79,30)" fg:x="1105" fg:w="8"/><text x="2.5706%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (39 samples, 0.08%)</title><rect x="2.3374%" y="1237" width="0.0819%" height="15" fill="rgb(246,177,23)" fg:x="1113" fg:w="39"/><text x="2.5874%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::TableFactor as core::fmt::Display&gt;::fmt (20 samples, 0.04%)</title><rect x="2.4193%" y="1237" width="0.0420%" height="15" fill="rgb(230,62,27)" fg:x="1152" fg:w="20"/><text x="2.6693%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="2.4613%" y="1237" width="0.0105%" height="15" fill="rgb(216,154,8)" fg:x="1172" fg:w="5"/><text x="2.7113%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (7 samples, 0.01%)</title><rect x="2.4718%" y="1237" width="0.0147%" height="15" fill="rgb(244,35,45)" fg:x="1177" fg:w="7"/><text x="2.7218%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (77 samples, 0.16%)</title><rect x="2.6839%" y="1221" width="0.1617%" height="15" fill="rgb(251,115,12)" fg:x="1278" fg:w="77"/><text x="2.9339%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt::suffix::Suffix as core::fmt::Display&gt;::fmt (26 samples, 0.05%)</title><rect x="2.8456%" y="1221" width="0.0546%" height="15" fill="rgb(240,54,50)" fg:x="1355" fg:w="26"/><text x="3.0956%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (32 samples, 0.07%)</title><rect x="2.9002%" y="1221" width="0.0672%" height="15" fill="rgb(233,84,52)" fg:x="1381" fg:w="32"/><text x="3.1502%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (10 samples, 0.02%)</title><rect x="3.0976%" y="1205" width="0.0210%" height="15" fill="rgb(207,117,47)" fg:x="1475" fg:w="10"/><text x="3.3476%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (14 samples, 0.03%)</title><rect x="3.2215%" y="1173" width="0.0294%" height="15" fill="rgb(249,43,39)" fg:x="1534" fg:w="14"/><text x="3.4715%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (6 samples, 0.01%)</title><rect x="3.3685%" y="1141" width="0.0126%" height="15" fill="rgb(209,38,44)" fg:x="1604" fg:w="6"/><text x="3.6185%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (14 samples, 0.03%)</title><rect x="3.3811%" y="1141" width="0.0294%" height="15" fill="rgb(236,212,23)" fg:x="1610" fg:w="14"/><text x="3.6311%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="3.4189%" y="1141" width="0.0105%" height="15" fill="rgb(242,79,21)" fg:x="1628" fg:w="5"/><text x="3.6689%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (23 samples, 0.05%)</title><rect x="3.4294%" y="1141" width="0.0483%" height="15" fill="rgb(211,96,35)" fg:x="1633" fg:w="23"/><text x="3.6794%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (39 samples, 0.08%)</title><rect x="3.6332%" y="1125" width="0.0819%" height="15" fill="rgb(253,215,40)" fg:x="1730" fg:w="39"/><text x="3.8832%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (22 samples, 0.05%)</title><rect x="3.7151%" y="1125" width="0.0462%" height="15" fill="rgb(211,81,21)" fg:x="1769" fg:w="22"/><text x="3.9651%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (27 samples, 0.06%)</title><rect x="3.7613%" y="1125" width="0.0567%" height="15" fill="rgb(208,190,38)" fg:x="1791" fg:w="27"/><text x="4.0113%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (6 samples, 0.01%)</title><rect x="3.8180%" y="1125" width="0.0126%" height="15" fill="rgb(235,213,38)" fg:x="1818" fg:w="6"/><text x="4.0680%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (5 samples, 0.01%)</title><rect x="3.8306%" y="1125" width="0.0105%" height="15" fill="rgb(237,122,38)" fg:x="1824" fg:w="5"/><text x="4.0806%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (16 samples, 0.03%)</title><rect x="3.8411%" y="1125" width="0.0336%" height="15" fill="rgb(244,218,35)" fg:x="1829" fg:w="16"/><text x="4.0911%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (267 samples, 0.56%)</title><rect x="3.3202%" y="1157" width="0.5607%" height="15" fill="rgb(240,68,47)" fg:x="1581" fg:w="267"/><text x="3.5702%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (192 samples, 0.40%)</title><rect x="3.4777%" y="1141" width="0.4032%" height="15" fill="rgb(210,16,53)" fg:x="1656" fg:w="192"/><text x="3.7277%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (347 samples, 0.73%)</title><rect x="3.1963%" y="1189" width="0.7287%" height="15" fill="rgb(235,124,12)" fg:x="1522" fg:w="347"/><text x="3.4463%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (321 samples, 0.67%)</title><rect x="3.2509%" y="1173" width="0.6741%" height="15" fill="rgb(224,169,11)" fg:x="1548" fg:w="321"/><text x="3.5009%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="3.8810%" y="1157" width="0.0441%" height="15" fill="rgb(250,166,2)" fg:x="1848" fg:w="21"/><text x="4.1310%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::TableFactor as core::fmt::Display&gt;::fmt (473 samples, 0.99%)</title><rect x="2.9674%" y="1221" width="0.9933%" height="15" fill="rgb(242,216,29)" fg:x="1413" fg:w="473"/><text x="3.2174%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (401 samples, 0.84%)</title><rect x="3.1186%" y="1205" width="0.8421%" height="15" fill="rgb(230,116,27)" fg:x="1485" fg:w="401"/><text x="3.3686%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (17 samples, 0.04%)</title><rect x="3.9251%" y="1189" width="0.0357%" height="15" fill="rgb(228,99,48)" fg:x="1869" fg:w="17"/><text x="4.1751%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (6 samples, 0.01%)</title><rect x="3.9608%" y="1221" width="0.0126%" height="15" fill="rgb(253,11,6)" fg:x="1886" fg:w="6"/><text x="4.2108%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (8 samples, 0.02%)</title><rect x="3.9734%" y="1221" width="0.0168%" height="15" fill="rgb(247,143,39)" fg:x="1892" fg:w="8"/><text x="4.2234%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (20 samples, 0.04%)</title><rect x="3.9902%" y="1221" width="0.0420%" height="15" fill="rgb(236,97,10)" fg:x="1900" fg:w="20"/><text x="4.2402%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt (859 samples, 1.80%)</title><rect x="2.2639%" y="1253" width="1.8040%" height="15" fill="rgb(233,208,19)" fg:x="1078" fg:w="859"/><text x="2.5139%" y="1263.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (753 samples, 1.58%)</title><rect x="2.4865%" y="1237" width="1.5814%" height="15" fill="rgb(216,164,2)" fg:x="1184" fg:w="753"/><text x="2.7365%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (17 samples, 0.04%)</title><rect x="4.0322%" y="1221" width="0.0357%" height="15" fill="rgb(220,129,5)" fg:x="1920" fg:w="17"/><text x="4.2822%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (931 samples, 1.96%)</title><rect x="2.1568%" y="1285" width="1.9552%" height="15" fill="rgb(242,17,10)" fg:x="1027" fg:w="931"/><text x="2.4068%" y="1295.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (902 samples, 1.89%)</title><rect x="2.2177%" y="1269" width="1.8943%" height="15" fill="rgb(242,107,0)" fg:x="1056" fg:w="902"/><text x="2.4677%" y="1279.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="4.0679%" y="1253" width="0.0441%" height="15" fill="rgb(251,28,31)" fg:x="1937" fg:w="21"/><text x="4.3179%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (15 samples, 0.03%)</title><rect x="4.1120%" y="1285" width="0.0315%" height="15" fill="rgb(233,223,10)" fg:x="1958" fg:w="15"/><text x="4.3620%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (14 samples, 0.03%)</title><rect x="4.1792%" y="1269" width="0.0294%" height="15" fill="rgb(215,21,27)" fg:x="1990" fg:w="14"/><text x="4.4292%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (11 samples, 0.02%)</title><rect x="4.2086%" y="1269" width="0.0231%" height="15" fill="rgb(232,23,21)" fg:x="2004" fg:w="11"/><text x="4.4586%" y="1279.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (14 samples, 0.03%)</title><rect x="4.2968%" y="1237" width="0.0294%" height="15" fill="rgb(244,5,23)" fg:x="2046" fg:w="14"/><text x="4.5468%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (6 samples, 0.01%)</title><rect x="4.3262%" y="1237" width="0.0126%" height="15" fill="rgb(226,81,46)" fg:x="2060" fg:w="6"/><text x="4.5762%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (12 samples, 0.03%)</title><rect x="4.3388%" y="1237" width="0.0252%" height="15" fill="rgb(247,70,30)" fg:x="2066" fg:w="12"/><text x="4.5888%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (53 samples, 0.11%)</title><rect x="4.2884%" y="1253" width="0.1113%" height="15" fill="rgb(212,68,19)" fg:x="2042" fg:w="53"/><text x="4.5384%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (17 samples, 0.04%)</title><rect x="4.3640%" y="1237" width="0.0357%" height="15" fill="rgb(240,187,13)" fg:x="2078" fg:w="17"/><text x="4.6140%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (14 samples, 0.03%)</title><rect x="4.4249%" y="1237" width="0.0294%" height="15" fill="rgb(223,113,26)" fg:x="2107" fg:w="14"/><text x="4.6749%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Function as core::fmt::Display&gt;::fmt (24 samples, 0.05%)</title><rect x="4.4543%" y="1237" width="0.0504%" height="15" fill="rgb(206,192,2)" fg:x="2121" fg:w="24"/><text x="4.7043%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArguments as core::fmt::Display&gt;::fmt (41 samples, 0.09%)</title><rect x="4.6349%" y="1205" width="0.0861%" height="15" fill="rgb(241,108,4)" fg:x="2207" fg:w="41"/><text x="4.8849%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::ObjectName as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="4.7210%" y="1205" width="0.0168%" height="15" fill="rgb(247,173,49)" fg:x="2248" fg:w="8"/><text x="4.9710%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (28 samples, 0.06%)</title><rect x="4.8953%" y="1173" width="0.0588%" height="15" fill="rgb(224,114,35)" fg:x="2331" fg:w="28"/><text x="5.1453%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgumentList as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="4.9541%" y="1173" width="0.0168%" height="15" fill="rgb(245,159,27)" fg:x="2359" fg:w="8"/><text x="5.2041%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (35 samples, 0.07%)</title><rect x="5.1263%" y="1157" width="0.0735%" height="15" fill="rgb(245,172,44)" fg:x="2441" fg:w="35"/><text x="5.3763%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (26 samples, 0.05%)</title><rect x="5.1998%" y="1157" width="0.0546%" height="15" fill="rgb(236,23,11)" fg:x="2476" fg:w="26"/><text x="5.4498%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (18 samples, 0.04%)</title><rect x="5.2859%" y="1141" width="0.0378%" height="15" fill="rgb(205,117,38)" fg:x="2517" fg:w="18"/><text x="5.5359%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (13 samples, 0.03%)</title><rect x="5.4455%" y="1109" width="0.0273%" height="15" fill="rgb(237,72,25)" fg:x="2593" fg:w="13"/><text x="5.6955%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (7 samples, 0.01%)</title><rect x="5.4728%" y="1109" width="0.0147%" height="15" fill="rgb(244,70,9)" fg:x="2606" fg:w="7"/><text x="5.7228%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="5.4917%" y="1109" width="0.0168%" height="15" fill="rgb(217,125,39)" fg:x="2615" fg:w="8"/><text x="5.7417%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (9 samples, 0.02%)</title><rect x="5.5085%" y="1109" width="0.0189%" height="15" fill="rgb(235,36,10)" fg:x="2623" fg:w="9"/><text x="5.7585%" y="1119.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="5.6450%" y="1093" width="0.0315%" height="15" fill="rgb(251,123,47)" fg:x="2688" fg:w="15"/><text x="5.8950%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (12 samples, 0.03%)</title><rect x="5.6765%" y="1093" width="0.0252%" height="15" fill="rgb(221,13,13)" fg:x="2703" fg:w="12"/><text x="5.9265%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="5.7269%" y="1077" width="0.0189%" height="15" fill="rgb(238,131,9)" fg:x="2727" fg:w="9"/><text x="5.9769%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgExpr as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="5.7458%" y="1077" width="0.0147%" height="15" fill="rgb(211,50,8)" fg:x="2736" fg:w="7"/><text x="5.9958%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="5.8866%" y="1045" width="0.0168%" height="15" fill="rgb(245,182,24)" fg:x="2803" fg:w="8"/><text x="6.1366%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (10 samples, 0.02%)</title><rect x="5.9034%" y="1045" width="0.0210%" height="15" fill="rgb(242,14,37)" fg:x="2811" fg:w="10"/><text x="6.1534%" y="1055.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (13 samples, 0.03%)</title><rect x="6.0441%" y="1013" width="0.0273%" height="15" fill="rgb(246,228,12)" fg:x="2878" fg:w="13"/><text x="6.2941%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (9 samples, 0.02%)</title><rect x="6.0714%" y="1013" width="0.0189%" height="15" fill="rgb(213,55,15)" fg:x="2891" fg:w="9"/><text x="6.3214%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (19 samples, 0.04%)</title><rect x="6.0903%" y="1013" width="0.0399%" height="15" fill="rgb(209,9,3)" fg:x="2900" fg:w="19"/><text x="6.3403%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (63 samples, 0.13%)</title><rect x="6.0357%" y="1029" width="0.1323%" height="15" fill="rgb(230,59,30)" fg:x="2874" fg:w="63"/><text x="6.2857%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (18 samples, 0.04%)</title><rect x="6.1302%" y="1013" width="0.0378%" height="15" fill="rgb(209,121,21)" fg:x="2919" fg:w="18"/><text x="6.3802%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="6.2268%" y="1013" width="0.0168%" height="15" fill="rgb(220,109,13)" fg:x="2965" fg:w="8"/><text x="6.4768%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="6.2436%" y="1013" width="0.0147%" height="15" fill="rgb(232,18,1)" fg:x="2973" fg:w="7"/><text x="6.4936%" y="1023.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (65 samples, 0.14%)</title><rect x="6.3822%" y="997" width="0.1365%" height="15" fill="rgb(215,41,42)" fg:x="3039" fg:w="65"/><text x="6.6322%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (16 samples, 0.03%)</title><rect x="6.5187%" y="997" width="0.0336%" height="15" fill="rgb(224,123,36)" fg:x="3104" fg:w="16"/><text x="6.7687%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (34 samples, 0.07%)</title><rect x="6.5523%" y="997" width="0.0714%" height="15" fill="rgb(240,125,3)" fg:x="3120" fg:w="34"/><text x="6.8023%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (231 samples, 0.49%)</title><rect x="6.1680%" y="1029" width="0.4851%" height="15" fill="rgb(205,98,50)" fg:x="2937" fg:w="231"/><text x="6.4180%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (188 samples, 0.39%)</title><rect x="6.2583%" y="1013" width="0.3948%" height="15" fill="rgb(205,185,37)" fg:x="2980" fg:w="188"/><text x="6.5083%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (11 samples, 0.02%)</title><rect x="6.6300%" y="997" width="0.0231%" height="15" fill="rgb(238,207,15)" fg:x="3157" fg:w="11"/><text x="6.8800%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_fmt (7 samples, 0.01%)</title><rect x="6.6531%" y="1029" width="0.0147%" height="15" fill="rgb(213,199,42)" fg:x="3168" fg:w="7"/><text x="6.9031%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (15 samples, 0.03%)</title><rect x="6.6678%" y="1029" width="0.0315%" height="15" fill="rgb(235,201,11)" fg:x="3175" fg:w="15"/><text x="6.9178%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (19 samples, 0.04%)</title><rect x="6.6993%" y="1029" width="0.0399%" height="15" fill="rgb(207,46,11)" fg:x="3190" fg:w="19"/><text x="6.9493%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (10 samples, 0.02%)</title><rect x="6.7392%" y="1029" width="0.0210%" height="15" fill="rgb(241,35,35)" fg:x="3209" fg:w="10"/><text x="6.9892%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgExpr as core::fmt::Display&gt;::fmt (450 samples, 0.95%)</title><rect x="5.8362%" y="1061" width="0.9450%" height="15" fill="rgb(243,32,47)" fg:x="2779" fg:w="450"/><text x="6.0862%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (408 samples, 0.86%)</title><rect x="5.9244%" y="1045" width="0.8568%" height="15" fill="rgb(247,202,23)" fg:x="2821" fg:w="408"/><text x="6.1744%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (10 samples, 0.02%)</title><rect x="6.7602%" y="1029" width="0.0210%" height="15" fill="rgb(219,102,11)" fg:x="3219" fg:w="10"/><text x="7.0102%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArg as core::fmt::Display&gt;::fmt (528 samples, 1.11%)</title><rect x="5.7017%" y="1093" width="1.1088%" height="15" fill="rgb(243,110,44)" fg:x="2715" fg:w="528"/><text x="5.9517%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (500 samples, 1.05%)</title><rect x="5.7605%" y="1077" width="1.0500%" height="15" fill="rgb(222,74,54)" fg:x="2743" fg:w="500"/><text x="6.0105%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (14 samples, 0.03%)</title><rect x="6.7812%" y="1061" width="0.0294%" height="15" fill="rgb(216,99,12)" fg:x="3229" fg:w="14"/><text x="7.0312%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="6.8106%" y="1093" width="0.0105%" height="15" fill="rgb(226,22,26)" fg:x="3243" fg:w="5"/><text x="7.0606%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (8 samples, 0.02%)</title><rect x="6.8232%" y="1093" width="0.0168%" height="15" fill="rgb(217,163,10)" fg:x="3249" fg:w="8"/><text x="7.0732%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (711 samples, 1.49%)</title><rect x="5.3888%" y="1125" width="1.4932%" height="15" fill="rgb(213,25,53)" fg:x="2566" fg:w="711"/><text x="5.6388%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (645 samples, 1.35%)</title><rect x="5.5274%" y="1109" width="1.3546%" height="15" fill="rgb(252,105,26)" fg:x="2632" fg:w="645"/><text x="5.7774%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (20 samples, 0.04%)</title><rect x="6.8400%" y="1093" width="0.0420%" height="15" fill="rgb(220,39,43)" fg:x="3257" fg:w="20"/><text x="7.0900%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgumentList as core::fmt::Display&gt;::fmt (805 samples, 1.69%)</title><rect x="5.2544%" y="1157" width="1.6906%" height="15" fill="rgb(229,68,48)" fg:x="2502" fg:w="805"/><text x="5.5044%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (772 samples, 1.62%)</title><rect x="5.3237%" y="1141" width="1.6213%" height="15" fill="rgb(252,8,32)" fg:x="2535" fg:w="772"/><text x="5.5737%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (30 samples, 0.06%)</title><rect x="6.8820%" y="1125" width="0.0630%" height="15" fill="rgb(223,20,43)" fg:x="3277" fg:w="30"/><text x="7.1320%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (9 samples, 0.02%)</title><rect x="6.9450%" y="1157" width="0.0189%" height="15" fill="rgb(229,81,49)" fg:x="3307" fg:w="9"/><text x="7.1950%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArguments as core::fmt::Display&gt;::fmt (1,024 samples, 2.15%)</title><rect x="4.8617%" y="1189" width="2.1505%" height="15" fill="rgb(236,28,36)" fg:x="2315" fg:w="1024"/><text x="5.1117%" y="1199.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (972 samples, 2.04%)</title><rect x="4.9709%" y="1173" width="2.0413%" height="15" fill="rgb(249,185,26)" fg:x="2367" fg:w="972"/><text x="5.2209%" y="1183.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (23 samples, 0.05%)</title><rect x="6.9639%" y="1157" width="0.0483%" height="15" fill="rgb(249,174,33)" fg:x="3316" fg:w="23"/><text x="7.2139%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (19 samples, 0.04%)</title><rect x="7.0458%" y="1173" width="0.0399%" height="15" fill="rgb(233,201,37)" fg:x="3355" fg:w="19"/><text x="7.2958%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (13 samples, 0.03%)</title><rect x="7.2201%" y="1141" width="0.0273%" height="15" fill="rgb(221,78,26)" fg:x="3438" fg:w="13"/><text x="7.4701%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (37 samples, 0.08%)</title><rect x="7.2474%" y="1141" width="0.0777%" height="15" fill="rgb(250,127,30)" fg:x="3451" fg:w="37"/><text x="7.4974%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="7.3251%" y="1141" width="0.0168%" height="15" fill="rgb(230,49,44)" fg:x="3488" fg:w="8"/><text x="7.5751%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="7.3419%" y="1141" width="0.0105%" height="15" fill="rgb(229,67,23)" fg:x="3496" fg:w="5"/><text x="7.5919%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (18 samples, 0.04%)</title><rect x="7.3524%" y="1141" width="0.0378%" height="15" fill="rgb(249,83,47)" fg:x="3501" fg:w="18"/><text x="7.6024%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (50 samples, 0.11%)</title><rect x="7.5330%" y="1125" width="0.1050%" height="15" fill="rgb(215,43,3)" fg:x="3587" fg:w="50"/><text x="7.7830%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`szone_realloc (5 samples, 0.01%)</title><rect x="7.6821%" y="1045" width="0.0105%" height="15" fill="rgb(238,154,13)" fg:x="3658" fg:w="5"/><text x="7.9321%" y="1055.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (6 samples, 0.01%)</title><rect x="7.6821%" y="1061" width="0.0126%" height="15" fill="rgb(219,56,2)" fg:x="3658" fg:w="6"/><text x="7.9321%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (29 samples, 0.06%)</title><rect x="7.6380%" y="1125" width="0.0609%" height="15" fill="rgb(233,0,4)" fg:x="3637" fg:w="29"/><text x="7.8880%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (9 samples, 0.02%)</title><rect x="7.6800%" y="1109" width="0.0189%" height="15" fill="rgb(235,30,7)" fg:x="3657" fg:w="9"/><text x="7.9300%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (8 samples, 0.02%)</title><rect x="7.6821%" y="1093" width="0.0168%" height="15" fill="rgb(250,79,13)" fg:x="3658" fg:w="8"/><text x="7.9321%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (8 samples, 0.02%)</title><rect x="7.6821%" y="1077" width="0.0168%" height="15" fill="rgb(211,146,34)" fg:x="3658" fg:w="8"/><text x="7.9321%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (40 samples, 0.08%)</title><rect x="7.6989%" y="1125" width="0.0840%" height="15" fill="rgb(228,22,38)" fg:x="3666" fg:w="40"/><text x="7.9489%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="7.7829%" y="1125" width="0.0105%" height="15" fill="rgb(235,168,5)" fg:x="3706" fg:w="5"/><text x="8.0329%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (12 samples, 0.03%)</title><rect x="7.7934%" y="1125" width="0.0252%" height="15" fill="rgb(221,155,16)" fg:x="3711" fg:w="12"/><text x="8.0434%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (7 samples, 0.01%)</title><rect x="7.8186%" y="1125" width="0.0147%" height="15" fill="rgb(215,215,53)" fg:x="3723" fg:w="7"/><text x="8.0686%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (321 samples, 0.67%)</title><rect x="7.1760%" y="1157" width="0.6741%" height="15" fill="rgb(223,4,10)" fg:x="3417" fg:w="321"/><text x="7.4260%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (219 samples, 0.46%)</title><rect x="7.3902%" y="1141" width="0.4599%" height="15" fill="rgb(234,103,6)" fg:x="3519" fg:w="219"/><text x="7.6402%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (8 samples, 0.02%)</title><rect x="7.8333%" y="1125" width="0.0168%" height="15" fill="rgb(227,97,0)" fg:x="3730" fg:w="8"/><text x="8.0833%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::ObjectName as core::fmt::Display&gt;::fmt (425 samples, 0.89%)</title><rect x="7.0122%" y="1189" width="0.8925%" height="15" fill="rgb(234,150,53)" fg:x="3339" fg:w="425"/><text x="7.2622%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (390 samples, 0.82%)</title><rect x="7.0857%" y="1173" width="0.8190%" height="15" fill="rgb(228,201,54)" fg:x="3374" fg:w="390"/><text x="7.3357%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="7.8501%" y="1157" width="0.0546%" height="15" fill="rgb(222,22,37)" fg:x="3738" fg:w="26"/><text x="8.1001%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Function as core::fmt::Display&gt;::fmt (1,627 samples, 3.42%)</title><rect x="4.5782%" y="1221" width="3.4168%" height="15" fill="rgb(237,53,32)" fg:x="2180" fg:w="1627"/><text x="4.8282%" y="1231.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,551 samples, 3.26%)</title><rect x="4.7378%" y="1205" width="3.2572%" height="15" fill="rgb(233,25,53)" fg:x="2256" fg:w="1551"/><text x="4.9878%" y="1215.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (43 samples, 0.09%)</title><rect x="7.9047%" y="1189" width="0.0903%" height="15" fill="rgb(210,40,34)" fg:x="3764" fg:w="43"/><text x="8.1547%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,728 samples, 3.63%)</title><rect x="4.3997%" y="1253" width="3.6290%" height="15" fill="rgb(241,220,44)" fg:x="2095" fg:w="1728"/><text x="4.6497%" y="1263.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,678 samples, 3.52%)</title><rect x="4.5047%" y="1237" width="3.5240%" height="15" fill="rgb(235,28,35)" fg:x="2145" fg:w="1678"/><text x="4.7547%" y="1247.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (16 samples, 0.03%)</title><rect x="7.9950%" y="1221" width="0.0336%" height="15" fill="rgb(210,56,17)" fg:x="3807" fg:w="16"/><text x="8.2450%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="8.0349%" y="1253" width="0.0441%" height="15" fill="rgb(224,130,29)" fg:x="3826" fg:w="21"/><text x="8.2849%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (17 samples, 0.04%)</title><rect x="8.0790%" y="1253" width="0.0357%" height="15" fill="rgb(235,212,8)" fg:x="3847" fg:w="17"/><text x="8.3290%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (9 samples, 0.02%)</title><rect x="8.1147%" y="1253" width="0.0189%" height="15" fill="rgb(223,33,50)" fg:x="3864" fg:w="9"/><text x="8.3647%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::SelectItem as core::fmt::Display&gt;::fmt (1,910 samples, 4.01%)</title><rect x="4.1435%" y="1285" width="4.0112%" height="15" fill="rgb(219,149,13)" fg:x="1973" fg:w="1910"/><text x="4.3935%" y="1295.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,868 samples, 3.92%)</title><rect x="4.2317%" y="1269" width="3.9230%" height="15" fill="rgb(250,156,29)" fg:x="2015" fg:w="1868"/><text x="4.4817%" y="1279.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (10 samples, 0.02%)</title><rect x="8.1336%" y="1253" width="0.0210%" height="15" fill="rgb(216,193,19)" fg:x="3873" fg:w="10"/><text x="8.3836%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="8.1547%" y="1285" width="0.0147%" height="15" fill="rgb(216,135,14)" fg:x="3883" fg:w="7"/><text x="8.4047%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (14 samples, 0.03%)</title><rect x="8.1694%" y="1285" width="0.0294%" height="15" fill="rgb(241,47,5)" fg:x="3890" fg:w="14"/><text x="8.4194%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (3,038 samples, 6.38%)</title><rect x="1.8733%" y="1317" width="6.3801%" height="15" fill="rgb(233,42,35)" fg:x="892" fg:w="3038"/><text x="2.1233%" y="1327.50">sqlparse..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (2,973 samples, 6.24%)</title><rect x="2.0098%" y="1301" width="6.2436%" height="15" fill="rgb(231,13,6)" fg:x="957" fg:w="2973"/><text x="2.2598%" y="1311.50">sqlparse..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="8.1988%" y="1285" width="0.0546%" height="15" fill="rgb(207,181,40)" fg:x="3904" fg:w="26"/><text x="8.4488%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (5 samples, 0.01%)</title><rect x="8.3374%" y="165" width="0.0105%" height="15" fill="rgb(254,173,49)" fg:x="3970" fg:w="5"/><text x="8.5874%" y="175.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (5 samples, 0.01%)</title><rect x="8.3374%" y="149" width="0.0105%" height="15" fill="rgb(221,1,38)" fg:x="3970" fg:w="5"/><text x="8.5874%" y="159.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (11 samples, 0.02%)</title><rect x="8.3269%" y="197" width="0.0231%" height="15" fill="rgb(206,124,46)" fg:x="3965" fg:w="11"/><text x="8.5769%" y="207.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (7 samples, 0.01%)</title><rect x="8.3353%" y="181" width="0.0147%" height="15" fill="rgb(249,21,11)" fg:x="3969" fg:w="7"/><text x="8.5853%" y="191.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (13 samples, 0.03%)</title><rect x="8.3248%" y="261" width="0.0273%" height="15" fill="rgb(222,201,40)" fg:x="3964" fg:w="13"/><text x="8.5748%" y="271.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="8.3248%" y="245" width="0.0273%" height="15" fill="rgb(235,61,29)" fg:x="3964" fg:w="13"/><text x="8.5748%" y="255.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (13 samples, 0.03%)</title><rect x="8.3248%" y="229" width="0.0273%" height="15" fill="rgb(219,207,3)" fg:x="3964" fg:w="13"/><text x="8.5748%" y="239.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="8.3248%" y="213" width="0.0273%" height="15" fill="rgb(222,56,46)" fg:x="3964" fg:w="13"/><text x="8.5748%" y="223.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (17 samples, 0.04%)</title><rect x="8.3185%" y="325" width="0.0357%" height="15" fill="rgb(239,76,54)" fg:x="3961" fg:w="17"/><text x="8.5685%" y="335.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (16 samples, 0.03%)</title><rect x="8.3206%" y="309" width="0.0336%" height="15" fill="rgb(231,124,27)" fg:x="3962" fg:w="16"/><text x="8.5706%" y="319.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (15 samples, 0.03%)</title><rect x="8.3227%" y="293" width="0.0315%" height="15" fill="rgb(249,195,6)" fg:x="3963" fg:w="15"/><text x="8.5727%" y="303.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (15 samples, 0.03%)</title><rect x="8.3227%" y="277" width="0.0315%" height="15" fill="rgb(237,174,47)" fg:x="3963" fg:w="15"/><text x="8.5727%" y="287.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (20 samples, 0.04%)</title><rect x="8.3164%" y="357" width="0.0420%" height="15" fill="rgb(206,201,31)" fg:x="3960" fg:w="20"/><text x="8.5664%" y="367.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (19 samples, 0.04%)</title><rect x="8.3185%" y="341" width="0.0399%" height="15" fill="rgb(231,57,52)" fg:x="3961" fg:w="19"/><text x="8.5685%" y="351.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (24 samples, 0.05%)</title><rect x="8.3101%" y="421" width="0.0504%" height="15" fill="rgb(248,177,22)" fg:x="3957" fg:w="24"/><text x="8.5601%" y="431.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (24 samples, 0.05%)</title><rect x="8.3101%" y="405" width="0.0504%" height="15" fill="rgb(215,211,37)" fg:x="3957" fg:w="24"/><text x="8.5601%" y="415.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (24 samples, 0.05%)</title><rect x="8.3101%" y="389" width="0.0504%" height="15" fill="rgb(241,128,51)" fg:x="3957" fg:w="24"/><text x="8.5601%" y="399.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (23 samples, 0.05%)</title><rect x="8.3122%" y="373" width="0.0483%" height="15" fill="rgb(227,165,31)" fg:x="3958" fg:w="23"/><text x="8.5622%" y="383.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (28 samples, 0.06%)</title><rect x="8.3080%" y="453" width="0.0588%" height="15" fill="rgb(228,167,24)" fg:x="3956" fg:w="28"/><text x="8.5580%" y="463.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="8.3101%" y="437" width="0.0567%" height="15" fill="rgb(228,143,12)" fg:x="3957" fg:w="27"/><text x="8.5601%" y="447.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (30 samples, 0.06%)</title><rect x="8.3080%" y="485" width="0.0630%" height="15" fill="rgb(249,149,8)" fg:x="3956" fg:w="30"/><text x="8.5580%" y="495.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (30 samples, 0.06%)</title><rect x="8.3080%" y="469" width="0.0630%" height="15" fill="rgb(243,35,44)" fg:x="3956" fg:w="30"/><text x="8.5580%" y="479.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (32 samples, 0.07%)</title><rect x="8.3059%" y="517" width="0.0672%" height="15" fill="rgb(246,89,9)" fg:x="3955" fg:w="32"/><text x="8.5559%" y="527.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (32 samples, 0.07%)</title><rect x="8.3059%" y="501" width="0.0672%" height="15" fill="rgb(233,213,13)" fg:x="3955" fg:w="32"/><text x="8.5559%" y="511.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (35 samples, 0.07%)</title><rect x="8.3038%" y="581" width="0.0735%" height="15" fill="rgb(233,141,41)" fg:x="3954" fg:w="35"/><text x="8.5538%" y="591.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (35 samples, 0.07%)</title><rect x="8.3038%" y="565" width="0.0735%" height="15" fill="rgb(239,167,4)" fg:x="3954" fg:w="35"/><text x="8.5538%" y="575.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (35 samples, 0.07%)</title><rect x="8.3038%" y="549" width="0.0735%" height="15" fill="rgb(209,217,16)" fg:x="3954" fg:w="35"/><text x="8.5538%" y="559.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (35 samples, 0.07%)</title><rect x="8.3038%" y="533" width="0.0735%" height="15" fill="rgb(219,88,35)" fg:x="3954" fg:w="35"/><text x="8.5538%" y="543.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (37 samples, 0.08%)</title><rect x="8.3038%" y="613" width="0.0777%" height="15" fill="rgb(220,193,23)" fg:x="3954" fg:w="37"/><text x="8.5538%" y="623.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (37 samples, 0.08%)</title><rect x="8.3038%" y="597" width="0.0777%" height="15" fill="rgb(230,90,52)" fg:x="3954" fg:w="37"/><text x="8.5538%" y="607.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (44 samples, 0.09%)</title><rect x="8.2912%" y="741" width="0.0924%" height="15" fill="rgb(252,106,19)" fg:x="3948" fg:w="44"/><text x="8.5412%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (42 samples, 0.09%)</title><rect x="8.2954%" y="725" width="0.0882%" height="15" fill="rgb(206,74,20)" fg:x="3950" fg:w="42"/><text x="8.5454%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (40 samples, 0.08%)</title><rect x="8.2996%" y="709" width="0.0840%" height="15" fill="rgb(230,138,44)" fg:x="3952" fg:w="40"/><text x="8.5496%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (40 samples, 0.08%)</title><rect x="8.2996%" y="693" width="0.0840%" height="15" fill="rgb(235,182,43)" fg:x="3952" fg:w="40"/><text x="8.5496%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (39 samples, 0.08%)</title><rect x="8.3017%" y="677" width="0.0819%" height="15" fill="rgb(242,16,51)" fg:x="3953" fg:w="39"/><text x="8.5517%" y="687.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (39 samples, 0.08%)</title><rect x="8.3017%" y="661" width="0.0819%" height="15" fill="rgb(248,9,4)" fg:x="3953" fg:w="39"/><text x="8.5517%" y="671.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (38 samples, 0.08%)</title><rect x="8.3038%" y="645" width="0.0798%" height="15" fill="rgb(210,31,22)" fg:x="3954" fg:w="38"/><text x="8.5538%" y="655.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (38 samples, 0.08%)</title><rect x="8.3038%" y="629" width="0.0798%" height="15" fill="rgb(239,54,39)" fg:x="3954" fg:w="38"/><text x="8.5538%" y="639.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (48 samples, 0.10%)</title><rect x="8.2870%" y="805" width="0.1008%" height="15" fill="rgb(230,99,41)" fg:x="3946" fg:w="48"/><text x="8.5370%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (47 samples, 0.10%)</title><rect x="8.2891%" y="789" width="0.0987%" height="15" fill="rgb(253,106,12)" fg:x="3947" fg:w="47"/><text x="8.5391%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (47 samples, 0.10%)</title><rect x="8.2891%" y="773" width="0.0987%" height="15" fill="rgb(213,46,41)" fg:x="3947" fg:w="47"/><text x="8.5391%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (46 samples, 0.10%)</title><rect x="8.2912%" y="757" width="0.0966%" height="15" fill="rgb(215,133,35)" fg:x="3948" fg:w="46"/><text x="8.5412%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (51 samples, 0.11%)</title><rect x="8.2828%" y="837" width="0.1071%" height="15" fill="rgb(213,28,5)" fg:x="3944" fg:w="51"/><text x="8.5328%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="8.2828%" y="821" width="0.1071%" height="15" fill="rgb(215,77,49)" fg:x="3944" fg:w="51"/><text x="8.5328%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (55 samples, 0.12%)</title><rect x="8.2786%" y="869" width="0.1155%" height="15" fill="rgb(248,100,22)" fg:x="3942" fg:w="55"/><text x="8.5286%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (54 samples, 0.11%)</title><rect x="8.2807%" y="853" width="0.1134%" height="15" fill="rgb(208,67,9)" fg:x="3943" fg:w="54"/><text x="8.5307%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (59 samples, 0.12%)</title><rect x="8.2744%" y="901" width="0.1239%" height="15" fill="rgb(219,133,21)" fg:x="3940" fg:w="59"/><text x="8.5244%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (59 samples, 0.12%)</title><rect x="8.2744%" y="885" width="0.1239%" height="15" fill="rgb(246,46,29)" fg:x="3940" fg:w="59"/><text x="8.5244%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (61 samples, 0.13%)</title><rect x="8.2744%" y="965" width="0.1281%" height="15" fill="rgb(246,185,52)" fg:x="3940" fg:w="61"/><text x="8.5244%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (61 samples, 0.13%)</title><rect x="8.2744%" y="949" width="0.1281%" height="15" fill="rgb(252,136,11)" fg:x="3940" fg:w="61"/><text x="8.5244%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (61 samples, 0.13%)</title><rect x="8.2744%" y="933" width="0.1281%" height="15" fill="rgb(219,138,53)" fg:x="3940" fg:w="61"/><text x="8.5244%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (61 samples, 0.13%)</title><rect x="8.2744%" y="917" width="0.1281%" height="15" fill="rgb(211,51,23)" fg:x="3940" fg:w="61"/><text x="8.5244%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (63 samples, 0.13%)</title><rect x="8.2723%" y="997" width="0.1323%" height="15" fill="rgb(247,221,28)" fg:x="3939" fg:w="63"/><text x="8.5223%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (62 samples, 0.13%)</title><rect x="8.2744%" y="981" width="0.1302%" height="15" fill="rgb(251,222,45)" fg:x="3940" fg:w="62"/><text x="8.5244%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (65 samples, 0.14%)</title><rect x="8.2723%" y="1029" width="0.1365%" height="15" fill="rgb(217,162,53)" fg:x="3939" fg:w="65"/><text x="8.5223%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (65 samples, 0.14%)</title><rect x="8.2723%" y="1013" width="0.1365%" height="15" fill="rgb(229,93,14)" fg:x="3939" fg:w="65"/><text x="8.5223%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (67 samples, 0.14%)</title><rect x="8.2702%" y="1061" width="0.1407%" height="15" fill="rgb(209,67,49)" fg:x="3938" fg:w="67"/><text x="8.5202%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (67 samples, 0.14%)</title><rect x="8.2702%" y="1045" width="0.1407%" height="15" fill="rgb(213,87,29)" fg:x="3938" fg:w="67"/><text x="8.5202%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (68 samples, 0.14%)</title><rect x="8.2702%" y="1093" width="0.1428%" height="15" fill="rgb(205,151,52)" fg:x="3938" fg:w="68"/><text x="8.5202%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (68 samples, 0.14%)</title><rect x="8.2702%" y="1077" width="0.1428%" height="15" fill="rgb(253,215,39)" fg:x="3938" fg:w="68"/><text x="8.5202%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (72 samples, 0.15%)</title><rect x="8.2681%" y="1125" width="0.1512%" height="15" fill="rgb(221,220,41)" fg:x="3937" fg:w="72"/><text x="8.5181%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (71 samples, 0.15%)</title><rect x="8.2702%" y="1109" width="0.1491%" height="15" fill="rgb(218,133,21)" fg:x="3938" fg:w="71"/><text x="8.5202%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (79 samples, 0.17%)</title><rect x="8.2555%" y="1253" width="0.1659%" height="15" fill="rgb(221,193,43)" fg:x="3931" fg:w="79"/><text x="8.5055%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (79 samples, 0.17%)</title><rect x="8.2555%" y="1237" width="0.1659%" height="15" fill="rgb(240,128,52)" fg:x="3931" fg:w="79"/><text x="8.5055%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (78 samples, 0.16%)</title><rect x="8.2576%" y="1221" width="0.1638%" height="15" fill="rgb(253,114,12)" fg:x="3932" fg:w="78"/><text x="8.5076%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (78 samples, 0.16%)</title><rect x="8.2576%" y="1205" width="0.1638%" height="15" fill="rgb(215,223,47)" fg:x="3932" fg:w="78"/><text x="8.5076%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (75 samples, 0.16%)</title><rect x="8.2639%" y="1189" width="0.1575%" height="15" fill="rgb(248,225,23)" fg:x="3935" fg:w="75"/><text x="8.5139%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (75 samples, 0.16%)</title><rect x="8.2639%" y="1173" width="0.1575%" height="15" fill="rgb(250,108,0)" fg:x="3935" fg:w="75"/><text x="8.5139%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (74 samples, 0.16%)</title><rect x="8.2660%" y="1157" width="0.1554%" height="15" fill="rgb(228,208,7)" fg:x="3936" fg:w="74"/><text x="8.5160%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (74 samples, 0.16%)</title><rect x="8.2660%" y="1141" width="0.1554%" height="15" fill="rgb(244,45,10)" fg:x="3936" fg:w="74"/><text x="8.5160%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (82 samples, 0.17%)</title><rect x="8.2534%" y="1317" width="0.1722%" height="15" fill="rgb(207,125,25)" fg:x="3930" fg:w="82"/><text x="8.5034%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (82 samples, 0.17%)</title><rect x="8.2534%" y="1301" width="0.1722%" height="15" fill="rgb(210,195,18)" fg:x="3930" fg:w="82"/><text x="8.5034%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (81 samples, 0.17%)</title><rect x="8.2555%" y="1285" width="0.1701%" height="15" fill="rgb(249,80,12)" fg:x="3931" fg:w="81"/><text x="8.5055%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (81 samples, 0.17%)</title><rect x="8.2555%" y="1269" width="0.1701%" height="15" fill="rgb(221,65,9)" fg:x="3931" fg:w="81"/><text x="8.5055%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Query as core::fmt::Display&gt;::fmt (3,806 samples, 7.99%)</title><rect x="0.4788%" y="1413" width="7.9929%" height="15" fill="rgb(235,49,36)" fg:x="228" fg:w="3806"/><text x="0.7288%" y="1423.50">sqlparser_b..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,806 samples, 7.99%)</title><rect x="0.4788%" y="1397" width="7.9929%" height="15" fill="rgb(225,32,20)" fg:x="228" fg:w="3806"/><text x="0.7288%" y="1407.50">sqlparser_b..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::SetExpr as core::fmt::Display&gt;::fmt (3,145 samples, 6.60%)</title><rect x="1.8670%" y="1381" width="6.6048%" height="15" fill="rgb(215,141,46)" fg:x="889" fg:w="3145"/><text x="2.1170%" y="1391.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,145 samples, 6.60%)</title><rect x="1.8670%" y="1365" width="6.6048%" height="15" fill="rgb(250,160,47)" fg:x="889" fg:w="3145"/><text x="2.1170%" y="1375.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Select as core::fmt::Display&gt;::fmt (3,144 samples, 6.60%)</title><rect x="1.8691%" y="1349" width="6.6027%" height="15" fill="rgb(216,222,40)" fg:x="890" fg:w="3144"/><text x="2.1191%" y="1359.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,143 samples, 6.60%)</title><rect x="1.8712%" y="1333" width="6.6006%" height="15" fill="rgb(234,217,39)" fg:x="891" fg:w="3143"/><text x="2.1212%" y="1343.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (22 samples, 0.05%)</title><rect x="8.4256%" y="1317" width="0.0462%" height="15" fill="rgb(207,178,40)" fg:x="4012" fg:w="22"/><text x="8.6756%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Statement as core::fmt::Display&gt;::fmt (3,809 samples, 8.00%)</title><rect x="0.4746%" y="1445" width="7.9992%" height="15" fill="rgb(221,136,13)" fg:x="226" fg:w="3809"/><text x="0.7246%" y="1455.50">sqlparser_b..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,808 samples, 8.00%)</title><rect x="0.4767%" y="1429" width="7.9971%" height="15" fill="rgb(249,199,10)" fg:x="227" fg:w="3808"/><text x="0.7267%" y="1439.50">sqlparser_b..</text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (32 samples, 0.07%)</title><rect x="8.4739%" y="1445" width="0.0672%" height="15" fill="rgb(249,222,13)" fg:x="4035" fg:w="32"/><text x="8.7239%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="8.5474%" y="1429" width="0.0105%" height="15" fill="rgb(244,185,38)" fg:x="4070" fg:w="5"/><text x="8.7974%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="8.5579%" y="1429" width="0.0147%" height="15" fill="rgb(236,202,9)" fg:x="4075" fg:w="7"/><text x="8.8079%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`_free (19 samples, 0.04%)</title><rect x="8.5999%" y="1413" width="0.0399%" height="15" fill="rgb(250,229,37)" fg:x="4095" fg:w="19"/><text x="8.8499%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (17 samples, 0.04%)</title><rect x="8.6398%" y="1413" width="0.0357%" height="15" fill="rgb(206,174,23)" fg:x="4114" fg:w="17"/><text x="8.8898%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (12 samples, 0.03%)</title><rect x="8.6755%" y="1413" width="0.0252%" height="15" fill="rgb(211,33,43)" fg:x="4131" fg:w="12"/><text x="8.9255%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (18 samples, 0.04%)</title><rect x="8.7511%" y="1397" width="0.0378%" height="15" fill="rgb(245,58,50)" fg:x="4167" fg:w="18"/><text x="9.0011%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr (8 samples, 0.02%)</title><rect x="8.7973%" y="1397" width="0.0168%" height="15" fill="rgb(244,68,36)" fg:x="4189" fg:w="8"/><text x="9.0473%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_small (83 samples, 0.17%)</title><rect x="8.7007%" y="1413" width="0.1743%" height="15" fill="rgb(232,229,15)" fg:x="4143" fg:w="83"/><text x="8.9507%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (29 samples, 0.06%)</title><rect x="8.8141%" y="1397" width="0.0609%" height="15" fill="rgb(254,30,23)" fg:x="4197" fg:w="29"/><text x="9.0641%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (11 samples, 0.02%)</title><rect x="8.8813%" y="1413" width="0.0231%" height="15" fill="rgb(235,160,14)" fg:x="4229" fg:w="11"/><text x="9.1313%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="8.9128%" y="1397" width="0.0147%" height="15" fill="rgb(212,155,44)" fg:x="4244" fg:w="7"/><text x="9.1628%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="8.9443%" y="1381" width="0.0147%" height="15" fill="rgb(226,2,50)" fg:x="4259" fg:w="7"/><text x="9.1943%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`free_small (10 samples, 0.02%)</title><rect x="8.9632%" y="1381" width="0.0210%" height="15" fill="rgb(234,177,6)" fg:x="4268" fg:w="10"/><text x="9.2132%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="8.9968%" y="1365" width="0.0231%" height="15" fill="rgb(217,24,9)" fg:x="4284" fg:w="11"/><text x="9.2468%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`free_small (10 samples, 0.02%)</title><rect x="9.0283%" y="1365" width="0.0210%" height="15" fill="rgb(220,13,46)" fg:x="4299" fg:w="10"/><text x="9.2783%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::vec::Vec&lt;T,A&gt; as core::ops::drop::Drop&gt;::drop (14 samples, 0.03%)</title><rect x="9.0514%" y="1365" width="0.0294%" height="15" fill="rgb(239,221,27)" fg:x="4310" fg:w="14"/><text x="9.3014%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::TableFactor&gt; (11 samples, 0.02%)</title><rect x="9.0577%" y="1349" width="0.0231%" height="15" fill="rgb(222,198,25)" fg:x="4313" fg:w="11"/><text x="9.3077%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (13 samples, 0.03%)</title><rect x="9.1102%" y="1333" width="0.0273%" height="15" fill="rgb(211,99,13)" fg:x="4338" fg:w="13"/><text x="9.3602%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`free_small (12 samples, 0.03%)</title><rect x="9.1501%" y="1317" width="0.0252%" height="15" fill="rgb(232,111,31)" fg:x="4357" fg:w="12"/><text x="9.4001%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (5 samples, 0.01%)</title><rect x="9.1648%" y="1301" width="0.0105%" height="15" fill="rgb(245,82,37)" fg:x="4364" fg:w="5"/><text x="9.4148%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Cte&gt; (128 samples, 0.27%)</title><rect x="8.9107%" y="1413" width="0.2688%" height="15" fill="rgb(227,149,46)" fg:x="4243" fg:w="128"/><text x="9.1607%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Query&gt; (112 samples, 0.24%)</title><rect x="8.9443%" y="1397" width="0.2352%" height="15" fill="rgb(218,36,50)" fg:x="4259" fg:w="112"/><text x="9.1943%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SetExpr&gt; (91 samples, 0.19%)</title><rect x="8.9884%" y="1381" width="0.1911%" height="15" fill="rgb(226,80,48)" fg:x="4280" fg:w="91"/><text x="9.2384%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SelectItem&gt; (46 samples, 0.10%)</title><rect x="9.0829%" y="1365" width="0.0966%" height="15" fill="rgb(238,224,15)" fg:x="4325" fg:w="46"/><text x="9.3329%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Function&gt; (40 samples, 0.08%)</title><rect x="9.0955%" y="1349" width="0.0840%" height="15" fill="rgb(241,136,10)" fg:x="4331" fg:w="40"/><text x="9.3455%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::FunctionArgumentList&gt; (17 samples, 0.04%)</title><rect x="9.1438%" y="1333" width="0.0357%" height="15" fill="rgb(208,32,45)" fg:x="4354" fg:w="17"/><text x="9.3938%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="9.1837%" y="1397" width="0.0252%" height="15" fill="rgb(207,135,9)" fg:x="4373" fg:w="12"/><text x="9.4337%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (39 samples, 0.08%)</title><rect x="9.2089%" y="1397" width="0.0819%" height="15" fill="rgb(206,86,44)" fg:x="4385" fg:w="39"/><text x="9.4589%" y="1407.50"></text></g><g><title>libsystem_kernel.dylib`madvise (39 samples, 0.08%)</title><rect x="9.2089%" y="1381" width="0.0819%" height="15" fill="rgb(245,177,15)" fg:x="4385" fg:w="39"/><text x="9.4589%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::OrderBy&gt; (58 samples, 0.12%)</title><rect x="9.1795%" y="1413" width="0.1218%" height="15" fill="rgb(206,64,50)" fg:x="4371" fg:w="58"/><text x="9.4295%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (5 samples, 0.01%)</title><rect x="9.2908%" y="1397" width="0.0105%" height="15" fill="rgb(234,36,40)" fg:x="4424" fg:w="5"/><text x="9.5408%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (5 samples, 0.01%)</title><rect x="9.2908%" y="1381" width="0.0105%" height="15" fill="rgb(213,64,8)" fg:x="4424" fg:w="5"/><text x="9.5408%" y="1391.50"></text></g><g><title>libsystem_kernel.dylib`madvise (5 samples, 0.01%)</title><rect x="9.2908%" y="1365" width="0.0105%" height="15" fill="rgb(210,75,36)" fg:x="4424" fg:w="5"/><text x="9.5408%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_free (16 samples, 0.03%)</title><rect x="9.3517%" y="1397" width="0.0336%" height="15" fill="rgb(229,88,21)" fg:x="4453" fg:w="16"/><text x="9.6017%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (16 samples, 0.03%)</title><rect x="9.3853%" y="1397" width="0.0336%" height="15" fill="rgb(252,204,47)" fg:x="4469" fg:w="16"/><text x="9.6353%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (12 samples, 0.03%)</title><rect x="9.4189%" y="1397" width="0.0252%" height="15" fill="rgb(208,77,27)" fg:x="4485" fg:w="12"/><text x="9.6689%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (18 samples, 0.04%)</title><rect x="9.4441%" y="1397" width="0.0378%" height="15" fill="rgb(221,76,26)" fg:x="4497" fg:w="18"/><text x="9.6941%" y="1407.50"></text></g><g><title>libsystem_kernel.dylib`madvise (18 samples, 0.04%)</title><rect x="9.4441%" y="1381" width="0.0378%" height="15" fill="rgb(225,139,18)" fg:x="4497" fg:w="18"/><text x="9.6941%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (10 samples, 0.02%)</title><rect x="9.5260%" y="1381" width="0.0210%" height="15" fill="rgb(230,137,11)" fg:x="4536" fg:w="10"/><text x="9.7760%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_find_by_ptr (9 samples, 0.02%)</title><rect x="9.5470%" y="1381" width="0.0189%" height="15" fill="rgb(212,28,1)" fg:x="4546" fg:w="9"/><text x="9.7970%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`free_small (48 samples, 0.10%)</title><rect x="9.4819%" y="1397" width="0.1008%" height="15" fill="rgb(248,164,17)" fg:x="4515" fg:w="48"/><text x="9.7319%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (8 samples, 0.02%)</title><rect x="9.5659%" y="1381" width="0.0168%" height="15" fill="rgb(222,171,42)" fg:x="4555" fg:w="8"/><text x="9.8159%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (8 samples, 0.02%)</title><rect x="9.6373%" y="1365" width="0.0168%" height="15" fill="rgb(243,84,45)" fg:x="4589" fg:w="8"/><text x="9.8873%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (44 samples, 0.09%)</title><rect x="9.5827%" y="1397" width="0.0924%" height="15" fill="rgb(252,49,23)" fg:x="4563" fg:w="44"/><text x="9.8327%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (30 samples, 0.06%)</title><rect x="9.6121%" y="1381" width="0.0630%" height="15" fill="rgb(215,19,7)" fg:x="4577" fg:w="30"/><text x="9.8621%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (10 samples, 0.02%)</title><rect x="9.6541%" y="1365" width="0.0210%" height="15" fill="rgb(238,81,41)" fg:x="4597" fg:w="10"/><text x="9.9041%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_free (10 samples, 0.02%)</title><rect x="9.6940%" y="1381" width="0.0210%" height="15" fill="rgb(210,199,37)" fg:x="4616" fg:w="10"/><text x="9.9440%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="9.7150%" y="1381" width="0.0210%" height="15" fill="rgb(244,192,49)" fg:x="4626" fg:w="10"/><text x="9.9650%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (52 samples, 0.11%)</title><rect x="9.8032%" y="1365" width="0.1092%" height="15" fill="rgb(226,211,11)" fg:x="4668" fg:w="52"/><text x="10.0532%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (13 samples, 0.03%)</title><rect x="9.9124%" y="1365" width="0.0273%" height="15" fill="rgb(236,162,54)" fg:x="4720" fg:w="13"/><text x="10.1624%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (13 samples, 0.03%)</title><rect x="9.9124%" y="1349" width="0.0273%" height="15" fill="rgb(220,229,9)" fg:x="4720" fg:w="13"/><text x="10.1624%" y="1359.50"></text></g><g><title>libsystem_kernel.dylib`madvise (12 samples, 0.03%)</title><rect x="9.9145%" y="1333" width="0.0252%" height="15" fill="rgb(250,87,22)" fg:x="4721" fg:w="12"/><text x="10.1645%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::vec::Vec&lt;T,A&gt; as core::ops::drop::Drop&gt;::drop (131 samples, 0.28%)</title><rect x="9.6877%" y="1397" width="0.2751%" height="15" fill="rgb(239,43,17)" fg:x="4613" fg:w="131"/><text x="9.9377%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::TableFactor&gt; (96 samples, 0.20%)</title><rect x="9.7612%" y="1381" width="0.2016%" height="15" fill="rgb(231,177,25)" fg:x="4648" fg:w="96"/><text x="10.0112%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (11 samples, 0.02%)</title><rect x="9.9397%" y="1365" width="0.0231%" height="15" fill="rgb(219,179,1)" fg:x="4733" fg:w="11"/><text x="10.1897%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (10 samples, 0.02%)</title><rect x="9.9628%" y="1397" width="0.0210%" height="15" fill="rgb(238,219,53)" fg:x="4744" fg:w="10"/><text x="10.2128%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="9.9859%" y="1397" width="0.0147%" height="15" fill="rgb(232,167,36)" fg:x="4755" fg:w="7"/><text x="10.2359%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="9.9859%" y="1381" width="0.0147%" height="15" fill="rgb(244,19,51)" fg:x="4755" fg:w="7"/><text x="10.2359%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (5 samples, 0.01%)</title><rect x="10.0720%" y="1349" width="0.0105%" height="15" fill="rgb(224,6,22)" fg:x="4796" fg:w="5"/><text x="10.3220%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (28 samples, 0.06%)</title><rect x="10.0258%" y="1381" width="0.0588%" height="15" fill="rgb(224,145,5)" fg:x="4774" fg:w="28"/><text x="10.2758%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (16 samples, 0.03%)</title><rect x="10.0510%" y="1365" width="0.0336%" height="15" fill="rgb(234,130,49)" fg:x="4786" fg:w="16"/><text x="10.3010%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="10.1035%" y="1365" width="0.0168%" height="15" fill="rgb(254,6,2)" fg:x="4811" fg:w="8"/><text x="10.3535%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1141" width="0.0126%" height="15" fill="rgb(208,96,46)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1125" width="0.0126%" height="15" fill="rgb(239,3,39)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1109" width="0.0126%" height="15" fill="rgb(233,210,1)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1093" width="0.0126%" height="15" fill="rgb(244,137,37)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1077" width="0.0126%" height="15" fill="rgb(240,136,2)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1061" width="0.0126%" height="15" fill="rgb(239,18,37)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1045" width="0.0126%" height="15" fill="rgb(218,185,22)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1029" width="0.0126%" height="15" fill="rgb(225,218,4)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="1013" width="0.0126%" height="15" fill="rgb(230,182,32)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="997" width="0.0126%" height="15" fill="rgb(242,56,43)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="981" width="0.0126%" height="15" fill="rgb(233,99,24)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="965" width="0.0126%" height="15" fill="rgb(234,209,42)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="949" width="0.0126%" height="15" fill="rgb(227,7,12)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="933" width="0.0126%" height="15" fill="rgb(245,203,43)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="917" width="0.0126%" height="15" fill="rgb(238,205,33)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (6 samples, 0.01%)</title><rect x="10.1266%" y="901" width="0.0126%" height="15" fill="rgb(231,56,7)" fg:x="4822" fg:w="6"/><text x="10.3766%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (5 samples, 0.01%)</title><rect x="10.1287%" y="885" width="0.0105%" height="15" fill="rgb(244,186,29)" fg:x="4823" fg:w="5"/><text x="10.3787%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (5 samples, 0.01%)</title><rect x="10.1287%" y="869" width="0.0105%" height="15" fill="rgb(234,111,31)" fg:x="4823" fg:w="5"/><text x="10.3787%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (18 samples, 0.04%)</title><rect x="10.1035%" y="1381" width="0.0378%" height="15" fill="rgb(241,149,10)" fg:x="4811" fg:w="18"/><text x="10.3535%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (9 samples, 0.02%)</title><rect x="10.1224%" y="1365" width="0.0189%" height="15" fill="rgb(249,206,44)" fg:x="4820" fg:w="9"/><text x="10.3724%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1349" width="0.0147%" height="15" fill="rgb(251,153,30)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1333" width="0.0147%" height="15" fill="rgb(239,152,38)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1317" width="0.0147%" height="15" fill="rgb(249,139,47)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1301" width="0.0147%" height="15" fill="rgb(244,64,35)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1285" width="0.0147%" height="15" fill="rgb(216,46,15)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1269" width="0.0147%" height="15" fill="rgb(250,74,19)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1253" width="0.0147%" height="15" fill="rgb(249,42,33)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1237" width="0.0147%" height="15" fill="rgb(242,149,17)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1221" width="0.0147%" height="15" fill="rgb(244,29,21)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1205" width="0.0147%" height="15" fill="rgb(220,130,37)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1189" width="0.0147%" height="15" fill="rgb(211,67,2)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1173" width="0.0147%" height="15" fill="rgb(235,68,52)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (7 samples, 0.01%)</title><rect x="10.1266%" y="1157" width="0.0147%" height="15" fill="rgb(246,142,3)" fg:x="4822" fg:w="7"/><text x="10.3766%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (70 samples, 0.15%)</title><rect x="10.0006%" y="1397" width="0.1470%" height="15" fill="rgb(241,25,7)" fg:x="4762" fg:w="70"/><text x="10.2506%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="10.1623%" y="1381" width="0.0105%" height="15" fill="rgb(242,119,39)" fg:x="4839" fg:w="5"/><text x="10.4123%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (13 samples, 0.03%)</title><rect x="10.1728%" y="1381" width="0.0273%" height="15" fill="rgb(241,98,45)" fg:x="4844" fg:w="13"/><text x="10.4228%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (6 samples, 0.01%)</title><rect x="10.2043%" y="1381" width="0.0126%" height="15" fill="rgb(254,28,30)" fg:x="4859" fg:w="6"/><text x="10.4543%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (6 samples, 0.01%)</title><rect x="10.2043%" y="1365" width="0.0126%" height="15" fill="rgb(241,142,54)" fg:x="4859" fg:w="6"/><text x="10.4543%" y="1375.50"></text></g><g><title>libsystem_kernel.dylib`madvise (6 samples, 0.01%)</title><rect x="10.2043%" y="1349" width="0.0126%" height="15" fill="rgb(222,85,15)" fg:x="4859" fg:w="6"/><text x="10.4543%" y="1359.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="10.2190%" y="1381" width="0.0105%" height="15" fill="rgb(210,85,47)" fg:x="4866" fg:w="5"/><text x="10.4690%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="10.2358%" y="1365" width="0.0147%" height="15" fill="rgb(224,206,25)" fg:x="4874" fg:w="7"/><text x="10.4858%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (12 samples, 0.03%)</title><rect x="10.2883%" y="1349" width="0.0252%" height="15" fill="rgb(243,201,19)" fg:x="4899" fg:w="12"/><text x="10.5383%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`free_small (38 samples, 0.08%)</title><rect x="10.2589%" y="1365" width="0.0798%" height="15" fill="rgb(236,59,4)" fg:x="4885" fg:w="38"/><text x="10.5089%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (11 samples, 0.02%)</title><rect x="10.3156%" y="1349" width="0.0231%" height="15" fill="rgb(254,179,45)" fg:x="4912" fg:w="11"/><text x="10.5656%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Function&gt; (95 samples, 0.20%)</title><rect x="10.1476%" y="1397" width="0.1995%" height="15" fill="rgb(226,14,10)" fg:x="4832" fg:w="95"/><text x="10.3976%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::FunctionArgumentList&gt; (54 samples, 0.11%)</title><rect x="10.2337%" y="1381" width="0.1134%" height="15" fill="rgb(244,27,41)" fg:x="4873" fg:w="54"/><text x="10.4837%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SetExpr&gt; (510 samples, 1.07%)</title><rect x="9.3013%" y="1413" width="1.0710%" height="15" fill="rgb(235,35,32)" fg:x="4429" fg:w="510"/><text x="9.5513%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::query::Query&gt;&gt; (873 samples, 1.83%)</title><rect x="8.5453%" y="1445" width="1.8334%" height="15" fill="rgb(218,68,31)" fg:x="4069" fg:w="873"/><text x="8.7953%" y="1455.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Query&gt; (854 samples, 1.79%)</title><rect x="8.5852%" y="1429" width="1.7935%" height="15" fill="rgb(207,120,37)" fg:x="4088" fg:w="854"/><text x="8.8352%" y="1439.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (175 samples, 0.37%)</title><rect x="10.3912%" y="1445" width="0.3675%" height="15" fill="rgb(227,98,0)" fg:x="4948" fg:w="175"/><text x="10.6412%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Whitespace&gt; (57 samples, 0.12%)</title><rect x="10.7588%" y="1445" width="0.1197%" height="15" fill="rgb(207,7,3)" fg:x="5123" fg:w="57"/><text x="11.0088%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (123 samples, 0.26%)</title><rect x="11.0423%" y="1429" width="0.2583%" height="15" fill="rgb(206,98,19)" fg:x="5258" fg:w="123"/><text x="11.2923%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (62 samples, 0.13%)</title><rect x="11.3090%" y="1429" width="0.1302%" height="15" fill="rgb(217,5,26)" fg:x="5385" fg:w="62"/><text x="11.5590%" y="1439.50"></text></g><g><title>libsystem_kernel.dylib`madvise (62 samples, 0.13%)</title><rect x="11.3090%" y="1413" width="0.1302%" height="15" fill="rgb(235,190,38)" fg:x="5385" fg:w="62"/><text x="11.5590%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`free_small (5 samples, 0.01%)</title><rect x="11.4392%" y="1429" width="0.0105%" height="15" fill="rgb(247,86,24)" fg:x="5447" fg:w="5"/><text x="11.6892%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (5 samples, 0.01%)</title><rect x="11.4497%" y="1429" width="0.0105%" height="15" fill="rgb(205,101,16)" fg:x="5452" fg:w="5"/><text x="11.6997%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (5 samples, 0.01%)</title><rect x="11.4497%" y="1413" width="0.0105%" height="15" fill="rgb(246,168,33)" fg:x="5452" fg:w="5"/><text x="11.6997%" y="1423.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (83 samples, 0.17%)</title><rect x="11.4707%" y="1429" width="0.1743%" height="15" fill="rgb(231,114,1)" fg:x="5462" fg:w="83"/><text x="11.7207%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="11.6534%" y="1429" width="0.0105%" height="15" fill="rgb(207,184,53)" fg:x="5549" fg:w="5"/><text x="11.9034%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="11.7332%" y="1413" width="0.0126%" height="15" fill="rgb(224,95,51)" fg:x="5587" fg:w="6"/><text x="11.9832%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="11.7689%" y="1397" width="0.0105%" height="15" fill="rgb(212,188,45)" fg:x="5604" fg:w="5"/><text x="12.0189%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="11.7689%" y="1381" width="0.0105%" height="15" fill="rgb(223,154,38)" fg:x="5604" fg:w="5"/><text x="12.0189%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (17 samples, 0.04%)</title><rect x="11.7500%" y="1413" width="0.0357%" height="15" fill="rgb(251,22,52)" fg:x="5595" fg:w="17"/><text x="12.0000%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="11.8109%" y="1397" width="0.0105%" height="15" fill="rgb(229,209,22)" fg:x="5624" fg:w="5"/><text x="12.0609%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (6 samples, 0.01%)</title><rect x="11.9075%" y="1333" width="0.0126%" height="15" fill="rgb(234,138,34)" fg:x="5670" fg:w="6"/><text x="12.1575%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (67 samples, 0.14%)</title><rect x="11.7920%" y="1413" width="0.1407%" height="15" fill="rgb(212,95,11)" fg:x="5615" fg:w="67"/><text x="12.0420%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (48 samples, 0.10%)</title><rect x="11.8319%" y="1397" width="0.1008%" height="15" fill="rgb(240,179,47)" fg:x="5634" fg:w="48"/><text x="12.0819%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (31 samples, 0.07%)</title><rect x="11.8676%" y="1381" width="0.0651%" height="15" fill="rgb(240,163,11)" fg:x="5651" fg:w="31"/><text x="12.1176%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (25 samples, 0.05%)</title><rect x="11.8802%" y="1365" width="0.0525%" height="15" fill="rgb(236,37,12)" fg:x="5657" fg:w="25"/><text x="12.1302%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (18 samples, 0.04%)</title><rect x="11.8949%" y="1349" width="0.0378%" height="15" fill="rgb(232,164,16)" fg:x="5664" fg:w="18"/><text x="12.1449%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (5 samples, 0.01%)</title><rect x="11.9327%" y="1413" width="0.0105%" height="15" fill="rgb(244,205,15)" fg:x="5682" fg:w="5"/><text x="12.1827%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="11.9789%" y="1397" width="0.0189%" height="15" fill="rgb(223,117,47)" fg:x="5704" fg:w="9"/><text x="12.2289%" y="1407.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (31 samples, 0.07%)</title><rect x="11.9978%" y="1397" width="0.0651%" height="15" fill="rgb(244,107,35)" fg:x="5713" fg:w="31"/><text x="12.2478%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="12.1007%" y="1381" width="0.0168%" height="15" fill="rgb(205,140,8)" fg:x="5762" fg:w="8"/><text x="12.3507%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (21 samples, 0.04%)</title><rect x="12.0755%" y="1397" width="0.0441%" height="15" fill="rgb(228,84,46)" fg:x="5750" fg:w="21"/><text x="12.3255%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (12 samples, 0.03%)</title><rect x="12.1280%" y="1397" width="0.0252%" height="15" fill="rgb(254,188,9)" fg:x="5775" fg:w="12"/><text x="12.3780%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (7 samples, 0.01%)</title><rect x="12.3128%" y="1381" width="0.0147%" height="15" fill="rgb(206,112,54)" fg:x="5863" fg:w="7"/><text x="12.5628%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (154 samples, 0.32%)</title><rect x="12.3380%" y="1381" width="0.3234%" height="15" fill="rgb(216,84,49)" fg:x="5875" fg:w="154"/><text x="12.5880%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="12.6635%" y="1381" width="0.0126%" height="15" fill="rgb(214,194,35)" fg:x="6030" fg:w="6"/><text x="12.9135%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (6 samples, 0.01%)</title><rect x="12.7727%" y="1317" width="0.0126%" height="15" fill="rgb(249,28,3)" fg:x="6082" fg:w="6"/><text x="13.0227%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::alloc::exchange_malloc (48 samples, 0.10%)</title><rect x="12.6971%" y="1381" width="0.1008%" height="15" fill="rgb(222,56,52)" fg:x="6046" fg:w="48"/><text x="12.9471%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (48 samples, 0.10%)</title><rect x="12.6971%" y="1365" width="0.1008%" height="15" fill="rgb(245,217,50)" fg:x="6046" fg:w="48"/><text x="12.9471%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (36 samples, 0.08%)</title><rect x="12.7223%" y="1349" width="0.0756%" height="15" fill="rgb(213,201,24)" fg:x="6058" fg:w="36"/><text x="12.9723%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (32 samples, 0.07%)</title><rect x="12.7307%" y="1333" width="0.0672%" height="15" fill="rgb(248,116,28)" fg:x="6062" fg:w="32"/><text x="12.9807%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (9 samples, 0.02%)</title><rect x="12.7980%" y="1381" width="0.0189%" height="15" fill="rgb(219,72,43)" fg:x="6094" fg:w="9"/><text x="13.0480%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (8 samples, 0.02%)</title><rect x="12.8001%" y="1365" width="0.0168%" height="15" fill="rgb(209,138,14)" fg:x="6095" fg:w="8"/><text x="13.0501%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="12.8064%" y="1349" width="0.0105%" height="15" fill="rgb(222,18,33)" fg:x="6098" fg:w="5"/><text x="13.0564%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (5 samples, 0.01%)</title><rect x="12.8169%" y="1381" width="0.0105%" height="15" fill="rgb(213,199,7)" fg:x="6103" fg:w="5"/><text x="13.0669%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (9 samples, 0.02%)</title><rect x="12.8673%" y="1365" width="0.0189%" height="15" fill="rgb(250,110,10)" fg:x="6127" fg:w="9"/><text x="13.1173%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (9 samples, 0.02%)</title><rect x="12.8904%" y="1365" width="0.0189%" height="15" fill="rgb(248,123,6)" fg:x="6138" fg:w="9"/><text x="13.1404%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (13 samples, 0.03%)</title><rect x="12.9093%" y="1365" width="0.0273%" height="15" fill="rgb(206,91,31)" fg:x="6147" fg:w="13"/><text x="13.1593%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="12.9219%" y="1349" width="0.0147%" height="15" fill="rgb(211,154,13)" fg:x="6153" fg:w="7"/><text x="13.1719%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (7 samples, 0.01%)</title><rect x="12.9366%" y="1365" width="0.0147%" height="15" fill="rgb(225,148,7)" fg:x="6160" fg:w="7"/><text x="13.1866%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (23 samples, 0.05%)</title><rect x="13.0143%" y="1349" width="0.0483%" height="15" fill="rgb(220,160,43)" fg:x="6197" fg:w="23"/><text x="13.2643%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::alloc::exchange_malloc (11 samples, 0.02%)</title><rect x="13.0668%" y="1349" width="0.0231%" height="15" fill="rgb(213,52,39)" fg:x="6222" fg:w="11"/><text x="13.3168%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (11 samples, 0.02%)</title><rect x="13.0668%" y="1333" width="0.0231%" height="15" fill="rgb(243,137,7)" fg:x="6222" fg:w="11"/><text x="13.3168%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (8 samples, 0.02%)</title><rect x="13.0731%" y="1317" width="0.0168%" height="15" fill="rgb(230,79,13)" fg:x="6225" fg:w="8"/><text x="13.3231%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (7 samples, 0.01%)</title><rect x="13.0752%" y="1301" width="0.0147%" height="15" fill="rgb(247,105,23)" fg:x="6226" fg:w="7"/><text x="13.3252%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="13.1172%" y="1333" width="0.0105%" height="15" fill="rgb(223,179,41)" fg:x="6246" fg:w="5"/><text x="13.3672%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (16 samples, 0.03%)</title><rect x="13.1277%" y="1333" width="0.0336%" height="15" fill="rgb(218,9,34)" fg:x="6251" fg:w="16"/><text x="13.3777%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (23 samples, 0.05%)</title><rect x="13.2369%" y="1317" width="0.0483%" height="15" fill="rgb(222,106,8)" fg:x="6303" fg:w="23"/><text x="13.4869%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_keyword (7 samples, 0.01%)</title><rect x="13.3020%" y="1317" width="0.0147%" height="15" fill="rgb(211,220,0)" fg:x="6334" fg:w="7"/><text x="13.5520%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_all_or_distinct (9 samples, 0.02%)</title><rect x="13.3230%" y="1317" width="0.0189%" height="15" fill="rgb(229,52,16)" fg:x="6344" fg:w="9"/><text x="13.5730%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (27 samples, 0.06%)</title><rect x="13.3587%" y="1301" width="0.0567%" height="15" fill="rgb(212,155,18)" fg:x="6361" fg:w="27"/><text x="13.6087%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (20 samples, 0.04%)</title><rect x="13.4175%" y="1301" width="0.0420%" height="15" fill="rgb(242,21,14)" fg:x="6389" fg:w="20"/><text x="13.6675%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (14 samples, 0.03%)</title><rect x="13.4301%" y="1285" width="0.0294%" height="15" fill="rgb(222,19,48)" fg:x="6395" fg:w="14"/><text x="13.6801%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (6 samples, 0.01%)</title><rect x="13.4469%" y="1269" width="0.0126%" height="15" fill="rgb(232,45,27)" fg:x="6403" fg:w="6"/><text x="13.6969%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_free (9 samples, 0.02%)</title><rect x="13.4784%" y="1285" width="0.0189%" height="15" fill="rgb(249,103,42)" fg:x="6418" fg:w="9"/><text x="13.7284%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="13.5540%" y="1269" width="0.0105%" height="15" fill="rgb(246,81,33)" fg:x="6454" fg:w="5"/><text x="13.8040%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="13.5792%" y="1253" width="0.0273%" height="15" fill="rgb(252,33,42)" fg:x="6466" fg:w="13"/><text x="13.8292%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (10 samples, 0.02%)</title><rect x="13.5855%" y="1237" width="0.0210%" height="15" fill="rgb(209,212,41)" fg:x="6469" fg:w="10"/><text x="13.8355%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (22 samples, 0.05%)</title><rect x="13.5645%" y="1269" width="0.0462%" height="15" fill="rgb(207,154,6)" fg:x="6459" fg:w="22"/><text x="13.8145%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_alias (41 samples, 0.09%)</title><rect x="13.5309%" y="1285" width="0.0861%" height="15" fill="rgb(223,64,47)" fg:x="6443" fg:w="41"/><text x="13.7809%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="13.6317%" y="1269" width="0.0105%" height="15" fill="rgb(211,161,38)" fg:x="6491" fg:w="5"/><text x="13.8817%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="13.6422%" y="1269" width="0.0168%" height="15" fill="rgb(219,138,40)" fg:x="6496" fg:w="8"/><text x="13.8922%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (8 samples, 0.02%)</title><rect x="13.6716%" y="1253" width="0.0168%" height="15" fill="rgb(241,228,46)" fg:x="6510" fg:w="8"/><text x="13.9216%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="13.6884%" y="1253" width="0.0147%" height="15" fill="rgb(223,209,38)" fg:x="6518" fg:w="7"/><text x="13.9384%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="13.7031%" y="1253" width="0.0147%" height="15" fill="rgb(236,164,45)" fg:x="6525" fg:w="7"/><text x="13.9531%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="13.7073%" y="1237" width="0.0105%" height="15" fill="rgb(231,15,5)" fg:x="6527" fg:w="5"/><text x="13.9573%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (28 samples, 0.06%)</title><rect x="13.6632%" y="1269" width="0.0588%" height="15" fill="rgb(252,35,15)" fg:x="6506" fg:w="28"/><text x="13.9132%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="13.7556%" y="1253" width="0.0105%" height="15" fill="rgb(248,181,18)" fg:x="6550" fg:w="5"/><text x="14.0056%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="13.7661%" y="1253" width="0.0189%" height="15" fill="rgb(233,39,42)" fg:x="6555" fg:w="9"/><text x="14.0161%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (26 samples, 0.05%)</title><rect x="13.7850%" y="1253" width="0.0546%" height="15" fill="rgb(238,110,33)" fg:x="6564" fg:w="26"/><text x="14.0350%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="13.8459%" y="1253" width="0.0105%" height="15" fill="rgb(233,195,10)" fg:x="6593" fg:w="5"/><text x="14.0959%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="13.8837%" y="1237" width="0.0126%" height="15" fill="rgb(254,105,3)" fg:x="6611" fg:w="6"/><text x="14.1337%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (26 samples, 0.05%)</title><rect x="13.8690%" y="1253" width="0.0546%" height="15" fill="rgb(221,225,9)" fg:x="6604" fg:w="26"/><text x="14.1190%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (12 samples, 0.03%)</title><rect x="13.8984%" y="1237" width="0.0252%" height="15" fill="rgb(224,227,45)" fg:x="6618" fg:w="12"/><text x="14.1484%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="13.9068%" y="1221" width="0.0168%" height="15" fill="rgb(229,198,43)" fg:x="6622" fg:w="8"/><text x="14.1568%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (6 samples, 0.01%)</title><rect x="13.9278%" y="1253" width="0.0126%" height="15" fill="rgb(206,209,35)" fg:x="6632" fg:w="6"/><text x="14.1778%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (9 samples, 0.02%)</title><rect x="13.9404%" y="1253" width="0.0189%" height="15" fill="rgb(245,195,53)" fg:x="6638" fg:w="9"/><text x="14.1904%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="14.0349%" y="1237" width="0.0105%" height="15" fill="rgb(240,92,26)" fg:x="6683" fg:w="5"/><text x="14.2849%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="14.0517%" y="1237" width="0.0231%" height="15" fill="rgb(207,40,23)" fg:x="6691" fg:w="11"/><text x="14.3017%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (13 samples, 0.03%)</title><rect x="14.0748%" y="1237" width="0.0273%" height="15" fill="rgb(223,111,35)" fg:x="6702" fg:w="13"/><text x="14.3248%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (9 samples, 0.02%)</title><rect x="14.1588%" y="1173" width="0.0189%" height="15" fill="rgb(229,147,28)" fg:x="6742" fg:w="9"/><text x="14.4088%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (6 samples, 0.01%)</title><rect x="14.2386%" y="1093" width="0.0126%" height="15" fill="rgb(211,29,28)" fg:x="6780" fg:w="6"/><text x="14.4886%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="14.2575%" y="1077" width="0.0252%" height="15" fill="rgb(228,72,33)" fg:x="6789" fg:w="12"/><text x="14.5075%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (25 samples, 0.05%)</title><rect x="14.2512%" y="1093" width="0.0525%" height="15" fill="rgb(205,214,31)" fg:x="6786" fg:w="25"/><text x="14.5012%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (10 samples, 0.02%)</title><rect x="14.2827%" y="1077" width="0.0210%" height="15" fill="rgb(224,111,15)" fg:x="6801" fg:w="10"/><text x="14.5327%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (47 samples, 0.10%)</title><rect x="14.2176%" y="1109" width="0.0987%" height="15" fill="rgb(253,21,26)" fg:x="6770" fg:w="47"/><text x="14.4676%" y="1119.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="14.3037%" y="1093" width="0.0126%" height="15" fill="rgb(245,139,43)" fg:x="6811" fg:w="6"/><text x="14.5537%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (50 samples, 0.11%)</title><rect x="14.2155%" y="1125" width="0.1050%" height="15" fill="rgb(252,170,7)" fg:x="6769" fg:w="50"/><text x="14.4655%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (71 samples, 0.15%)</title><rect x="14.1840%" y="1157" width="0.1491%" height="15" fill="rgb(231,118,14)" fg:x="6754" fg:w="71"/><text x="14.4340%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (62 samples, 0.13%)</title><rect x="14.2029%" y="1141" width="0.1302%" height="15" fill="rgb(238,83,0)" fg:x="6763" fg:w="62"/><text x="14.4529%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (6 samples, 0.01%)</title><rect x="14.3205%" y="1125" width="0.0126%" height="15" fill="rgb(221,39,39)" fg:x="6819" fg:w="6"/><text x="14.5705%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (76 samples, 0.16%)</title><rect x="14.1777%" y="1173" width="0.1596%" height="15" fill="rgb(222,119,46)" fg:x="6751" fg:w="76"/><text x="14.4277%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (115 samples, 0.24%)</title><rect x="14.1231%" y="1237" width="0.2415%" height="15" fill="rgb(222,165,49)" fg:x="6725" fg:w="115"/><text x="14.3731%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (109 samples, 0.23%)</title><rect x="14.1357%" y="1221" width="0.2289%" height="15" fill="rgb(219,113,52)" fg:x="6731" fg:w="109"/><text x="14.3857%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (106 samples, 0.22%)</title><rect x="14.1420%" y="1205" width="0.2226%" height="15" fill="rgb(214,7,15)" fg:x="6734" fg:w="106"/><text x="14.3920%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (104 samples, 0.22%)</title><rect x="14.1462%" y="1189" width="0.2184%" height="15" fill="rgb(235,32,4)" fg:x="6736" fg:w="104"/><text x="14.3962%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (7 samples, 0.01%)</title><rect x="14.3499%" y="1173" width="0.0147%" height="15" fill="rgb(238,90,54)" fg:x="6833" fg:w="7"/><text x="14.5999%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (13 samples, 0.03%)</title><rect x="14.3940%" y="1221" width="0.0273%" height="15" fill="rgb(213,208,19)" fg:x="6854" fg:w="13"/><text x="14.6440%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (28 samples, 0.06%)</title><rect x="14.3646%" y="1237" width="0.0588%" height="15" fill="rgb(233,156,4)" fg:x="6840" fg:w="28"/><text x="14.6146%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (17 samples, 0.04%)</title><rect x="14.5284%" y="1189" width="0.0357%" height="15" fill="rgb(207,194,5)" fg:x="6918" fg:w="17"/><text x="14.7784%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (16 samples, 0.03%)</title><rect x="14.5305%" y="1173" width="0.0336%" height="15" fill="rgb(206,111,30)" fg:x="6919" fg:w="16"/><text x="14.7805%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (16 samples, 0.03%)</title><rect x="14.5305%" y="1157" width="0.0336%" height="15" fill="rgb(243,70,54)" fg:x="6919" fg:w="16"/><text x="14.7805%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="14.5788%" y="1173" width="0.0147%" height="15" fill="rgb(242,28,8)" fg:x="6942" fg:w="7"/><text x="14.8288%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="14.5935%" y="1173" width="0.0147%" height="15" fill="rgb(219,106,18)" fg:x="6949" fg:w="7"/><text x="14.8435%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="14.6082%" y="1173" width="0.0189%" height="15" fill="rgb(244,222,10)" fg:x="6956" fg:w="9"/><text x="14.8582%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="14.6397%" y="1157" width="0.0168%" height="15" fill="rgb(236,179,52)" fg:x="6971" fg:w="8"/><text x="14.8897%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (81 samples, 0.17%)</title><rect x="14.4906%" y="1205" width="0.1701%" height="15" fill="rgb(213,23,39)" fg:x="6900" fg:w="81"/><text x="14.7406%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (46 samples, 0.10%)</title><rect x="14.5641%" y="1189" width="0.0966%" height="15" fill="rgb(238,48,10)" fg:x="6935" fg:w="46"/><text x="14.8141%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (16 samples, 0.03%)</title><rect x="14.6271%" y="1173" width="0.0336%" height="15" fill="rgb(251,196,23)" fg:x="6965" fg:w="16"/><text x="14.8771%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="14.6880%" y="1189" width="0.0147%" height="15" fill="rgb(250,152,24)" fg:x="6994" fg:w="7"/><text x="14.9380%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="14.7048%" y="1189" width="0.0273%" height="15" fill="rgb(209,150,17)" fg:x="7002" fg:w="13"/><text x="14.9548%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (10 samples, 0.02%)</title><rect x="14.7111%" y="1173" width="0.0210%" height="15" fill="rgb(234,202,34)" fg:x="7005" fg:w="10"/><text x="14.9611%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="14.7216%" y="1157" width="0.0105%" height="15" fill="rgb(253,148,53)" fg:x="7010" fg:w="5"/><text x="14.9716%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="14.7216%" y="1141" width="0.0105%" height="15" fill="rgb(218,129,16)" fg:x="7010" fg:w="5"/><text x="14.9716%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="14.7321%" y="1189" width="0.0168%" height="15" fill="rgb(216,85,19)" fg:x="7015" fg:w="8"/><text x="14.9821%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_type_modifiers (47 samples, 0.10%)</title><rect x="14.6607%" y="1205" width="0.0987%" height="15" fill="rgb(235,228,7)" fg:x="6981" fg:w="47"/><text x="14.9107%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (158 samples, 0.33%)</title><rect x="14.4297%" y="1221" width="0.3318%" height="15" fill="rgb(245,175,0)" fg:x="6871" fg:w="158"/><text x="14.6797%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (168 samples, 0.35%)</title><rect x="14.4255%" y="1237" width="0.3528%" height="15" fill="rgb(208,168,36)" fg:x="6869" fg:w="168"/><text x="14.6755%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="14.8287%" y="1221" width="0.0105%" height="15" fill="rgb(246,171,24)" fg:x="7061" fg:w="5"/><text x="15.0787%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="14.8539%" y="1221" width="0.0126%" height="15" fill="rgb(215,142,24)" fg:x="7073" fg:w="6"/><text x="15.1039%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="14.9064%" y="1205" width="0.0147%" height="15" fill="rgb(250,187,7)" fg:x="7098" fg:w="7"/><text x="15.1564%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_compound_field_access (25 samples, 0.05%)</title><rect x="14.8770%" y="1221" width="0.0525%" height="15" fill="rgb(228,66,33)" fg:x="7084" fg:w="25"/><text x="15.1270%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (5 samples, 0.01%)</title><rect x="14.9610%" y="1205" width="0.0105%" height="15" fill="rgb(234,215,21)" fg:x="7124" fg:w="5"/><text x="15.2110%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="15.0387%" y="1189" width="0.0315%" height="15" fill="rgb(222,191,20)" fg:x="7161" fg:w="15"/><text x="15.2887%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="15.0702%" y="1189" width="0.0105%" height="15" fill="rgb(245,79,54)" fg:x="7176" fg:w="5"/><text x="15.3202%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="15.1122%" y="1173" width="0.0126%" height="15" fill="rgb(240,10,37)" fg:x="7196" fg:w="6"/><text x="15.3622%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (21 samples, 0.04%)</title><rect x="15.1354%" y="1173" width="0.0441%" height="15" fill="rgb(214,192,32)" fg:x="7207" fg:w="21"/><text x="15.3854%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (14 samples, 0.03%)</title><rect x="15.1501%" y="1157" width="0.0294%" height="15" fill="rgb(209,36,54)" fg:x="7214" fg:w="14"/><text x="15.4001%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (14 samples, 0.03%)</title><rect x="15.1501%" y="1141" width="0.0294%" height="15" fill="rgb(220,10,11)" fg:x="7214" fg:w="14"/><text x="15.4001%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (11 samples, 0.02%)</title><rect x="15.1564%" y="1125" width="0.0231%" height="15" fill="rgb(221,106,17)" fg:x="7217" fg:w="11"/><text x="15.4064%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (9 samples, 0.02%)</title><rect x="15.1606%" y="1109" width="0.0189%" height="15" fill="rgb(251,142,44)" fg:x="7219" fg:w="9"/><text x="15.4106%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="15.1921%" y="1157" width="0.0105%" height="15" fill="rgb(238,13,15)" fg:x="7234" fg:w="5"/><text x="15.4421%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="15.3013%" y="1109" width="0.0399%" height="15" fill="rgb(208,107,27)" fg:x="7286" fg:w="19"/><text x="15.5513%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (6 samples, 0.01%)</title><rect x="15.3496%" y="1093" width="0.0126%" height="15" fill="rgb(205,136,37)" fg:x="7309" fg:w="6"/><text x="15.5996%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="15.3412%" y="1109" width="0.0273%" height="15" fill="rgb(250,205,27)" fg:x="7305" fg:w="13"/><text x="15.5912%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="15.4168%" y="981" width="0.0126%" height="15" fill="rgb(210,80,43)" fg:x="7341" fg:w="6"/><text x="15.6668%" y="991.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (13 samples, 0.03%)</title><rect x="15.4147%" y="997" width="0.0273%" height="15" fill="rgb(247,160,36)" fg:x="7340" fg:w="13"/><text x="15.6647%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (26 samples, 0.05%)</title><rect x="15.3916%" y="1061" width="0.0546%" height="15" fill="rgb(234,13,49)" fg:x="7329" fg:w="26"/><text x="15.6416%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (23 samples, 0.05%)</title><rect x="15.3979%" y="1045" width="0.0483%" height="15" fill="rgb(234,122,0)" fg:x="7332" fg:w="23"/><text x="15.6479%" y="1055.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (21 samples, 0.04%)</title><rect x="15.4021%" y="1029" width="0.0441%" height="15" fill="rgb(207,146,38)" fg:x="7334" fg:w="21"/><text x="15.6521%" y="1039.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (20 samples, 0.04%)</title><rect x="15.4042%" y="1013" width="0.0420%" height="15" fill="rgb(207,177,25)" fg:x="7335" fg:w="20"/><text x="15.6542%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (29 samples, 0.06%)</title><rect x="15.3874%" y="1077" width="0.0609%" height="15" fill="rgb(211,178,42)" fg:x="7327" fg:w="29"/><text x="15.6374%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (54 samples, 0.11%)</title><rect x="15.3685%" y="1109" width="0.1134%" height="15" fill="rgb(230,69,54)" fg:x="7318" fg:w="54"/><text x="15.6185%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (53 samples, 0.11%)</title><rect x="15.3706%" y="1093" width="0.1113%" height="15" fill="rgb(214,135,41)" fg:x="7319" fg:w="53"/><text x="15.6206%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (13 samples, 0.03%)</title><rect x="15.4546%" y="1077" width="0.0273%" height="15" fill="rgb(237,67,25)" fg:x="7359" fg:w="13"/><text x="15.7046%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (119 samples, 0.25%)</title><rect x="15.2488%" y="1141" width="0.2499%" height="15" fill="rgb(222,189,50)" fg:x="7261" fg:w="119"/><text x="15.4988%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (105 samples, 0.22%)</title><rect x="15.2782%" y="1125" width="0.2205%" height="15" fill="rgb(245,148,34)" fg:x="7275" fg:w="105"/><text x="15.5282%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_named_arg_operator (134 samples, 0.28%)</title><rect x="15.2194%" y="1157" width="0.2814%" height="15" fill="rgb(222,29,6)" fg:x="7247" fg:w="134"/><text x="15.4694%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="15.5218%" y="1141" width="0.0168%" height="15" fill="rgb(221,189,43)" fg:x="7391" fg:w="8"/><text x="15.7718%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (19 samples, 0.04%)</title><rect x="15.5008%" y="1157" width="0.0399%" height="15" fill="rgb(207,36,27)" fg:x="7381" fg:w="19"/><text x="15.7508%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="15.5449%" y="1141" width="0.0105%" height="15" fill="rgb(217,90,24)" fg:x="7402" fg:w="5"/><text x="15.7949%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="15.5617%" y="1141" width="0.0189%" height="15" fill="rgb(224,66,35)" fg:x="7410" fg:w="9"/><text x="15.8117%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (13 samples, 0.03%)</title><rect x="15.6079%" y="1125" width="0.0273%" height="15" fill="rgb(221,13,50)" fg:x="7432" fg:w="13"/><text x="15.8579%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (5 samples, 0.01%)</title><rect x="15.6499%" y="1125" width="0.0105%" height="15" fill="rgb(236,68,49)" fg:x="7452" fg:w="5"/><text x="15.8999%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="15.6877%" y="1109" width="0.0105%" height="15" fill="rgb(229,146,28)" fg:x="7470" fg:w="5"/><text x="15.9377%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="15.7024%" y="1109" width="0.0105%" height="15" fill="rgb(225,31,38)" fg:x="7477" fg:w="5"/><text x="15.9524%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="15.8095%" y="949" width="0.0189%" height="15" fill="rgb(250,208,3)" fg:x="7528" fg:w="9"/><text x="16.0595%" y="959.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (24 samples, 0.05%)</title><rect x="15.7990%" y="965" width="0.0504%" height="15" fill="rgb(246,54,23)" fg:x="7523" fg:w="24"/><text x="16.0490%" y="975.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (10 samples, 0.02%)</title><rect x="15.8284%" y="949" width="0.0210%" height="15" fill="rgb(243,76,11)" fg:x="7537" fg:w="10"/><text x="16.0784%" y="959.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (34 samples, 0.07%)</title><rect x="15.7801%" y="981" width="0.0714%" height="15" fill="rgb(245,21,50)" fg:x="7514" fg:w="34"/><text x="16.0301%" y="991.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (40 samples, 0.08%)</title><rect x="15.7717%" y="997" width="0.0840%" height="15" fill="rgb(228,9,43)" fg:x="7510" fg:w="40"/><text x="16.0217%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (48 samples, 0.10%)</title><rect x="15.7591%" y="1045" width="0.1008%" height="15" fill="rgb(208,100,47)" fg:x="7504" fg:w="48"/><text x="16.0091%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (46 samples, 0.10%)</title><rect x="15.7633%" y="1029" width="0.0966%" height="15" fill="rgb(232,26,8)" fg:x="7506" fg:w="46"/><text x="16.0133%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (44 samples, 0.09%)</title><rect x="15.7675%" y="1013" width="0.0924%" height="15" fill="rgb(216,166,38)" fg:x="7508" fg:w="44"/><text x="16.0175%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (69 samples, 0.14%)</title><rect x="15.7486%" y="1077" width="0.1449%" height="15" fill="rgb(251,202,51)" fg:x="7499" fg:w="69"/><text x="15.9986%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (69 samples, 0.14%)</title><rect x="15.7486%" y="1061" width="0.1449%" height="15" fill="rgb(254,216,34)" fg:x="7499" fg:w="69"/><text x="15.9986%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (12 samples, 0.03%)</title><rect x="15.8683%" y="1045" width="0.0252%" height="15" fill="rgb(251,32,27)" fg:x="7556" fg:w="12"/><text x="16.1183%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (80 samples, 0.17%)</title><rect x="15.7297%" y="1109" width="0.1680%" height="15" fill="rgb(208,127,28)" fg:x="7490" fg:w="80"/><text x="15.9797%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (77 samples, 0.16%)</title><rect x="15.7360%" y="1093" width="0.1617%" height="15" fill="rgb(224,137,22)" fg:x="7493" fg:w="77"/><text x="15.9860%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="15.9061%" y="1093" width="0.0231%" height="15" fill="rgb(254,70,32)" fg:x="7574" fg:w="11"/><text x="16.1561%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (17 samples, 0.04%)</title><rect x="15.8977%" y="1109" width="0.0357%" height="15" fill="rgb(229,75,37)" fg:x="7570" fg:w="17"/><text x="16.1477%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (5 samples, 0.01%)</title><rect x="15.9670%" y="1061" width="0.0105%" height="15" fill="rgb(252,64,23)" fg:x="7603" fg:w="5"/><text x="16.2170%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="16.0111%" y="1029" width="0.0126%" height="15" fill="rgb(232,162,48)" fg:x="7624" fg:w="6"/><text x="16.2611%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="16.0048%" y="1045" width="0.0252%" height="15" fill="rgb(246,160,12)" fg:x="7621" fg:w="12"/><text x="16.2548%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (36 samples, 0.08%)</title><rect x="15.9586%" y="1077" width="0.0756%" height="15" fill="rgb(247,166,0)" fg:x="7599" fg:w="36"/><text x="16.2086%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (27 samples, 0.06%)</title><rect x="15.9775%" y="1061" width="0.0567%" height="15" fill="rgb(249,219,21)" fg:x="7608" fg:w="27"/><text x="16.2275%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (44 samples, 0.09%)</title><rect x="15.9439%" y="1093" width="0.0924%" height="15" fill="rgb(205,209,3)" fg:x="7592" fg:w="44"/><text x="16.1939%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (48 samples, 0.10%)</title><rect x="15.9376%" y="1109" width="0.1008%" height="15" fill="rgb(243,44,1)" fg:x="7589" fg:w="48"/><text x="16.1876%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="16.0468%" y="1093" width="0.0168%" height="15" fill="rgb(206,159,16)" fg:x="7641" fg:w="8"/><text x="16.2968%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="16.0489%" y="1077" width="0.0147%" height="15" fill="rgb(244,77,30)" fg:x="7642" fg:w="7"/><text x="16.2989%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (15 samples, 0.03%)</title><rect x="16.0384%" y="1109" width="0.0315%" height="15" fill="rgb(218,69,12)" fg:x="7637" fg:w="15"/><text x="16.2884%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_parse (6 samples, 0.01%)</title><rect x="16.0699%" y="1109" width="0.0126%" height="15" fill="rgb(212,87,7)" fg:x="7652" fg:w="6"/><text x="16.3199%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (198 samples, 0.42%)</title><rect x="15.6688%" y="1125" width="0.4158%" height="15" fill="rgb(245,114,25)" fg:x="7461" fg:w="198"/><text x="15.9188%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_args (436 samples, 0.92%)</title><rect x="15.1795%" y="1173" width="0.9156%" height="15" fill="rgb(210,61,42)" fg:x="7228" fg:w="436"/><text x="15.4295%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (264 samples, 0.55%)</title><rect x="15.5407%" y="1157" width="0.5544%" height="15" fill="rgb(211,52,33)" fg:x="7400" fg:w="264"/><text x="15.7907%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (241 samples, 0.51%)</title><rect x="15.5890%" y="1141" width="0.5061%" height="15" fill="rgb(234,58,33)" fg:x="7423" fg:w="241"/><text x="15.8390%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (480 samples, 1.01%)</title><rect x="15.0954%" y="1189" width="1.0080%" height="15" fill="rgb(220,115,36)" fg:x="7188" fg:w="480"/><text x="15.3454%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_argument_list (541 samples, 1.14%)</title><rect x="14.9736%" y="1205" width="1.1361%" height="15" fill="rgb(243,153,54)" fg:x="7130" fg:w="541"/><text x="15.2236%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_call (564 samples, 1.18%)</title><rect x="14.9295%" y="1221" width="1.1845%" height="15" fill="rgb(251,47,18)" fg:x="7109" fg:w="564"/><text x="15.1795%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (641 samples, 1.35%)</title><rect x="14.7783%" y="1237" width="1.3462%" height="15" fill="rgb(242,102,42)" fg:x="7037" fg:w="641"/><text x="15.0283%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (1,035 samples, 2.17%)</title><rect x="13.9593%" y="1253" width="2.1736%" height="15" fill="rgb(234,31,38)" fg:x="6647" fg:w="1035"/><text x="14.2093%" y="1263.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select_item (1,271 samples, 2.67%)</title><rect x="13.4700%" y="1301" width="2.6692%" height="15" fill="rgb(221,117,51)" fg:x="6414" fg:w="1271"/><text x="13.7200%" y="1311.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (1,200 samples, 2.52%)</title><rect x="13.6191%" y="1285" width="2.5201%" height="15" fill="rgb(212,20,18)" fg:x="6485" fg:w="1200"/><text x="13.8691%" y="1295.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,148 samples, 2.41%)</title><rect x="13.7283%" y="1269" width="2.4109%" height="15" fill="rgb(245,133,36)" fg:x="6537" fg:w="1148"/><text x="13.9783%" y="1279.50">sq..</text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="16.1623%" y="1285" width="0.0126%" height="15" fill="rgb(212,6,19)" fg:x="7696" fg:w="6"/><text x="16.4123%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (5 samples, 0.01%)</title><rect x="16.1896%" y="1285" width="0.0105%" height="15" fill="rgb(218,1,36)" fg:x="7709" fg:w="5"/><text x="16.4396%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="16.2799%" y="1237" width="0.0168%" height="15" fill="rgb(246,84,54)" fg:x="7752" fg:w="8"/><text x="16.5299%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="16.2862%" y="1221" width="0.0105%" height="15" fill="rgb(242,110,6)" fg:x="7755" fg:w="5"/><text x="16.5362%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (24 samples, 0.05%)</title><rect x="16.2484%" y="1269" width="0.0504%" height="15" fill="rgb(214,47,5)" fg:x="7737" fg:w="24"/><text x="16.4984%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (17 samples, 0.04%)</title><rect x="16.2631%" y="1253" width="0.0357%" height="15" fill="rgb(218,159,25)" fg:x="7744" fg:w="17"/><text x="16.5131%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_table_alias (8 samples, 0.02%)</title><rect x="16.2988%" y="1269" width="0.0168%" height="15" fill="rgb(215,211,28)" fg:x="7761" fg:w="8"/><text x="16.5488%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_alias (6 samples, 0.01%)</title><rect x="16.3030%" y="1253" width="0.0126%" height="15" fill="rgb(238,59,32)" fg:x="7763" fg:w="6"/><text x="16.5530%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (5 samples, 0.01%)</title><rect x="16.3198%" y="1269" width="0.0105%" height="15" fill="rgb(226,82,3)" fg:x="7771" fg:w="5"/><text x="16.5698%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="16.3765%" y="1237" width="0.0105%" height="15" fill="rgb(240,164,32)" fg:x="7798" fg:w="5"/><text x="16.6265%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_factor (90 samples, 0.19%)</title><rect x="16.2001%" y="1285" width="0.1890%" height="15" fill="rgb(232,46,7)" fg:x="7714" fg:w="90"/><text x="16.4501%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_tokens (28 samples, 0.06%)</title><rect x="16.3303%" y="1269" width="0.0588%" height="15" fill="rgb(229,129,53)" fg:x="7776" fg:w="28"/><text x="16.5803%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="16.3639%" y="1253" width="0.0252%" height="15" fill="rgb(234,188,29)" fg:x="7792" fg:w="12"/><text x="16.6139%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (1,454 samples, 3.05%)</title><rect x="13.3419%" y="1317" width="3.0535%" height="15" fill="rgb(246,141,4)" fg:x="6353" fg:w="1454"/><text x="13.5919%" y="1327.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_and_joins (122 samples, 0.26%)</title><rect x="16.1392%" y="1301" width="0.2562%" height="15" fill="rgb(229,23,39)" fg:x="7685" fg:w="122"/><text x="16.3892%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (8 samples, 0.02%)</title><rect x="16.4080%" y="1301" width="0.0168%" height="15" fill="rgb(206,12,3)" fg:x="7813" fg:w="8"/><text x="16.6580%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (12 samples, 0.03%)</title><rect x="16.4521%" y="1285" width="0.0252%" height="15" fill="rgb(252,226,20)" fg:x="7834" fg:w="12"/><text x="16.7021%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (5 samples, 0.01%)</title><rect x="16.5886%" y="1125" width="0.0105%" height="15" fill="rgb(216,123,35)" fg:x="7899" fg:w="5"/><text x="16.8386%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (22 samples, 0.05%)</title><rect x="16.5592%" y="1205" width="0.0462%" height="15" fill="rgb(212,68,40)" fg:x="7885" fg:w="22"/><text x="16.8092%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (22 samples, 0.05%)</title><rect x="16.5592%" y="1189" width="0.0462%" height="15" fill="rgb(254,125,32)" fg:x="7885" fg:w="22"/><text x="16.8092%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (18 samples, 0.04%)</title><rect x="16.5676%" y="1173" width="0.0378%" height="15" fill="rgb(253,97,22)" fg:x="7889" fg:w="18"/><text x="16.8176%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (11 samples, 0.02%)</title><rect x="16.5823%" y="1157" width="0.0231%" height="15" fill="rgb(241,101,14)" fg:x="7896" fg:w="11"/><text x="16.8323%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (11 samples, 0.02%)</title><rect x="16.5823%" y="1141" width="0.0231%" height="15" fill="rgb(238,103,29)" fg:x="7896" fg:w="11"/><text x="16.8323%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (33 samples, 0.07%)</title><rect x="16.5424%" y="1269" width="0.0693%" height="15" fill="rgb(233,195,47)" fg:x="7877" fg:w="33"/><text x="16.7924%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (30 samples, 0.06%)</title><rect x="16.5487%" y="1253" width="0.0630%" height="15" fill="rgb(246,218,30)" fg:x="7880" fg:w="30"/><text x="16.7987%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (30 samples, 0.06%)</title><rect x="16.5487%" y="1237" width="0.0630%" height="15" fill="rgb(219,145,47)" fg:x="7880" fg:w="30"/><text x="16.7987%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (29 samples, 0.06%)</title><rect x="16.5508%" y="1221" width="0.0609%" height="15" fill="rgb(243,12,26)" fg:x="7881" fg:w="29"/><text x="16.8008%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (7 samples, 0.01%)</title><rect x="16.6138%" y="1269" width="0.0147%" height="15" fill="rgb(214,87,16)" fg:x="7911" fg:w="7"/><text x="16.8638%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="16.6726%" y="1205" width="0.0126%" height="15" fill="rgb(208,99,42)" fg:x="7939" fg:w="6"/><text x="16.9226%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (24 samples, 0.05%)</title><rect x="16.6369%" y="1237" width="0.0504%" height="15" fill="rgb(253,99,2)" fg:x="7922" fg:w="24"/><text x="16.8869%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (13 samples, 0.03%)</title><rect x="16.6600%" y="1221" width="0.0273%" height="15" fill="rgb(220,168,23)" fg:x="7933" fg:w="13"/><text x="16.9100%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (33 samples, 0.07%)</title><rect x="16.6285%" y="1269" width="0.0693%" height="15" fill="rgb(242,38,24)" fg:x="7918" fg:w="33"/><text x="16.8785%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (32 samples, 0.07%)</title><rect x="16.6306%" y="1253" width="0.0672%" height="15" fill="rgb(225,182,9)" fg:x="7919" fg:w="32"/><text x="16.8806%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (6 samples, 0.01%)</title><rect x="16.6978%" y="1269" width="0.0126%" height="15" fill="rgb(243,178,37)" fg:x="7951" fg:w="6"/><text x="16.9478%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (106 samples, 0.22%)</title><rect x="16.4941%" y="1285" width="0.2226%" height="15" fill="rgb(232,139,19)" fg:x="7854" fg:w="106"/><text x="16.7441%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_group_by (154 samples, 0.32%)</title><rect x="16.3954%" y="1317" width="0.3234%" height="15" fill="rgb(225,201,24)" fg:x="7807" fg:w="154"/><text x="16.6454%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (135 samples, 0.28%)</title><rect x="16.4353%" y="1301" width="0.2835%" height="15" fill="rgb(221,47,46)" fg:x="7826" fg:w="135"/><text x="16.6853%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query_body (1,727 samples, 3.63%)</title><rect x="13.0941%" y="1349" width="3.6269%" height="15" fill="rgb(249,23,13)" fg:x="6235" fg:w="1727"/><text x="13.3441%" y="1359.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select (1,681 samples, 3.53%)</title><rect x="13.1907%" y="1333" width="3.5303%" height="15" fill="rgb(219,9,5)" fg:x="6281" fg:w="1681"/><text x="13.4407%" y="1343.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_cte (1,854 samples, 3.89%)</title><rect x="12.8337%" y="1381" width="3.8936%" height="15" fill="rgb(254,171,16)" fg:x="6111" fg:w="1854"/><text x="13.0837%" y="1391.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query (1,798 samples, 3.78%)</title><rect x="12.9513%" y="1365" width="3.7760%" height="15" fill="rgb(230,171,20)" fg:x="6167" fg:w="1798"/><text x="13.2013%" y="1375.50">sqlp..</text></g><g><title>libsystem_platform.dylib`_platform_memmove (81 samples, 0.17%)</title><rect x="16.7314%" y="1365" width="0.1701%" height="15" fill="rgb(210,71,41)" fg:x="7967" fg:w="81"/><text x="16.9814%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (18 samples, 0.04%)</title><rect x="16.9099%" y="1349" width="0.0378%" height="15" fill="rgb(206,173,20)" fg:x="8052" fg:w="18"/><text x="17.1599%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (8 samples, 0.02%)</title><rect x="16.9582%" y="1301" width="0.0168%" height="15" fill="rgb(233,88,34)" fg:x="8075" fg:w="8"/><text x="17.2082%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="16.9603%" y="1285" width="0.0147%" height="15" fill="rgb(223,209,46)" fg:x="8076" fg:w="7"/><text x="17.2103%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (10 samples, 0.02%)</title><rect x="16.9582%" y="1349" width="0.0210%" height="15" fill="rgb(250,43,18)" fg:x="8075" fg:w="10"/><text x="17.2082%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (10 samples, 0.02%)</title><rect x="16.9582%" y="1333" width="0.0210%" height="15" fill="rgb(208,13,10)" fg:x="8075" fg:w="10"/><text x="17.2082%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (10 samples, 0.02%)</title><rect x="16.9582%" y="1317" width="0.0210%" height="15" fill="rgb(212,200,36)" fg:x="8075" fg:w="10"/><text x="17.2082%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="17.0023%" y="1333" width="0.0105%" height="15" fill="rgb(225,90,30)" fg:x="8096" fg:w="5"/><text x="17.2523%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="17.0191%" y="1317" width="0.0126%" height="15" fill="rgb(236,182,39)" fg:x="8104" fg:w="6"/><text x="17.2691%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (20 samples, 0.04%)</title><rect x="17.0359%" y="1317" width="0.0420%" height="15" fill="rgb(212,144,35)" fg:x="8112" fg:w="20"/><text x="17.2859%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (5 samples, 0.01%)</title><rect x="17.0863%" y="1317" width="0.0105%" height="15" fill="rgb(228,63,44)" fg:x="8136" fg:w="5"/><text x="17.3363%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="17.1262%" y="1269" width="0.0126%" height="15" fill="rgb(228,109,6)" fg:x="8155" fg:w="6"/><text x="17.3762%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="17.1262%" y="1253" width="0.0126%" height="15" fill="rgb(238,117,24)" fg:x="8155" fg:w="6"/><text x="17.3762%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (21 samples, 0.04%)</title><rect x="17.0968%" y="1317" width="0.0441%" height="15" fill="rgb(242,26,26)" fg:x="8141" fg:w="21"/><text x="17.3468%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (15 samples, 0.03%)</title><rect x="17.1094%" y="1301" width="0.0315%" height="15" fill="rgb(221,92,48)" fg:x="8147" fg:w="15"/><text x="17.3594%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="17.1157%" y="1285" width="0.0252%" height="15" fill="rgb(209,209,32)" fg:x="8150" fg:w="12"/><text x="17.3657%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="17.1808%" y="1301" width="0.0147%" height="15" fill="rgb(221,70,22)" fg:x="8181" fg:w="7"/><text x="17.4308%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (7 samples, 0.01%)</title><rect x="17.1955%" y="1301" width="0.0147%" height="15" fill="rgb(248,145,5)" fg:x="8188" fg:w="7"/><text x="17.4455%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="17.2102%" y="1301" width="0.0189%" height="15" fill="rgb(226,116,26)" fg:x="8195" fg:w="9"/><text x="17.4602%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="17.2396%" y="1301" width="0.0147%" height="15" fill="rgb(244,5,17)" fg:x="8209" fg:w="7"/><text x="17.4896%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="17.2585%" y="1285" width="0.0126%" height="15" fill="rgb(252,159,33)" fg:x="8218" fg:w="6"/><text x="17.5085%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="17.3005%" y="1237" width="0.0105%" height="15" fill="rgb(206,71,0)" fg:x="8238" fg:w="5"/><text x="17.5505%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="17.3782%" y="1141" width="0.0231%" height="15" fill="rgb(233,118,54)" fg:x="8275" fg:w="11"/><text x="17.6282%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (9 samples, 0.02%)</title><rect x="17.4013%" y="1141" width="0.0189%" height="15" fill="rgb(234,83,48)" fg:x="8286" fg:w="9"/><text x="17.6513%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (26 samples, 0.05%)</title><rect x="17.3740%" y="1157" width="0.0546%" height="15" fill="rgb(228,3,54)" fg:x="8273" fg:w="26"/><text x="17.6240%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (49 samples, 0.10%)</title><rect x="17.3404%" y="1189" width="0.1029%" height="15" fill="rgb(226,155,13)" fg:x="8257" fg:w="49"/><text x="17.5904%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (46 samples, 0.10%)</title><rect x="17.3467%" y="1173" width="0.0966%" height="15" fill="rgb(241,28,37)" fg:x="8260" fg:w="46"/><text x="17.5967%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="17.4286%" y="1157" width="0.0147%" height="15" fill="rgb(233,93,10)" fg:x="8299" fg:w="7"/><text x="17.6786%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (64 samples, 0.13%)</title><rect x="17.3110%" y="1237" width="0.1344%" height="15" fill="rgb(225,113,19)" fg:x="8243" fg:w="64"/><text x="17.5610%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (60 samples, 0.13%)</title><rect x="17.3194%" y="1221" width="0.1260%" height="15" fill="rgb(241,2,18)" fg:x="8247" fg:w="60"/><text x="17.5694%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (54 samples, 0.11%)</title><rect x="17.3320%" y="1205" width="0.1134%" height="15" fill="rgb(228,207,21)" fg:x="8253" fg:w="54"/><text x="17.5820%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="17.4581%" y="1221" width="0.0126%" height="15" fill="rgb(213,211,35)" fg:x="8313" fg:w="6"/><text x="17.7081%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (106 samples, 0.22%)</title><rect x="17.2585%" y="1301" width="0.2226%" height="15" fill="rgb(209,83,10)" fg:x="8218" fg:w="106"/><text x="17.5085%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (99 samples, 0.21%)</title><rect x="17.2732%" y="1285" width="0.2079%" height="15" fill="rgb(209,164,1)" fg:x="8225" fg:w="99"/><text x="17.5232%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (92 samples, 0.19%)</title><rect x="17.2879%" y="1269" width="0.1932%" height="15" fill="rgb(213,184,43)" fg:x="8232" fg:w="92"/><text x="17.5379%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (90 samples, 0.19%)</title><rect x="17.2921%" y="1253" width="0.1890%" height="15" fill="rgb(231,61,34)" fg:x="8234" fg:w="90"/><text x="17.5421%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (13 samples, 0.03%)</title><rect x="17.4539%" y="1237" width="0.0273%" height="15" fill="rgb(235,75,3)" fg:x="8311" fg:w="13"/><text x="17.7039%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="17.4854%" y="1285" width="0.0126%" height="15" fill="rgb(220,106,47)" fg:x="8326" fg:w="6"/><text x="17.7354%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (10 samples, 0.02%)</title><rect x="17.4812%" y="1301" width="0.0210%" height="15" fill="rgb(210,196,33)" fg:x="8324" fg:w="10"/><text x="17.7312%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="17.5778%" y="1237" width="0.0147%" height="15" fill="rgb(229,154,42)" fg:x="8370" fg:w="7"/><text x="17.8278%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="17.6072%" y="1221" width="0.0168%" height="15" fill="rgb(228,114,26)" fg:x="8384" fg:w="8"/><text x="17.8572%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="17.6240%" y="1221" width="0.0126%" height="15" fill="rgb(208,144,1)" fg:x="8392" fg:w="6"/><text x="17.8740%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (18 samples, 0.04%)</title><rect x="17.6009%" y="1237" width="0.0378%" height="15" fill="rgb(239,112,37)" fg:x="8381" fg:w="18"/><text x="17.8509%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (58 samples, 0.12%)</title><rect x="17.5232%" y="1269" width="0.1218%" height="15" fill="rgb(210,96,50)" fg:x="8344" fg:w="58"/><text x="17.7732%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (45 samples, 0.09%)</title><rect x="17.5505%" y="1253" width="0.0945%" height="15" fill="rgb(222,178,2)" fg:x="8357" fg:w="45"/><text x="17.8005%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (73 samples, 0.15%)</title><rect x="17.5022%" y="1301" width="0.1533%" height="15" fill="rgb(226,74,18)" fg:x="8334" fg:w="73"/><text x="17.7522%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (71 samples, 0.15%)</title><rect x="17.5064%" y="1285" width="0.1491%" height="15" fill="rgb(225,67,54)" fg:x="8336" fg:w="71"/><text x="17.7564%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="17.6807%" y="1285" width="0.0105%" height="15" fill="rgb(251,92,32)" fg:x="8419" fg:w="5"/><text x="17.9307%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="17.6912%" y="1285" width="0.0126%" height="15" fill="rgb(228,149,22)" fg:x="8424" fg:w="6"/><text x="17.9412%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="17.7038%" y="1285" width="0.0147%" height="15" fill="rgb(243,54,13)" fg:x="8430" fg:w="7"/><text x="17.9538%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (29 samples, 0.06%)</title><rect x="17.6597%" y="1301" width="0.0609%" height="15" fill="rgb(243,180,28)" fg:x="8409" fg:w="29"/><text x="17.9097%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (277 samples, 0.58%)</title><rect x="17.1514%" y="1317" width="0.5817%" height="15" fill="rgb(208,167,24)" fg:x="8167" fg:w="277"/><text x="17.4014%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_parse (6 samples, 0.01%)</title><rect x="17.7206%" y="1301" width="0.0126%" height="15" fill="rgb(245,73,45)" fg:x="8438" fg:w="6"/><text x="17.9706%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_order_by_expr (357 samples, 0.75%)</title><rect x="16.9855%" y="1349" width="0.7497%" height="15" fill="rgb(237,203,48)" fg:x="8088" fg:w="357"/><text x="17.2355%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (343 samples, 0.72%)</title><rect x="17.0149%" y="1333" width="0.7203%" height="15" fill="rgb(211,197,16)" fg:x="8102" fg:w="343"/><text x="17.2649%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_order_by (481 samples, 1.01%)</title><rect x="16.7272%" y="1381" width="1.0101%" height="15" fill="rgb(243,99,51)" fg:x="7965" fg:w="481"/><text x="16.9772%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (397 samples, 0.83%)</title><rect x="16.9036%" y="1365" width="0.8337%" height="15" fill="rgb(215,123,29)" fg:x="8049" fg:w="397"/><text x="17.1536%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (23 samples, 0.05%)</title><rect x="17.8130%" y="1365" width="0.0483%" height="15" fill="rgb(239,186,37)" fg:x="8482" fg:w="23"/><text x="18.0630%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (18 samples, 0.04%)</title><rect x="17.8235%" y="1349" width="0.0378%" height="15" fill="rgb(252,136,39)" fg:x="8487" fg:w="18"/><text x="18.0735%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (15 samples, 0.03%)</title><rect x="17.8298%" y="1333" width="0.0315%" height="15" fill="rgb(223,213,32)" fg:x="8490" fg:w="15"/><text x="18.0798%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (5 samples, 0.01%)</title><rect x="17.8508%" y="1317" width="0.0105%" height="15" fill="rgb(233,115,5)" fg:x="8500" fg:w="5"/><text x="18.1008%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (173 samples, 0.36%)</title><rect x="17.8613%" y="1365" width="0.3633%" height="15" fill="rgb(207,226,44)" fg:x="8505" fg:w="173"/><text x="18.1113%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (11 samples, 0.02%)</title><rect x="18.2330%" y="1365" width="0.0231%" height="15" fill="rgb(208,126,0)" fg:x="8682" fg:w="11"/><text x="18.4830%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`rack_get_thread_index (5 samples, 0.01%)</title><rect x="18.2792%" y="1333" width="0.0105%" height="15" fill="rgb(244,66,21)" fg:x="8704" fg:w="5"/><text x="18.5292%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (6 samples, 0.01%)</title><rect x="18.3170%" y="1301" width="0.0126%" height="15" fill="rgb(222,97,12)" fg:x="8722" fg:w="6"/><text x="18.5670%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::FnOnce::call_once (42 samples, 0.09%)</title><rect x="18.2582%" y="1365" width="0.0882%" height="15" fill="rgb(219,213,19)" fg:x="8694" fg:w="42"/><text x="18.5082%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (36 samples, 0.08%)</title><rect x="18.2708%" y="1349" width="0.0756%" height="15" fill="rgb(252,169,30)" fg:x="8700" fg:w="36"/><text x="18.5208%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (26 samples, 0.05%)</title><rect x="18.2918%" y="1333" width="0.0546%" height="15" fill="rgb(206,32,51)" fg:x="8710" fg:w="26"/><text x="18.5418%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (21 samples, 0.04%)</title><rect x="18.3023%" y="1317" width="0.0441%" height="15" fill="rgb(250,172,42)" fg:x="8715" fg:w="21"/><text x="18.5523%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (6 samples, 0.01%)</title><rect x="18.3338%" y="1301" width="0.0126%" height="15" fill="rgb(209,34,43)" fg:x="8730" fg:w="6"/><text x="18.5838%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (5 samples, 0.01%)</title><rect x="18.3590%" y="1365" width="0.0105%" height="15" fill="rgb(223,11,35)" fg:x="8742" fg:w="5"/><text x="18.6090%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (12 samples, 0.03%)</title><rect x="18.3695%" y="1365" width="0.0252%" height="15" fill="rgb(251,219,26)" fg:x="8747" fg:w="12"/><text x="18.6195%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keywords (17 samples, 0.04%)</title><rect x="18.3947%" y="1365" width="0.0357%" height="15" fill="rgb(231,119,3)" fg:x="8759" fg:w="17"/><text x="18.6447%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_one_of_keywords (5 samples, 0.01%)</title><rect x="18.4304%" y="1365" width="0.0105%" height="15" fill="rgb(216,97,11)" fg:x="8776" fg:w="5"/><text x="18.6804%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_group_by (5 samples, 0.01%)</title><rect x="18.4409%" y="1365" width="0.0105%" height="15" fill="rgb(223,59,9)" fg:x="8781" fg:w="5"/><text x="18.6909%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (106 samples, 0.22%)</title><rect x="18.7853%" y="1349" width="0.2226%" height="15" fill="rgb(233,93,31)" fg:x="8945" fg:w="106"/><text x="19.0353%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="19.0079%" y="1349" width="0.0126%" height="15" fill="rgb(239,81,33)" fg:x="9051" fg:w="6"/><text x="19.2579%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (13 samples, 0.03%)</title><rect x="19.0205%" y="1349" width="0.0273%" height="15" fill="rgb(213,120,34)" fg:x="9057" fg:w="13"/><text x="19.2705%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="19.0772%" y="1317" width="0.0105%" height="15" fill="rgb(243,49,53)" fg:x="9084" fg:w="5"/><text x="19.3272%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="19.0940%" y="1317" width="0.0105%" height="15" fill="rgb(247,216,33)" fg:x="9092" fg:w="5"/><text x="19.3440%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="19.0940%" y="1301" width="0.0105%" height="15" fill="rgb(226,26,14)" fg:x="9092" fg:w="5"/><text x="19.3440%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_keyword (22 samples, 0.05%)</title><rect x="19.0604%" y="1349" width="0.0462%" height="15" fill="rgb(215,49,53)" fg:x="9076" fg:w="22"/><text x="19.3104%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (17 samples, 0.04%)</title><rect x="19.0709%" y="1333" width="0.0357%" height="15" fill="rgb(245,162,40)" fg:x="9081" fg:w="17"/><text x="19.3209%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::is_parse_comma_separated_end_with_trailing_commas (7 samples, 0.01%)</title><rect x="19.1066%" y="1349" width="0.0147%" height="15" fill="rgb(229,68,17)" fg:x="9098" fg:w="7"/><text x="19.3566%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_all_or_distinct (11 samples, 0.02%)</title><rect x="19.1213%" y="1349" width="0.0231%" height="15" fill="rgb(213,182,10)" fg:x="9105" fg:w="11"/><text x="19.3713%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="19.2326%" y="1333" width="0.0147%" height="15" fill="rgb(245,125,30)" fg:x="9158" fg:w="7"/><text x="19.4826%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="19.2473%" y="1333" width="0.0126%" height="15" fill="rgb(232,202,2)" fg:x="9165" fg:w="6"/><text x="19.4973%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (195 samples, 0.41%)</title><rect x="19.2599%" y="1333" width="0.4095%" height="15" fill="rgb(237,140,51)" fg:x="9171" fg:w="195"/><text x="19.5099%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (5 samples, 0.01%)</title><rect x="19.6694%" y="1333" width="0.0105%" height="15" fill="rgb(236,157,25)" fg:x="9366" fg:w="5"/><text x="19.9194%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (10 samples, 0.02%)</title><rect x="19.6820%" y="1333" width="0.0210%" height="15" fill="rgb(219,209,0)" fg:x="9372" fg:w="10"/><text x="19.9320%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (9 samples, 0.02%)</title><rect x="19.7450%" y="1317" width="0.0189%" height="15" fill="rgb(240,116,54)" fg:x="9402" fg:w="9"/><text x="19.9950%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (5 samples, 0.01%)</title><rect x="19.8795%" y="1253" width="0.0105%" height="15" fill="rgb(216,10,36)" fg:x="9466" fg:w="5"/><text x="20.1295%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (94 samples, 0.20%)</title><rect x="19.7030%" y="1333" width="0.1974%" height="15" fill="rgb(222,72,44)" fg:x="9382" fg:w="94"/><text x="19.9530%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (56 samples, 0.12%)</title><rect x="19.7829%" y="1317" width="0.1176%" height="15" fill="rgb(232,159,9)" fg:x="9420" fg:w="56"/><text x="20.0329%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (28 samples, 0.06%)</title><rect x="19.8417%" y="1301" width="0.0588%" height="15" fill="rgb(210,39,32)" fg:x="9448" fg:w="28"/><text x="20.0917%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (19 samples, 0.04%)</title><rect x="19.8606%" y="1285" width="0.0399%" height="15" fill="rgb(216,194,45)" fg:x="9457" fg:w="19"/><text x="20.1106%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (13 samples, 0.03%)</title><rect x="19.8732%" y="1269" width="0.0273%" height="15" fill="rgb(218,18,35)" fg:x="9463" fg:w="13"/><text x="20.1232%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (5 samples, 0.01%)</title><rect x="19.8900%" y="1253" width="0.0105%" height="15" fill="rgb(207,83,51)" fg:x="9471" fg:w="5"/><text x="20.1400%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::is_parse_comma_separated_end_with_trailing_commas (15 samples, 0.03%)</title><rect x="19.9173%" y="1333" width="0.0315%" height="15" fill="rgb(225,63,43)" fg:x="9484" fg:w="15"/><text x="20.1673%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_exclude (7 samples, 0.01%)</title><rect x="20.0937%" y="1301" width="0.0147%" height="15" fill="rgb(207,57,36)" fg:x="9568" fg:w="7"/><text x="20.3437%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_ilike (5 samples, 0.01%)</title><rect x="20.1084%" y="1301" width="0.0105%" height="15" fill="rgb(216,99,33)" fg:x="9575" fg:w="5"/><text x="20.3584%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_rename (5 samples, 0.01%)</title><rect x="20.1189%" y="1301" width="0.0105%" height="15" fill="rgb(225,42,16)" fg:x="9580" fg:w="5"/><text x="20.3689%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_additional_options (48 samples, 0.10%)</title><rect x="20.0370%" y="1317" width="0.1008%" height="15" fill="rgb(220,201,45)" fg:x="9541" fg:w="48"/><text x="20.2870%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="20.1672%" y="1301" width="0.0168%" height="15" fill="rgb(225,33,4)" fg:x="9603" fg:w="8"/><text x="20.4172%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="20.2008%" y="1285" width="0.0105%" height="15" fill="rgb(224,33,50)" fg:x="9619" fg:w="5"/><text x="20.4508%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="20.2113%" y="1285" width="0.0147%" height="15" fill="rgb(246,198,51)" fg:x="9624" fg:w="7"/><text x="20.4613%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="20.2134%" y="1269" width="0.0126%" height="15" fill="rgb(205,22,4)" fg:x="9625" fg:w="6"/><text x="20.4634%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (20 samples, 0.04%)</title><rect x="20.1882%" y="1301" width="0.0420%" height="15" fill="rgb(206,3,8)" fg:x="9613" fg:w="20"/><text x="20.4382%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (24 samples, 0.05%)</title><rect x="20.2617%" y="1285" width="0.0504%" height="15" fill="rgb(251,23,15)" fg:x="9648" fg:w="24"/><text x="20.5117%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (13 samples, 0.03%)</title><rect x="20.3373%" y="1285" width="0.0273%" height="15" fill="rgb(252,88,28)" fg:x="9684" fg:w="13"/><text x="20.5873%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (12 samples, 0.03%)</title><rect x="20.3394%" y="1269" width="0.0252%" height="15" fill="rgb(212,127,14)" fg:x="9685" fg:w="12"/><text x="20.5894%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (11 samples, 0.02%)</title><rect x="20.3415%" y="1253" width="0.0231%" height="15" fill="rgb(247,145,37)" fg:x="9686" fg:w="11"/><text x="20.5915%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="20.4024%" y="1269" width="0.0126%" height="15" fill="rgb(209,117,53)" fg:x="9715" fg:w="6"/><text x="20.6524%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (22 samples, 0.05%)</title><rect x="20.4150%" y="1269" width="0.0462%" height="15" fill="rgb(212,90,42)" fg:x="9721" fg:w="22"/><text x="20.6650%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (18 samples, 0.04%)</title><rect x="20.4612%" y="1269" width="0.0378%" height="15" fill="rgb(218,164,37)" fg:x="9743" fg:w="18"/><text x="20.7112%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (7 samples, 0.01%)</title><rect x="20.4990%" y="1269" width="0.0147%" height="15" fill="rgb(246,65,34)" fg:x="9761" fg:w="7"/><text x="20.7490%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="20.5137%" y="1269" width="0.0105%" height="15" fill="rgb(231,100,33)" fg:x="9768" fg:w="5"/><text x="20.7637%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="20.5809%" y="1205" width="0.0168%" height="15" fill="rgb(228,126,14)" fg:x="9800" fg:w="8"/><text x="20.8309%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (8 samples, 0.02%)</title><rect x="20.6523%" y="1125" width="0.0168%" height="15" fill="rgb(215,173,21)" fg:x="9834" fg:w="8"/><text x="20.9023%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (8 samples, 0.02%)</title><rect x="20.6817%" y="1109" width="0.0168%" height="15" fill="rgb(210,6,40)" fg:x="9848" fg:w="8"/><text x="20.9317%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (29 samples, 0.06%)</title><rect x="20.6418%" y="1141" width="0.0609%" height="15" fill="rgb(212,48,18)" fg:x="9829" fg:w="29"/><text x="20.8918%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (16 samples, 0.03%)</title><rect x="20.6691%" y="1125" width="0.0336%" height="15" fill="rgb(230,214,11)" fg:x="9842" fg:w="16"/><text x="20.9191%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (35 samples, 0.07%)</title><rect x="20.6313%" y="1157" width="0.0735%" height="15" fill="rgb(254,105,39)" fg:x="9824" fg:w="35"/><text x="20.8813%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (49 samples, 0.10%)</title><rect x="20.6103%" y="1189" width="0.1029%" height="15" fill="rgb(245,158,5)" fg:x="9814" fg:w="49"/><text x="20.8603%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (47 samples, 0.10%)</title><rect x="20.6145%" y="1173" width="0.0987%" height="15" fill="rgb(249,208,11)" fg:x="9816" fg:w="47"/><text x="20.8645%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (59 samples, 0.12%)</title><rect x="20.5977%" y="1205" width="0.1239%" height="15" fill="rgb(210,39,28)" fg:x="9808" fg:w="59"/><text x="20.8477%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="20.7342%" y="1189" width="0.0126%" height="15" fill="rgb(211,56,53)" fg:x="9873" fg:w="6"/><text x="20.9842%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (94 samples, 0.20%)</title><rect x="20.5662%" y="1237" width="0.1974%" height="15" fill="rgb(226,201,30)" fg:x="9793" fg:w="94"/><text x="20.8162%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (93 samples, 0.20%)</title><rect x="20.5683%" y="1221" width="0.1953%" height="15" fill="rgb(239,101,34)" fg:x="9794" fg:w="93"/><text x="20.8183%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (15 samples, 0.03%)</title><rect x="20.7321%" y="1205" width="0.0315%" height="15" fill="rgb(226,209,5)" fg:x="9872" fg:w="15"/><text x="20.9821%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (111 samples, 0.23%)</title><rect x="20.5347%" y="1269" width="0.2331%" height="15" fill="rgb(250,105,47)" fg:x="9778" fg:w="111"/><text x="20.7847%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (102 samples, 0.21%)</title><rect x="20.5536%" y="1253" width="0.2142%" height="15" fill="rgb(230,72,3)" fg:x="9787" fg:w="102"/><text x="20.8036%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (26 samples, 0.05%)</title><rect x="20.7678%" y="1269" width="0.0546%" height="15" fill="rgb(232,218,39)" fg:x="9889" fg:w="26"/><text x="21.0178%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (15 samples, 0.03%)</title><rect x="20.7909%" y="1253" width="0.0315%" height="15" fill="rgb(248,166,6)" fg:x="9900" fg:w="15"/><text x="21.0409%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (6 samples, 0.01%)</title><rect x="20.8854%" y="1221" width="0.0126%" height="15" fill="rgb(247,89,20)" fg:x="9945" fg:w="6"/><text x="21.1354%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="20.8875%" y="1205" width="0.0105%" height="15" fill="rgb(248,130,54)" fg:x="9946" fg:w="5"/><text x="21.1375%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="20.8875%" y="1189" width="0.0105%" height="15" fill="rgb(234,196,4)" fg:x="9946" fg:w="5"/><text x="21.1375%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="20.9022%" y="1205" width="0.0126%" height="15" fill="rgb(250,143,31)" fg:x="9953" fg:w="6"/><text x="21.1522%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="20.9148%" y="1205" width="0.0105%" height="15" fill="rgb(211,110,34)" fg:x="9959" fg:w="5"/><text x="21.1648%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="20.9253%" y="1205" width="0.0147%" height="15" fill="rgb(215,124,48)" fg:x="9964" fg:w="7"/><text x="21.1753%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="20.9274%" y="1189" width="0.0126%" height="15" fill="rgb(216,46,13)" fg:x="9965" fg:w="6"/><text x="21.1774%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (48 samples, 0.10%)</title><rect x="20.8602%" y="1237" width="0.1008%" height="15" fill="rgb(205,184,25)" fg:x="9933" fg:w="48"/><text x="21.1102%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (30 samples, 0.06%)</title><rect x="20.8980%" y="1221" width="0.0630%" height="15" fill="rgb(228,1,10)" fg:x="9951" fg:w="30"/><text x="21.1480%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="20.9400%" y="1205" width="0.0210%" height="15" fill="rgb(213,116,27)" fg:x="9971" fg:w="10"/><text x="21.1900%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="20.9736%" y="1221" width="0.0147%" height="15" fill="rgb(241,95,50)" fg:x="9987" fg:w="7"/><text x="21.2236%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (8 samples, 0.02%)</title><rect x="20.9967%" y="1205" width="0.0168%" height="15" fill="rgb(238,48,32)" fg:x="9998" fg:w="8"/><text x="21.2467%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="21.0009%" y="1189" width="0.0126%" height="15" fill="rgb(235,113,49)" fg:x="10000" fg:w="6"/><text x="21.2509%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="21.0030%" y="1173" width="0.0105%" height="15" fill="rgb(205,127,43)" fg:x="10001" fg:w="5"/><text x="21.2530%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (9 samples, 0.02%)</title><rect x="20.9967%" y="1221" width="0.0189%" height="15" fill="rgb(250,162,2)" fg:x="9998" fg:w="9"/><text x="21.2467%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="21.0177%" y="1205" width="0.0126%" height="15" fill="rgb(220,13,41)" fg:x="10008" fg:w="6"/><text x="21.2677%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (11 samples, 0.02%)</title><rect x="21.0156%" y="1221" width="0.0231%" height="15" fill="rgb(249,221,25)" fg:x="10007" fg:w="11"/><text x="21.2656%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (5 samples, 0.01%)</title><rect x="21.0513%" y="1221" width="0.0105%" height="15" fill="rgb(215,208,19)" fg:x="10024" fg:w="5"/><text x="21.3013%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_type_modifiers (50 samples, 0.11%)</title><rect x="20.9610%" y="1237" width="0.1050%" height="15" fill="rgb(236,175,2)" fg:x="9981" fg:w="50"/><text x="21.2110%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (111 samples, 0.23%)</title><rect x="20.8371%" y="1253" width="0.2331%" height="15" fill="rgb(241,52,2)" fg:x="9922" fg:w="111"/><text x="21.0871%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (118 samples, 0.25%)</title><rect x="20.8287%" y="1269" width="0.2478%" height="15" fill="rgb(248,140,14)" fg:x="9918" fg:w="118"/><text x="21.0787%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="21.1038%" y="1253" width="0.0105%" height="15" fill="rgb(253,22,42)" fg:x="10049" fg:w="5"/><text x="21.3538%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_compound_field_access (11 samples, 0.02%)</title><rect x="21.1374%" y="1253" width="0.0231%" height="15" fill="rgb(234,61,47)" fg:x="10065" fg:w="11"/><text x="21.3874%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (10 samples, 0.02%)</title><rect x="21.2613%" y="1237" width="0.0210%" height="15" fill="rgb(208,226,15)" fg:x="10124" fg:w="10"/><text x="21.5113%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (6 samples, 0.01%)</title><rect x="21.2823%" y="1237" width="0.0126%" height="15" fill="rgb(217,221,4)" fg:x="10134" fg:w="6"/><text x="21.5323%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="21.3558%" y="1221" width="0.0399%" height="15" fill="rgb(212,174,34)" fg:x="10169" fg:w="19"/><text x="21.6058%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (14 samples, 0.03%)</title><rect x="21.3978%" y="1221" width="0.0294%" height="15" fill="rgb(253,83,4)" fg:x="10189" fg:w="14"/><text x="21.6478%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (23 samples, 0.05%)</title><rect x="21.4335%" y="1221" width="0.0483%" height="15" fill="rgb(250,195,49)" fg:x="10206" fg:w="23"/><text x="21.6835%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="21.4881%" y="1205" width="0.0105%" height="15" fill="rgb(241,192,25)" fg:x="10232" fg:w="5"/><text x="21.7381%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (16 samples, 0.03%)</title><rect x="21.4986%" y="1205" width="0.0336%" height="15" fill="rgb(208,124,10)" fg:x="10237" fg:w="16"/><text x="21.7486%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="21.5511%" y="1189" width="0.0105%" height="15" fill="rgb(222,33,0)" fg:x="10262" fg:w="5"/><text x="21.8011%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (32 samples, 0.07%)</title><rect x="21.5406%" y="1205" width="0.0672%" height="15" fill="rgb(234,209,28)" fg:x="10257" fg:w="32"/><text x="21.7906%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (21 samples, 0.04%)</title><rect x="21.5637%" y="1189" width="0.0441%" height="15" fill="rgb(224,11,23)" fg:x="10268" fg:w="21"/><text x="21.8137%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (18 samples, 0.04%)</title><rect x="21.5700%" y="1173" width="0.0378%" height="15" fill="rgb(232,99,1)" fg:x="10271" fg:w="18"/><text x="21.8200%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (17 samples, 0.04%)</title><rect x="21.5721%" y="1157" width="0.0357%" height="15" fill="rgb(237,95,45)" fg:x="10272" fg:w="17"/><text x="21.8221%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (15 samples, 0.03%)</title><rect x="21.5763%" y="1141" width="0.0315%" height="15" fill="rgb(208,109,11)" fg:x="10274" fg:w="15"/><text x="21.8263%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (17 samples, 0.04%)</title><rect x="21.6435%" y="1189" width="0.0357%" height="15" fill="rgb(216,190,48)" fg:x="10306" fg:w="17"/><text x="21.8935%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="21.6813%" y="1189" width="0.0105%" height="15" fill="rgb(251,171,36)" fg:x="10324" fg:w="5"/><text x="21.9313%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="21.6960%" y="1189" width="0.0105%" height="15" fill="rgb(230,62,22)" fg:x="10331" fg:w="5"/><text x="21.9460%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (11 samples, 0.02%)</title><rect x="21.7716%" y="1141" width="0.0231%" height="15" fill="rgb(225,114,35)" fg:x="10367" fg:w="11"/><text x="22.0216%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (7 samples, 0.01%)</title><rect x="21.8010%" y="1125" width="0.0147%" height="15" fill="rgb(215,118,42)" fg:x="10381" fg:w="7"/><text x="22.0510%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="21.8052%" y="1109" width="0.0105%" height="15" fill="rgb(243,119,21)" fg:x="10383" fg:w="5"/><text x="22.0552%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (14 samples, 0.03%)</title><rect x="21.7947%" y="1141" width="0.0294%" height="15" fill="rgb(252,177,53)" fg:x="10378" fg:w="14"/><text x="22.0447%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="21.8892%" y="1013" width="0.0105%" height="15" fill="rgb(237,209,29)" fg:x="10423" fg:w="5"/><text x="22.1392%" y="1023.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (11 samples, 0.02%)</title><rect x="21.8850%" y="1029" width="0.0231%" height="15" fill="rgb(212,65,23)" fg:x="10421" fg:w="11"/><text x="22.1350%" y="1039.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (15 samples, 0.03%)</title><rect x="21.8808%" y="1045" width="0.0315%" height="15" fill="rgb(230,222,46)" fg:x="10419" fg:w="15"/><text x="22.1308%" y="1055.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (21 samples, 0.04%)</title><rect x="21.8703%" y="1061" width="0.0441%" height="15" fill="rgb(215,135,32)" fg:x="10414" fg:w="21"/><text x="22.1203%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (34 samples, 0.07%)</title><rect x="21.8514%" y="1109" width="0.0714%" height="15" fill="rgb(246,101,22)" fg:x="10405" fg:w="34"/><text x="22.1014%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (32 samples, 0.07%)</title><rect x="21.8556%" y="1093" width="0.0672%" height="15" fill="rgb(206,107,13)" fg:x="10407" fg:w="32"/><text x="22.1056%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (27 samples, 0.06%)</title><rect x="21.8661%" y="1077" width="0.0567%" height="15" fill="rgb(250,100,44)" fg:x="10412" fg:w="27"/><text x="22.1161%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (63 samples, 0.13%)</title><rect x="21.8241%" y="1141" width="0.1323%" height="15" fill="rgb(231,147,38)" fg:x="10392" fg:w="63"/><text x="22.0741%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (60 samples, 0.13%)</title><rect x="21.8304%" y="1125" width="0.1260%" height="15" fill="rgb(229,8,40)" fg:x="10395" fg:w="60"/><text x="22.0804%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (12 samples, 0.03%)</title><rect x="21.9312%" y="1109" width="0.0252%" height="15" fill="rgb(221,135,30)" fg:x="10443" fg:w="12"/><text x="22.1812%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (106 samples, 0.22%)</title><rect x="21.7359%" y="1173" width="0.2226%" height="15" fill="rgb(249,193,18)" fg:x="10350" fg:w="106"/><text x="21.9859%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (97 samples, 0.20%)</title><rect x="21.7548%" y="1157" width="0.2037%" height="15" fill="rgb(209,133,39)" fg:x="10359" fg:w="97"/><text x="22.0048%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_named_arg_operator (117 samples, 0.25%)</title><rect x="21.7149%" y="1189" width="0.2457%" height="15" fill="rgb(232,100,14)" fg:x="10340" fg:w="117"/><text x="21.9649%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="21.9816%" y="1173" width="0.0168%" height="15" fill="rgb(224,185,1)" fg:x="10467" fg:w="8"/><text x="22.2316%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="22.0005%" y="1157" width="0.0126%" height="15" fill="rgb(223,139,8)" fg:x="10476" fg:w="6"/><text x="22.2505%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="21.9984%" y="1173" width="0.0189%" height="15" fill="rgb(232,213,38)" fg:x="10475" fg:w="9"/><text x="22.2484%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (31 samples, 0.07%)</title><rect x="21.9606%" y="1189" width="0.0651%" height="15" fill="rgb(207,94,22)" fg:x="10457" fg:w="31"/><text x="22.2106%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="22.0425%" y="1173" width="0.0168%" height="15" fill="rgb(219,183,54)" fg:x="10496" fg:w="8"/><text x="22.2925%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="22.0698%" y="1157" width="0.0126%" height="15" fill="rgb(216,185,54)" fg:x="10509" fg:w="6"/><text x="22.3198%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (14 samples, 0.03%)</title><rect x="22.0593%" y="1173" width="0.0294%" height="15" fill="rgb(254,217,39)" fg:x="10504" fg:w="14"/><text x="22.3093%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="22.1266%" y="1157" width="0.0105%" height="15" fill="rgb(240,178,23)" fg:x="10536" fg:w="5"/><text x="22.3766%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (17 samples, 0.04%)</title><rect x="22.1392%" y="1157" width="0.0357%" height="15" fill="rgb(218,11,47)" fg:x="10542" fg:w="17"/><text x="22.3892%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (11 samples, 0.02%)</title><rect x="22.1812%" y="1157" width="0.0231%" height="15" fill="rgb(218,51,51)" fg:x="10562" fg:w="11"/><text x="22.4312%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (9 samples, 0.02%)</title><rect x="22.1854%" y="1141" width="0.0189%" height="15" fill="rgb(238,126,27)" fg:x="10564" fg:w="9"/><text x="22.4354%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (8 samples, 0.02%)</title><rect x="22.2064%" y="1157" width="0.0168%" height="15" fill="rgb(249,202,22)" fg:x="10574" fg:w="8"/><text x="22.4564%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="22.2694%" y="1141" width="0.0105%" height="15" fill="rgb(254,195,49)" fg:x="10604" fg:w="5"/><text x="22.5194%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="22.2799%" y="1141" width="0.0147%" height="15" fill="rgb(208,123,14)" fg:x="10609" fg:w="7"/><text x="22.5299%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="22.4143%" y="981" width="0.0147%" height="15" fill="rgb(224,200,8)" fg:x="10673" fg:w="7"/><text x="22.6643%" y="991.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (15 samples, 0.03%)</title><rect x="22.4080%" y="997" width="0.0315%" height="15" fill="rgb(217,61,36)" fg:x="10670" fg:w="15"/><text x="22.6580%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (33 samples, 0.07%)</title><rect x="22.3912%" y="1013" width="0.0693%" height="15" fill="rgb(206,35,45)" fg:x="10662" fg:w="33"/><text x="22.6412%" y="1023.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (10 samples, 0.02%)</title><rect x="22.4395%" y="997" width="0.0210%" height="15" fill="rgb(217,65,33)" fg:x="10685" fg:w="10"/><text x="22.6895%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (37 samples, 0.08%)</title><rect x="22.3891%" y="1029" width="0.0777%" height="15" fill="rgb(222,158,48)" fg:x="10661" fg:w="37"/><text x="22.6391%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (46 samples, 0.10%)</title><rect x="22.3765%" y="1061" width="0.0966%" height="15" fill="rgb(254,2,54)" fg:x="10655" fg:w="46"/><text x="22.6265%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (42 samples, 0.09%)</title><rect x="22.3849%" y="1045" width="0.0882%" height="15" fill="rgb(250,143,38)" fg:x="10659" fg:w="42"/><text x="22.6349%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (48 samples, 0.10%)</title><rect x="22.3744%" y="1077" width="0.1008%" height="15" fill="rgb(248,25,0)" fg:x="10654" fg:w="48"/><text x="22.6244%" y="1087.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="22.5046%" y="1061" width="0.0105%" height="15" fill="rgb(206,152,27)" fg:x="10716" fg:w="5"/><text x="22.7546%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (79 samples, 0.17%)</title><rect x="22.3597%" y="1109" width="0.1659%" height="15" fill="rgb(240,77,30)" fg:x="10647" fg:w="79"/><text x="22.6097%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (78 samples, 0.16%)</title><rect x="22.3618%" y="1093" width="0.1638%" height="15" fill="rgb(231,5,3)" fg:x="10648" fg:w="78"/><text x="22.6118%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (19 samples, 0.04%)</title><rect x="22.4857%" y="1077" width="0.0399%" height="15" fill="rgb(207,226,32)" fg:x="10707" fg:w="19"/><text x="22.7357%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (102 samples, 0.21%)</title><rect x="22.3135%" y="1141" width="0.2142%" height="15" fill="rgb(222,207,47)" fg:x="10625" fg:w="102"/><text x="22.5635%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (94 samples, 0.20%)</title><rect x="22.3303%" y="1125" width="0.1974%" height="15" fill="rgb(229,115,45)" fg:x="10633" fg:w="94"/><text x="22.5803%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="22.5361%" y="1125" width="0.0231%" height="15" fill="rgb(224,191,6)" fg:x="10731" fg:w="11"/><text x="22.7861%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (19 samples, 0.04%)</title><rect x="22.5277%" y="1141" width="0.0399%" height="15" fill="rgb(230,227,24)" fg:x="10727" fg:w="19"/><text x="22.7777%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="22.6327%" y="1077" width="0.0126%" height="15" fill="rgb(228,80,19)" fg:x="10777" fg:w="6"/><text x="22.8827%" y="1087.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="22.6453%" y="1077" width="0.0147%" height="15" fill="rgb(247,229,0)" fg:x="10783" fg:w="7"/><text x="22.8953%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="22.6600%" y="1077" width="0.0105%" height="15" fill="rgb(237,194,15)" fg:x="10790" fg:w="5"/><text x="22.9100%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="22.6705%" y="1077" width="0.0210%" height="15" fill="rgb(219,203,20)" fg:x="10795" fg:w="10"/><text x="22.9205%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (46 samples, 0.10%)</title><rect x="22.5991%" y="1109" width="0.0966%" height="15" fill="rgb(234,128,8)" fg:x="10761" fg:w="46"/><text x="22.8491%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (38 samples, 0.08%)</title><rect x="22.6159%" y="1093" width="0.0798%" height="15" fill="rgb(248,202,8)" fg:x="10769" fg:w="38"/><text x="22.8659%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (64 samples, 0.13%)</title><rect x="22.5739%" y="1125" width="0.1344%" height="15" fill="rgb(206,104,37)" fg:x="10749" fg:w="64"/><text x="22.8239%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (69 samples, 0.14%)</title><rect x="22.5676%" y="1141" width="0.1449%" height="15" fill="rgb(223,8,27)" fg:x="10746" fg:w="69"/><text x="22.8176%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="22.7209%" y="1125" width="0.0168%" height="15" fill="rgb(216,217,28)" fg:x="10819" fg:w="8"/><text x="22.9709%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (18 samples, 0.04%)</title><rect x="22.7125%" y="1141" width="0.0378%" height="15" fill="rgb(249,199,1)" fg:x="10815" fg:w="18"/><text x="22.9625%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_parse (7 samples, 0.01%)</title><rect x="22.7503%" y="1141" width="0.0147%" height="15" fill="rgb(240,85,17)" fg:x="10833" fg:w="7"/><text x="23.0003%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (259 samples, 0.54%)</title><rect x="22.2232%" y="1157" width="0.5439%" height="15" fill="rgb(206,108,45)" fg:x="10582" fg:w="259"/><text x="22.4732%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_args (554 samples, 1.16%)</title><rect x="21.6078%" y="1205" width="1.1635%" height="15" fill="rgb(245,210,41)" fg:x="10289" fg:w="554"/><text x="21.8578%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (354 samples, 0.74%)</title><rect x="22.0278%" y="1189" width="0.7434%" height="15" fill="rgb(206,13,37)" fg:x="10489" fg:w="354"/><text x="22.2778%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (318 samples, 0.67%)</title><rect x="22.1035%" y="1173" width="0.6678%" height="15" fill="rgb(250,61,18)" fg:x="10525" fg:w="318"/><text x="22.3535%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (616 samples, 1.29%)</title><rect x="21.4839%" y="1221" width="1.2937%" height="15" fill="rgb(235,172,48)" fg:x="10230" fg:w="616"/><text x="21.7339%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_argument_list (706 samples, 1.48%)</title><rect x="21.2991%" y="1237" width="1.4827%" height="15" fill="rgb(249,201,17)" fg:x="10142" fg:w="706"/><text x="21.5491%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_json_null_clause (10 samples, 0.02%)</title><rect x="22.7818%" y="1237" width="0.0210%" height="15" fill="rgb(219,208,6)" fg:x="10848" fg:w="10"/><text x="23.0318%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_call (781 samples, 1.64%)</title><rect x="21.1647%" y="1253" width="1.6402%" height="15" fill="rgb(248,31,23)" fg:x="10078" fg:w="781"/><text x="21.4147%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (824 samples, 1.73%)</title><rect x="21.0786%" y="1269" width="1.7305%" height="15" fill="rgb(245,15,42)" fg:x="10037" fg:w="824"/><text x="21.3286%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (1,166 samples, 2.45%)</title><rect x="20.3730%" y="1285" width="2.4487%" height="15" fill="rgb(222,217,39)" fg:x="9701" fg:w="1166"/><text x="20.6230%" y="1295.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select_item (1,371 samples, 2.88%)</title><rect x="19.9530%" y="1333" width="2.8792%" height="15" fill="rgb(210,219,27)" fg:x="9501" fg:w="1371"/><text x="20.2030%" y="1343.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (1,283 samples, 2.69%)</title><rect x="20.1378%" y="1317" width="2.6944%" height="15" fill="rgb(252,166,36)" fg:x="9589" fg:w="1283"/><text x="20.3878%" y="1327.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,236 samples, 2.60%)</title><rect x="20.2365%" y="1301" width="2.5957%" height="15" fill="rgb(245,132,34)" fg:x="9636" fg:w="1236"/><text x="20.4865%" y="1311.50">sq..</text></g><g><title>libsystem_malloc.dylib`_free (19 samples, 0.04%)</title><rect x="22.9477%" y="1317" width="0.0399%" height="15" fill="rgb(236,54,3)" fg:x="10927" fg:w="19"/><text x="23.1977%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (20 samples, 0.04%)</title><rect x="22.9876%" y="1317" width="0.0420%" height="15" fill="rgb(241,173,43)" fg:x="10946" fg:w="20"/><text x="23.2376%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (50 samples, 0.11%)</title><rect x="23.0296%" y="1317" width="0.1050%" height="15" fill="rgb(215,190,9)" fg:x="10966" fg:w="50"/><text x="23.2796%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;T as core::any::Any&gt;::type_id (12 samples, 0.03%)</title><rect x="23.1346%" y="1317" width="0.0252%" height="15" fill="rgb(242,101,16)" fg:x="11016" fg:w="12"/><text x="23.3846%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="23.1598%" y="1317" width="0.0105%" height="15" fill="rgb(223,190,21)" fg:x="11028" fg:w="5"/><text x="23.4098%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (8 samples, 0.02%)</title><rect x="23.1787%" y="1301" width="0.0168%" height="15" fill="rgb(215,228,25)" fg:x="11037" fg:w="8"/><text x="23.4287%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="23.1955%" y="1301" width="0.0315%" height="15" fill="rgb(225,36,22)" fg:x="11045" fg:w="15"/><text x="23.4455%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="23.2270%" y="1301" width="0.0252%" height="15" fill="rgb(251,106,46)" fg:x="11060" fg:w="12"/><text x="23.4770%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (8 samples, 0.02%)</title><rect x="23.2354%" y="1285" width="0.0168%" height="15" fill="rgb(208,90,1)" fg:x="11064" fg:w="8"/><text x="23.4854%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (41 samples, 0.09%)</title><rect x="23.1703%" y="1317" width="0.0861%" height="15" fill="rgb(243,10,4)" fg:x="11033" fg:w="41"/><text x="23.4203%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (7 samples, 0.01%)</title><rect x="23.2564%" y="1317" width="0.0147%" height="15" fill="rgb(212,137,27)" fg:x="11074" fg:w="7"/><text x="23.5064%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="23.2711%" y="1317" width="0.0126%" height="15" fill="rgb(231,220,49)" fg:x="11081" fg:w="6"/><text x="23.5211%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (17 samples, 0.04%)</title><rect x="23.2837%" y="1317" width="0.0357%" height="15" fill="rgb(237,96,20)" fg:x="11087" fg:w="17"/><text x="23.5337%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (15 samples, 0.03%)</title><rect x="23.2879%" y="1301" width="0.0315%" height="15" fill="rgb(239,229,30)" fg:x="11089" fg:w="15"/><text x="23.5379%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="23.3089%" y="1285" width="0.0105%" height="15" fill="rgb(219,65,33)" fg:x="11099" fg:w="5"/><text x="23.5589%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (22 samples, 0.05%)</title><rect x="23.3215%" y="1317" width="0.0462%" height="15" fill="rgb(243,134,7)" fg:x="11105" fg:w="22"/><text x="23.5715%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_join_constraint (31 samples, 0.07%)</title><rect x="23.3824%" y="1317" width="0.0651%" height="15" fill="rgb(216,177,54)" fg:x="11134" fg:w="31"/><text x="23.6324%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_parenthesized_column_list (21 samples, 0.04%)</title><rect x="23.4034%" y="1301" width="0.0441%" height="15" fill="rgb(211,160,20)" fg:x="11144" fg:w="21"/><text x="23.6534%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (9 samples, 0.02%)</title><rect x="23.4286%" y="1285" width="0.0189%" height="15" fill="rgb(239,85,39)" fg:x="11156" fg:w="9"/><text x="23.6786%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (15 samples, 0.03%)</title><rect x="23.4475%" y="1317" width="0.0315%" height="15" fill="rgb(232,125,22)" fg:x="11165" fg:w="15"/><text x="23.6975%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keywords (10 samples, 0.02%)</title><rect x="23.4790%" y="1317" width="0.0210%" height="15" fill="rgb(244,57,34)" fg:x="11180" fg:w="10"/><text x="23.7290%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (6 samples, 0.01%)</title><rect x="23.5000%" y="1317" width="0.0126%" height="15" fill="rgb(214,203,32)" fg:x="11190" fg:w="6"/><text x="23.7500%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_one_of_keywords (9 samples, 0.02%)</title><rect x="23.5126%" y="1317" width="0.0189%" height="15" fill="rgb(207,58,43)" fg:x="11196" fg:w="9"/><text x="23.7626%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (37 samples, 0.08%)</title><rect x="23.7121%" y="1301" width="0.0777%" height="15" fill="rgb(215,193,15)" fg:x="11291" fg:w="37"/><text x="23.9621%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (6 samples, 0.01%)</title><rect x="23.8024%" y="1301" width="0.0126%" height="15" fill="rgb(232,15,44)" fg:x="11334" fg:w="6"/><text x="24.0524%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (9 samples, 0.02%)</title><rect x="23.8150%" y="1301" width="0.0189%" height="15" fill="rgb(212,3,48)" fg:x="11340" fg:w="9"/><text x="24.0650%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::consume_token (24 samples, 0.05%)</title><rect x="23.8339%" y="1301" width="0.0504%" height="15" fill="rgb(218,128,7)" fg:x="11349" fg:w="24"/><text x="24.0839%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (8 samples, 0.02%)</title><rect x="23.8675%" y="1285" width="0.0168%" height="15" fill="rgb(226,216,39)" fg:x="11365" fg:w="8"/><text x="24.1175%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::maybe_parse_table_sample (12 samples, 0.03%)</title><rect x="23.8843%" y="1301" width="0.0252%" height="15" fill="rgb(243,47,51)" fg:x="11373" fg:w="12"/><text x="24.1343%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="23.9410%" y="1285" width="0.0126%" height="15" fill="rgb(241,183,40)" fg:x="11400" fg:w="6"/><text x="24.1910%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (32 samples, 0.07%)</title><rect x="23.9809%" y="1285" width="0.0672%" height="15" fill="rgb(231,217,32)" fg:x="11419" fg:w="32"/><text x="24.2309%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (27 samples, 0.06%)</title><rect x="23.9914%" y="1269" width="0.0567%" height="15" fill="rgb(229,61,38)" fg:x="11424" fg:w="27"/><text x="24.2414%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (25 samples, 0.05%)</title><rect x="23.9956%" y="1253" width="0.0525%" height="15" fill="rgb(225,210,5)" fg:x="11426" fg:w="25"/><text x="24.2456%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_allocate_outlined (14 samples, 0.03%)</title><rect x="24.0187%" y="1237" width="0.0294%" height="15" fill="rgb(231,79,45)" fg:x="11437" fg:w="14"/><text x="24.2687%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="24.0481%" y="1285" width="0.0126%" height="15" fill="rgb(224,100,7)" fg:x="11451" fg:w="6"/><text x="24.2981%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="24.0922%" y="1269" width="0.0105%" height="15" fill="rgb(241,198,18)" fg:x="11472" fg:w="5"/><text x="24.3422%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (14 samples, 0.03%)</title><rect x="24.1027%" y="1269" width="0.0294%" height="15" fill="rgb(252,97,53)" fg:x="11477" fg:w="14"/><text x="24.3527%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (19 samples, 0.04%)</title><rect x="24.1384%" y="1269" width="0.0399%" height="15" fill="rgb(220,88,7)" fg:x="11494" fg:w="19"/><text x="24.3884%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (13 samples, 0.03%)</title><rect x="24.1510%" y="1253" width="0.0273%" height="15" fill="rgb(213,176,14)" fg:x="11500" fg:w="13"/><text x="24.4010%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="24.1867%" y="1253" width="0.0126%" height="15" fill="rgb(246,73,7)" fg:x="11517" fg:w="6"/><text x="24.4367%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="24.1993%" y="1253" width="0.0126%" height="15" fill="rgb(245,64,36)" fg:x="11523" fg:w="6"/><text x="24.4493%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="24.2119%" y="1253" width="0.0273%" height="15" fill="rgb(245,80,10)" fg:x="11529" fg:w="13"/><text x="24.4619%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="24.2245%" y="1237" width="0.0147%" height="15" fill="rgb(232,107,50)" fg:x="11535" fg:w="7"/><text x="24.4745%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (34 samples, 0.07%)</title><rect x="24.1783%" y="1269" width="0.0714%" height="15" fill="rgb(253,3,0)" fg:x="11513" fg:w="34"/><text x="24.4283%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (170 samples, 0.36%)</title><rect x="23.9095%" y="1301" width="0.3570%" height="15" fill="rgb(212,99,53)" fg:x="11385" fg:w="170"/><text x="24.1595%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (98 samples, 0.21%)</title><rect x="24.0607%" y="1285" width="0.2058%" height="15" fill="rgb(249,111,54)" fg:x="11457" fg:w="98"/><text x="24.3107%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="24.2791%" y="1285" width="0.0126%" height="15" fill="rgb(249,55,30)" fg:x="11561" fg:w="6"/><text x="24.5291%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="24.3883%" y="1269" width="0.0252%" height="15" fill="rgb(237,47,42)" fg:x="11613" fg:w="12"/><text x="24.6383%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="24.4135%" y="1269" width="0.0105%" height="15" fill="rgb(211,20,18)" fg:x="11625" fg:w="5"/><text x="24.6635%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (9 samples, 0.02%)</title><rect x="24.4283%" y="1253" width="0.0189%" height="15" fill="rgb(231,203,46)" fg:x="11632" fg:w="9"/><text x="24.6783%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="24.4493%" y="1253" width="0.0168%" height="15" fill="rgb(237,142,3)" fg:x="11642" fg:w="8"/><text x="24.6993%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (14 samples, 0.03%)</title><rect x="24.4661%" y="1253" width="0.0294%" height="15" fill="rgb(241,107,1)" fg:x="11650" fg:w="14"/><text x="24.7161%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (8 samples, 0.02%)</title><rect x="24.4787%" y="1237" width="0.0168%" height="15" fill="rgb(229,83,13)" fg:x="11656" fg:w="8"/><text x="24.7287%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_table_alias (111 samples, 0.23%)</title><rect x="24.2686%" y="1301" width="0.2331%" height="15" fill="rgb(241,91,40)" fg:x="11556" fg:w="111"/><text x="24.5186%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_alias (95 samples, 0.20%)</title><rect x="24.3022%" y="1285" width="0.1995%" height="15" fill="rgb(225,3,45)" fg:x="11572" fg:w="95"/><text x="24.5522%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (37 samples, 0.08%)</title><rect x="24.4241%" y="1269" width="0.0777%" height="15" fill="rgb(244,223,14)" fg:x="11630" fg:w="37"/><text x="24.6741%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="24.5375%" y="1269" width="0.0147%" height="15" fill="rgb(224,124,37)" fg:x="11684" fg:w="7"/><text x="24.7875%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="24.5522%" y="1269" width="0.0252%" height="15" fill="rgb(251,171,30)" fg:x="11691" fg:w="12"/><text x="24.8022%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (10 samples, 0.02%)</title><rect x="24.5564%" y="1253" width="0.0210%" height="15" fill="rgb(236,46,54)" fg:x="11693" fg:w="10"/><text x="24.8064%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (40 samples, 0.08%)</title><rect x="24.5081%" y="1301" width="0.0840%" height="15" fill="rgb(245,213,5)" fg:x="11670" fg:w="40"/><text x="24.7581%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (33 samples, 0.07%)</title><rect x="24.5228%" y="1285" width="0.0693%" height="15" fill="rgb(230,144,27)" fg:x="11677" fg:w="33"/><text x="24.7728%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="24.8273%" y="1285" width="0.0105%" height="15" fill="rgb(220,86,6)" fg:x="11822" fg:w="5"/><text x="25.0773%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (12 samples, 0.03%)</title><rect x="24.8693%" y="1269" width="0.0252%" height="15" fill="rgb(240,20,13)" fg:x="11842" fg:w="12"/><text x="25.1193%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (24 samples, 0.05%)</title><rect x="24.8966%" y="1269" width="0.0504%" height="15" fill="rgb(217,89,34)" fg:x="11855" fg:w="24"/><text x="25.1466%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (22 samples, 0.05%)</title><rect x="24.9470%" y="1269" width="0.0462%" height="15" fill="rgb(229,13,5)" fg:x="11879" fg:w="22"/><text x="25.1970%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (19 samples, 0.04%)</title><rect x="24.9533%" y="1253" width="0.0399%" height="15" fill="rgb(244,67,35)" fg:x="11882" fg:w="19"/><text x="25.2033%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_factor (711 samples, 1.49%)</title><rect x="23.5357%" y="1317" width="1.4932%" height="15" fill="rgb(221,40,2)" fg:x="11207" fg:w="711"/><text x="23.7857%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_tokens (208 samples, 0.44%)</title><rect x="24.5921%" y="1301" width="0.4368%" height="15" fill="rgb(237,157,21)" fg:x="11710" fg:w="208"/><text x="24.8421%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (91 samples, 0.19%)</title><rect x="24.8378%" y="1285" width="0.1911%" height="15" fill="rgb(222,94,11)" fg:x="11827" fg:w="91"/><text x="25.0878%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (10 samples, 0.02%)</title><rect x="25.0079%" y="1269" width="0.0210%" height="15" fill="rgb(249,113,6)" fg:x="11908" fg:w="10"/><text x="25.2579%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_and_joins (1,055 samples, 2.22%)</title><rect x="22.8322%" y="1333" width="2.2156%" height="15" fill="rgb(238,137,36)" fg:x="10872" fg:w="1055"/><text x="23.0822%" y="1343.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_tokens (7 samples, 0.01%)</title><rect x="25.0331%" y="1317" width="0.0147%" height="15" fill="rgb(210,102,26)" fg:x="11920" fg:w="7"/><text x="25.2831%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (2,821 samples, 5.92%)</title><rect x="19.1444%" y="1349" width="5.9244%" height="15" fill="rgb(218,30,30)" fg:x="9116" fg:w="2821"/><text x="19.3944%" y="1359.50">sqlparse..</text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (15 samples, 0.03%)</title><rect x="25.1738%" y="1333" width="0.0315%" height="15" fill="rgb(214,67,26)" fg:x="11987" fg:w="15"/><text x="25.4238%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (73 samples, 0.15%)</title><rect x="25.2242%" y="1333" width="0.1533%" height="15" fill="rgb(251,9,53)" fg:x="12011" fg:w="73"/><text x="25.4742%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (8 samples, 0.02%)</title><rect x="25.3880%" y="1333" width="0.0168%" height="15" fill="rgb(228,204,25)" fg:x="12089" fg:w="8"/><text x="25.6380%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (6 samples, 0.01%)</title><rect x="25.4132%" y="1333" width="0.0126%" height="15" fill="rgb(207,153,8)" fg:x="12101" fg:w="6"/><text x="25.6632%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="25.4447%" y="1317" width="0.0147%" height="15" fill="rgb(242,9,16)" fg:x="12116" fg:w="7"/><text x="25.6947%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="25.4888%" y="1285" width="0.0105%" height="15" fill="rgb(217,211,10)" fg:x="12137" fg:w="5"/><text x="25.7388%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (36 samples, 0.08%)</title><rect x="25.4258%" y="1333" width="0.0756%" height="15" fill="rgb(219,228,52)" fg:x="12107" fg:w="36"/><text x="25.6758%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (19 samples, 0.04%)</title><rect x="25.4615%" y="1317" width="0.0399%" height="15" fill="rgb(231,92,29)" fg:x="12124" fg:w="19"/><text x="25.7115%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="25.4804%" y="1301" width="0.0210%" height="15" fill="rgb(232,8,23)" fg:x="12133" fg:w="10"/><text x="25.7304%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`rack_get_thread_index (10 samples, 0.02%)</title><rect x="25.5623%" y="1301" width="0.0210%" height="15" fill="rgb(216,211,34)" fg:x="12172" fg:w="10"/><text x="25.8123%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (8 samples, 0.02%)</title><rect x="25.5833%" y="1301" width="0.0168%" height="15" fill="rgb(236,151,0)" fg:x="12182" fg:w="8"/><text x="25.8333%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`set_tiny_meta_header_in_use (18 samples, 0.04%)</title><rect x="25.6358%" y="1285" width="0.0378%" height="15" fill="rgb(209,168,3)" fg:x="12207" fg:w="18"/><text x="25.8858%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (129 samples, 0.27%)</title><rect x="25.5287%" y="1317" width="0.2709%" height="15" fill="rgb(208,129,28)" fg:x="12156" fg:w="129"/><text x="25.7787%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (95 samples, 0.20%)</title><rect x="25.6001%" y="1301" width="0.1995%" height="15" fill="rgb(229,78,22)" fg:x="12190" fg:w="95"/><text x="25.8501%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (59 samples, 0.12%)</title><rect x="25.6757%" y="1285" width="0.1239%" height="15" fill="rgb(228,187,13)" fg:x="12226" fg:w="59"/><text x="25.9257%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (8 samples, 0.02%)</title><rect x="25.7828%" y="1269" width="0.0168%" height="15" fill="rgb(240,119,24)" fg:x="12277" fg:w="8"/><text x="26.0328%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (5 samples, 0.01%)</title><rect x="25.7996%" y="1317" width="0.0105%" height="15" fill="rgb(209,194,42)" fg:x="12285" fg:w="5"/><text x="26.0496%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="25.8101%" y="1317" width="0.0399%" height="15" fill="rgb(247,200,46)" fg:x="12290" fg:w="19"/><text x="26.0601%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="25.8500%" y="1317" width="0.0126%" height="15" fill="rgb(218,76,16)" fg:x="12309" fg:w="6"/><text x="26.1000%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="25.9340%" y="1301" width="0.0105%" height="15" fill="rgb(225,21,48)" fg:x="12349" fg:w="5"/><text x="26.1840%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (83 samples, 0.17%)</title><rect x="25.9529%" y="1301" width="0.1743%" height="15" fill="rgb(239,223,50)" fg:x="12358" fg:w="83"/><text x="26.2029%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="26.1356%" y="1301" width="0.0126%" height="15" fill="rgb(244,45,21)" fg:x="12445" fg:w="6"/><text x="26.3856%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (6 samples, 0.01%)</title><rect x="26.1545%" y="1301" width="0.0126%" height="15" fill="rgb(232,33,43)" fg:x="12454" fg:w="6"/><text x="26.4045%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="26.1902%" y="1285" width="0.0189%" height="15" fill="rgb(209,8,3)" fg:x="12471" fg:w="9"/><text x="26.4402%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="26.2091%" y="1285" width="0.0105%" height="15" fill="rgb(214,25,53)" fg:x="12480" fg:w="5"/><text x="26.4591%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (39 samples, 0.08%)</title><rect x="26.1671%" y="1301" width="0.0819%" height="15" fill="rgb(254,186,54)" fg:x="12460" fg:w="39"/><text x="26.4171%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (14 samples, 0.03%)</title><rect x="26.2196%" y="1285" width="0.0294%" height="15" fill="rgb(208,174,49)" fg:x="12485" fg:w="14"/><text x="26.4696%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="26.2280%" y="1269" width="0.0210%" height="15" fill="rgb(233,191,51)" fg:x="12489" fg:w="10"/><text x="26.4780%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`set_tiny_meta_header_in_use (8 samples, 0.02%)</title><rect x="26.3120%" y="1253" width="0.0168%" height="15" fill="rgb(222,134,10)" fg:x="12529" fg:w="8"/><text x="26.5620%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (50 samples, 0.11%)</title><rect x="26.2868%" y="1285" width="0.1050%" height="15" fill="rgb(230,226,20)" fg:x="12517" fg:w="50"/><text x="26.5368%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (42 samples, 0.09%)</title><rect x="26.3036%" y="1269" width="0.0882%" height="15" fill="rgb(251,111,25)" fg:x="12525" fg:w="42"/><text x="26.5536%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (30 samples, 0.06%)</title><rect x="26.3288%" y="1253" width="0.0630%" height="15" fill="rgb(224,40,46)" fg:x="12537" fg:w="30"/><text x="26.5788%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="26.3960%" y="1285" width="0.0126%" height="15" fill="rgb(236,108,47)" fg:x="12569" fg:w="6"/><text x="26.6460%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="26.4338%" y="1269" width="0.0126%" height="15" fill="rgb(234,93,0)" fg:x="12587" fg:w="6"/><text x="26.6838%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="26.4485%" y="1269" width="0.0399%" height="15" fill="rgb(224,213,32)" fg:x="12594" fg:w="19"/><text x="26.6985%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="26.5157%" y="1221" width="0.0105%" height="15" fill="rgb(251,11,48)" fg:x="12626" fg:w="5"/><text x="26.7657%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (16 samples, 0.03%)</title><rect x="26.4947%" y="1269" width="0.0336%" height="15" fill="rgb(236,173,5)" fg:x="12616" fg:w="16"/><text x="26.7447%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (12 samples, 0.03%)</title><rect x="26.5031%" y="1253" width="0.0252%" height="15" fill="rgb(230,95,12)" fg:x="12620" fg:w="12"/><text x="26.7531%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="26.5073%" y="1237" width="0.0210%" height="15" fill="rgb(232,209,1)" fg:x="12622" fg:w="10"/><text x="26.7573%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="26.5829%" y="1237" width="0.0105%" height="15" fill="rgb(232,6,1)" fg:x="12658" fg:w="5"/><text x="26.8329%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (6 samples, 0.01%)</title><rect x="26.6228%" y="1221" width="0.0126%" height="15" fill="rgb(210,224,50)" fg:x="12677" fg:w="6"/><text x="26.8728%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (16 samples, 0.03%)</title><rect x="26.6795%" y="1189" width="0.0336%" height="15" fill="rgb(228,127,35)" fg:x="12704" fg:w="16"/><text x="26.9295%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="26.7131%" y="1189" width="0.0273%" height="15" fill="rgb(245,102,45)" fg:x="12720" fg:w="13"/><text x="26.9631%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (9 samples, 0.02%)</title><rect x="26.7215%" y="1173" width="0.0189%" height="15" fill="rgb(214,1,49)" fg:x="12724" fg:w="9"/><text x="26.9715%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="26.7278%" y="1157" width="0.0126%" height="15" fill="rgb(226,163,40)" fg:x="12727" fg:w="6"/><text x="26.9778%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="26.7278%" y="1141" width="0.0126%" height="15" fill="rgb(239,212,28)" fg:x="12727" fg:w="6"/><text x="26.9778%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (8 samples, 0.02%)</title><rect x="26.7951%" y="1077" width="0.0168%" height="15" fill="rgb(220,20,13)" fg:x="12759" fg:w="8"/><text x="27.0451%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (19 samples, 0.04%)</title><rect x="26.7825%" y="1093" width="0.0399%" height="15" fill="rgb(210,164,35)" fg:x="12753" fg:w="19"/><text x="27.0325%" y="1103.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="26.8119%" y="1077" width="0.0105%" height="15" fill="rgb(248,109,41)" fg:x="12767" fg:w="5"/><text x="27.0619%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (23 samples, 0.05%)</title><rect x="26.7783%" y="1109" width="0.0483%" height="15" fill="rgb(238,23,50)" fg:x="12751" fg:w="23"/><text x="27.0283%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (30 samples, 0.06%)</title><rect x="26.7678%" y="1141" width="0.0630%" height="15" fill="rgb(211,48,49)" fg:x="12746" fg:w="30"/><text x="27.0178%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (29 samples, 0.06%)</title><rect x="26.7699%" y="1125" width="0.0609%" height="15" fill="rgb(223,36,21)" fg:x="12747" fg:w="29"/><text x="27.0199%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (35 samples, 0.07%)</title><rect x="26.7594%" y="1157" width="0.0735%" height="15" fill="rgb(207,123,46)" fg:x="12742" fg:w="35"/><text x="27.0094%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (5 samples, 0.01%)</title><rect x="26.8350%" y="1157" width="0.0105%" height="15" fill="rgb(240,218,32)" fg:x="12778" fg:w="5"/><text x="27.0850%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (64 samples, 0.13%)</title><rect x="26.7404%" y="1189" width="0.1344%" height="15" fill="rgb(252,5,43)" fg:x="12733" fg:w="64"/><text x="26.9904%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (62 samples, 0.13%)</title><rect x="26.7447%" y="1173" width="0.1302%" height="15" fill="rgb(252,84,19)" fg:x="12735" fg:w="62"/><text x="26.9947%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (14 samples, 0.03%)</title><rect x="26.8455%" y="1157" width="0.0294%" height="15" fill="rgb(243,152,39)" fg:x="12783" fg:w="14"/><text x="27.0955%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (18 samples, 0.04%)</title><rect x="26.8749%" y="1189" width="0.0378%" height="15" fill="rgb(234,160,15)" fg:x="12797" fg:w="18"/><text x="27.1249%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (14 samples, 0.03%)</title><rect x="26.8833%" y="1173" width="0.0294%" height="15" fill="rgb(237,34,20)" fg:x="12801" fg:w="14"/><text x="27.1333%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (142 samples, 0.30%)</title><rect x="26.6354%" y="1221" width="0.2982%" height="15" fill="rgb(229,97,13)" fg:x="12683" fg:w="142"/><text x="26.8854%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (130 samples, 0.27%)</title><rect x="26.6606%" y="1205" width="0.2730%" height="15" fill="rgb(234,71,50)" fg:x="12695" fg:w="130"/><text x="26.9106%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (168 samples, 0.35%)</title><rect x="26.5829%" y="1253" width="0.3528%" height="15" fill="rgb(253,155,4)" fg:x="12658" fg:w="168"/><text x="26.8329%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (159 samples, 0.33%)</title><rect x="26.6018%" y="1237" width="0.3339%" height="15" fill="rgb(222,185,37)" fg:x="12667" fg:w="159"/><text x="26.8518%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (22 samples, 0.05%)</title><rect x="26.9358%" y="1253" width="0.0462%" height="15" fill="rgb(251,177,13)" fg:x="12826" fg:w="22"/><text x="27.1858%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="26.9568%" y="1237" width="0.0252%" height="15" fill="rgb(250,179,40)" fg:x="12836" fg:w="12"/><text x="27.2068%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (213 samples, 0.45%)</title><rect x="26.5388%" y="1269" width="0.4473%" height="15" fill="rgb(242,44,2)" fg:x="12637" fg:w="213"/><text x="26.7888%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_infix (349 samples, 0.73%)</title><rect x="26.2553%" y="1301" width="0.7329%" height="15" fill="rgb(216,177,13)" fg:x="12502" fg:w="349"/><text x="26.5053%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (271 samples, 0.57%)</title><rect x="26.4191%" y="1285" width="0.5691%" height="15" fill="rgb(216,106,43)" fg:x="12580" fg:w="271"/><text x="26.6691%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="27.0849%" y="1285" width="0.0126%" height="15" fill="rgb(216,183,2)" fg:x="12897" fg:w="6"/><text x="27.3349%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (9 samples, 0.02%)</title><rect x="27.0975%" y="1285" width="0.0189%" height="15" fill="rgb(249,75,3)" fg:x="12903" fg:w="9"/><text x="27.3475%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (20 samples, 0.04%)</title><rect x="27.1164%" y="1285" width="0.0420%" height="15" fill="rgb(219,67,39)" fg:x="12912" fg:w="20"/><text x="27.3664%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (11 samples, 0.02%)</title><rect x="27.1710%" y="1285" width="0.0231%" height="15" fill="rgb(253,228,2)" fg:x="12938" fg:w="11"/><text x="27.4210%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (5 samples, 0.01%)</title><rect x="27.3159%" y="1141" width="0.0105%" height="15" fill="rgb(235,138,27)" fg:x="13007" fg:w="5"/><text x="27.5659%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="27.3306%" y="1125" width="0.0147%" height="15" fill="rgb(236,97,51)" fg:x="13014" fg:w="7"/><text x="27.5806%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (5 samples, 0.01%)</title><rect x="27.3453%" y="1125" width="0.0105%" height="15" fill="rgb(240,80,30)" fg:x="13021" fg:w="5"/><text x="27.5953%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (17 samples, 0.04%)</title><rect x="27.3264%" y="1141" width="0.0357%" height="15" fill="rgb(230,178,19)" fg:x="13012" fg:w="17"/><text x="27.5764%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (36 samples, 0.08%)</title><rect x="27.2991%" y="1157" width="0.0756%" height="15" fill="rgb(210,190,27)" fg:x="12999" fg:w="36"/><text x="27.5491%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="27.3621%" y="1141" width="0.0126%" height="15" fill="rgb(222,107,31)" fg:x="13029" fg:w="6"/><text x="27.6121%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (50 samples, 0.11%)</title><rect x="27.2823%" y="1173" width="0.1050%" height="15" fill="rgb(216,127,34)" fg:x="12991" fg:w="50"/><text x="27.5323%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (59 samples, 0.12%)</title><rect x="27.2718%" y="1205" width="0.1239%" height="15" fill="rgb(234,116,52)" fg:x="12986" fg:w="59"/><text x="27.5218%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (55 samples, 0.12%)</title><rect x="27.2802%" y="1189" width="0.1155%" height="15" fill="rgb(222,124,15)" fg:x="12990" fg:w="55"/><text x="27.5302%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (63 samples, 0.13%)</title><rect x="27.2676%" y="1221" width="0.1323%" height="15" fill="rgb(231,179,28)" fg:x="12984" fg:w="63"/><text x="27.5176%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="27.4209%" y="1205" width="0.0147%" height="15" fill="rgb(226,93,45)" fg:x="13057" fg:w="7"/><text x="27.6709%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (91 samples, 0.19%)</title><rect x="27.2529%" y="1253" width="0.1911%" height="15" fill="rgb(215,8,51)" fg:x="12977" fg:w="91"/><text x="27.5029%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (89 samples, 0.19%)</title><rect x="27.2571%" y="1237" width="0.1869%" height="15" fill="rgb(223,106,5)" fg:x="12979" fg:w="89"/><text x="27.5071%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (14 samples, 0.03%)</title><rect x="27.4146%" y="1221" width="0.0294%" height="15" fill="rgb(250,191,5)" fg:x="13054" fg:w="14"/><text x="27.6646%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (105 samples, 0.22%)</title><rect x="27.2256%" y="1285" width="0.2205%" height="15" fill="rgb(242,132,44)" fg:x="12964" fg:w="105"/><text x="27.4756%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (99 samples, 0.21%)</title><rect x="27.2382%" y="1269" width="0.2079%" height="15" fill="rgb(251,152,29)" fg:x="12970" fg:w="99"/><text x="27.4882%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="27.4503%" y="1269" width="0.0168%" height="15" fill="rgb(218,179,5)" fg:x="13071" fg:w="8"/><text x="27.7003%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (13 samples, 0.03%)</title><rect x="27.4461%" y="1285" width="0.0273%" height="15" fill="rgb(227,67,19)" fg:x="13069" fg:w="13"/><text x="27.6961%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="27.4944%" y="1269" width="0.0126%" height="15" fill="rgb(233,119,31)" fg:x="13092" fg:w="6"/><text x="27.7444%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="27.5427%" y="1253" width="0.0126%" height="15" fill="rgb(241,120,22)" fg:x="13115" fg:w="6"/><text x="27.7927%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="27.5553%" y="1253" width="0.0105%" height="15" fill="rgb(224,102,30)" fg:x="13121" fg:w="5"/><text x="27.8053%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (7 samples, 0.01%)</title><rect x="27.5658%" y="1253" width="0.0147%" height="15" fill="rgb(210,164,37)" fg:x="13126" fg:w="7"/><text x="27.8158%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="27.6498%" y="1237" width="0.0126%" height="15" fill="rgb(226,191,16)" fg:x="13166" fg:w="6"/><text x="27.8998%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (8 samples, 0.02%)</title><rect x="27.6624%" y="1237" width="0.0168%" height="15" fill="rgb(214,40,45)" fg:x="13172" fg:w="8"/><text x="27.9124%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (6 samples, 0.01%)</title><rect x="27.6897%" y="1237" width="0.0126%" height="15" fill="rgb(244,29,26)" fg:x="13185" fg:w="6"/><text x="27.9397%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (18 samples, 0.04%)</title><rect x="27.7254%" y="1221" width="0.0378%" height="15" fill="rgb(216,16,5)" fg:x="13202" fg:w="18"/><text x="27.9754%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="27.7632%" y="1221" width="0.0273%" height="15" fill="rgb(249,76,35)" fg:x="13220" fg:w="13"/><text x="28.0132%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (7 samples, 0.01%)</title><rect x="27.7758%" y="1205" width="0.0147%" height="15" fill="rgb(207,11,44)" fg:x="13226" fg:w="7"/><text x="28.0258%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="27.7779%" y="1189" width="0.0126%" height="15" fill="rgb(228,190,49)" fg:x="13227" fg:w="6"/><text x="28.0279%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="27.7800%" y="1173" width="0.0105%" height="15" fill="rgb(214,173,12)" fg:x="13228" fg:w="5"/><text x="28.0300%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="27.8136%" y="1189" width="0.0126%" height="15" fill="rgb(218,26,35)" fg:x="13244" fg:w="6"/><text x="28.0636%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (5 samples, 0.01%)</title><rect x="27.8535%" y="1157" width="0.0105%" height="15" fill="rgb(220,200,19)" fg:x="13263" fg:w="5"/><text x="28.1035%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (5 samples, 0.01%)</title><rect x="27.9018%" y="1109" width="0.0105%" height="15" fill="rgb(239,95,49)" fg:x="13286" fg:w="5"/><text x="28.1518%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="27.9186%" y="1093" width="0.0147%" height="15" fill="rgb(235,85,53)" fg:x="13294" fg:w="7"/><text x="28.1686%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (8 samples, 0.02%)</title><rect x="27.9333%" y="1093" width="0.0168%" height="15" fill="rgb(233,133,31)" fg:x="13301" fg:w="8"/><text x="28.1833%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (25 samples, 0.05%)</title><rect x="27.9123%" y="1109" width="0.0525%" height="15" fill="rgb(218,25,20)" fg:x="13291" fg:w="25"/><text x="28.1623%" y="1119.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (7 samples, 0.01%)</title><rect x="27.9501%" y="1093" width="0.0147%" height="15" fill="rgb(252,210,38)" fg:x="13309" fg:w="7"/><text x="28.2001%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (47 samples, 0.10%)</title><rect x="27.8850%" y="1125" width="0.0987%" height="15" fill="rgb(242,134,21)" fg:x="13278" fg:w="47"/><text x="28.1350%" y="1135.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (9 samples, 0.02%)</title><rect x="27.9648%" y="1109" width="0.0189%" height="15" fill="rgb(213,28,48)" fg:x="13316" fg:w="9"/><text x="28.2148%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (53 samples, 0.11%)</title><rect x="27.8766%" y="1141" width="0.1113%" height="15" fill="rgb(250,196,2)" fg:x="13274" fg:w="53"/><text x="28.1266%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (80 samples, 0.17%)</title><rect x="27.8262%" y="1189" width="0.1680%" height="15" fill="rgb(227,5,17)" fg:x="13250" fg:w="80"/><text x="28.0762%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (73 samples, 0.15%)</title><rect x="27.8409%" y="1173" width="0.1533%" height="15" fill="rgb(221,226,24)" fg:x="13257" fg:w="73"/><text x="28.0909%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (58 samples, 0.12%)</title><rect x="27.8724%" y="1157" width="0.1218%" height="15" fill="rgb(211,5,48)" fg:x="13272" fg:w="58"/><text x="28.1224%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (5 samples, 0.01%)</title><rect x="28.0047%" y="1189" width="0.0105%" height="15" fill="rgb(219,150,6)" fg:x="13335" fg:w="5"/><text x="28.2547%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (120 samples, 0.25%)</title><rect x="27.7905%" y="1221" width="0.2520%" height="15" fill="rgb(251,46,16)" fg:x="13233" fg:w="120"/><text x="28.0405%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (118 samples, 0.25%)</title><rect x="27.7947%" y="1205" width="0.2478%" height="15" fill="rgb(220,204,40)" fg:x="13235" fg:w="118"/><text x="28.0447%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (13 samples, 0.03%)</title><rect x="28.0152%" y="1189" width="0.0273%" height="15" fill="rgb(211,85,2)" fg:x="13340" fg:w="13"/><text x="28.2652%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="28.0446%" y="1205" width="0.0105%" height="15" fill="rgb(229,17,7)" fg:x="13354" fg:w="5"/><text x="28.2946%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (29 samples, 0.06%)</title><rect x="28.0425%" y="1221" width="0.0609%" height="15" fill="rgb(239,72,28)" fg:x="13353" fg:w="29"/><text x="28.2925%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="28.0761%" y="1205" width="0.0273%" height="15" fill="rgb(230,47,54)" fg:x="13369" fg:w="13"/><text x="28.3261%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (261 samples, 0.55%)</title><rect x="27.5847%" y="1253" width="0.5481%" height="15" fill="rgb(214,50,8)" fg:x="13135" fg:w="261"/><text x="27.8347%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (205 samples, 0.43%)</title><rect x="27.7023%" y="1237" width="0.4305%" height="15" fill="rgb(216,198,43)" fg:x="13191" fg:w="205"/><text x="27.9523%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (6 samples, 0.01%)</title><rect x="28.1202%" y="1221" width="0.0126%" height="15" fill="rgb(234,20,35)" fg:x="13390" fg:w="6"/><text x="28.3702%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (5 samples, 0.01%)</title><rect x="28.1580%" y="1237" width="0.0105%" height="15" fill="rgb(254,45,19)" fg:x="13408" fg:w="5"/><text x="28.4080%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="28.1916%" y="1221" width="0.0252%" height="15" fill="rgb(219,14,44)" fg:x="13424" fg:w="12"/><text x="28.4416%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="28.2042%" y="1205" width="0.0126%" height="15" fill="rgb(217,220,26)" fg:x="13430" fg:w="6"/><text x="28.4542%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="28.2252%" y="1205" width="0.0105%" height="15" fill="rgb(213,158,28)" fg:x="13440" fg:w="5"/><text x="28.4752%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="28.2357%" y="1205" width="0.0126%" height="15" fill="rgb(252,51,52)" fg:x="13445" fg:w="6"/><text x="28.4857%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="28.2378%" y="1189" width="0.0105%" height="15" fill="rgb(246,89,16)" fg:x="13446" fg:w="5"/><text x="28.4878%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (17 samples, 0.04%)</title><rect x="28.2168%" y="1221" width="0.0357%" height="15" fill="rgb(216,158,49)" fg:x="13436" fg:w="17"/><text x="28.4668%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (54 samples, 0.11%)</title><rect x="28.1412%" y="1253" width="0.1134%" height="15" fill="rgb(236,107,19)" fg:x="13400" fg:w="54"/><text x="28.3912%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (40 samples, 0.08%)</title><rect x="28.1706%" y="1237" width="0.0840%" height="15" fill="rgb(228,185,30)" fg:x="13414" fg:w="40"/><text x="28.4206%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (379 samples, 0.80%)</title><rect x="27.4734%" y="1285" width="0.7959%" height="15" fill="rgb(246,134,8)" fg:x="13082" fg:w="379"/><text x="27.7234%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (360 samples, 0.76%)</title><rect x="27.5133%" y="1269" width="0.7560%" height="15" fill="rgb(214,143,50)" fg:x="13101" fg:w="360"/><text x="27.7633%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (5 samples, 0.01%)</title><rect x="28.2693%" y="1285" width="0.0105%" height="15" fill="rgb(228,75,8)" fg:x="13461" fg:w="5"/><text x="28.5193%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="28.3008%" y="1269" width="0.0105%" height="15" fill="rgb(207,175,4)" fg:x="13476" fg:w="5"/><text x="28.5508%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (17 samples, 0.04%)</title><rect x="28.2798%" y="1285" width="0.0357%" height="15" fill="rgb(205,108,24)" fg:x="13466" fg:w="17"/><text x="28.5298%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="28.3218%" y="1269" width="0.0147%" height="15" fill="rgb(244,120,49)" fg:x="13486" fg:w="7"/><text x="28.5718%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (7 samples, 0.01%)</title><rect x="28.3512%" y="1253" width="0.0147%" height="15" fill="rgb(223,47,38)" fg:x="13500" fg:w="7"/><text x="28.6012%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (30 samples, 0.06%)</title><rect x="28.3155%" y="1285" width="0.0630%" height="15" fill="rgb(229,179,11)" fg:x="13483" fg:w="30"/><text x="28.5655%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="28.3512%" y="1269" width="0.0273%" height="15" fill="rgb(231,122,1)" fg:x="13500" fg:w="13"/><text x="28.6012%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="28.3659%" y="1253" width="0.0126%" height="15" fill="rgb(245,119,9)" fg:x="13507" fg:w="6"/><text x="28.6159%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="28.3659%" y="1237" width="0.0126%" height="15" fill="rgb(241,163,25)" fg:x="13507" fg:w="6"/><text x="28.6159%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_parse (11 samples, 0.02%)</title><rect x="28.3785%" y="1285" width="0.0231%" height="15" fill="rgb(217,214,3)" fg:x="13513" fg:w="11"/><text x="28.6285%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (673 samples, 1.41%)</title><rect x="26.9967%" y="1301" width="1.4134%" height="15" fill="rgb(240,86,28)" fg:x="12855" fg:w="673"/><text x="27.2467%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_infix (1,392 samples, 2.92%)</title><rect x="25.5035%" y="1333" width="2.9233%" height="15" fill="rgb(215,47,9)" fg:x="12144" fg:w="1392"/><text x="25.7535%" y="1343.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,215 samples, 2.55%)</title><rect x="25.8752%" y="1317" width="2.5516%" height="15" fill="rgb(252,25,45)" fg:x="12321" fg:w="1215"/><text x="26.1252%" y="1327.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (5 samples, 0.01%)</title><rect x="28.4268%" y="1333" width="0.0105%" height="15" fill="rgb(251,164,9)" fg:x="13536" fg:w="5"/><text x="28.6768%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="28.4751%" y="1317" width="0.0189%" height="15" fill="rgb(233,194,0)" fg:x="13559" fg:w="9"/><text x="28.7251%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="28.5318%" y="1285" width="0.0105%" height="15" fill="rgb(249,111,24)" fg:x="13586" fg:w="5"/><text x="28.7818%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="28.5423%" y="1285" width="0.0147%" height="15" fill="rgb(250,223,3)" fg:x="13591" fg:w="7"/><text x="28.7923%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (9 samples, 0.02%)</title><rect x="28.5906%" y="1269" width="0.0189%" height="15" fill="rgb(236,178,37)" fg:x="13614" fg:w="9"/><text x="28.8406%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (26 samples, 0.05%)</title><rect x="28.6347%" y="1253" width="0.0546%" height="15" fill="rgb(241,158,50)" fg:x="13635" fg:w="26"/><text x="28.8847%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (14 samples, 0.03%)</title><rect x="28.7061%" y="1237" width="0.0294%" height="15" fill="rgb(213,121,41)" fg:x="13669" fg:w="14"/><text x="28.9561%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (9 samples, 0.02%)</title><rect x="28.7166%" y="1221" width="0.0189%" height="15" fill="rgb(240,92,3)" fg:x="13674" fg:w="9"/><text x="28.9666%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="28.7208%" y="1205" width="0.0147%" height="15" fill="rgb(205,123,3)" fg:x="13676" fg:w="7"/><text x="28.9708%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (24 samples, 0.05%)</title><rect x="28.6893%" y="1253" width="0.0504%" height="15" fill="rgb(205,97,47)" fg:x="13661" fg:w="24"/><text x="28.9393%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="28.7859%" y="1221" width="0.0126%" height="15" fill="rgb(247,152,14)" fg:x="13707" fg:w="6"/><text x="29.0359%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="28.8531%" y="1125" width="0.0105%" height="15" fill="rgb(248,195,53)" fg:x="13739" fg:w="5"/><text x="29.1031%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (23 samples, 0.05%)</title><rect x="28.8405%" y="1141" width="0.0483%" height="15" fill="rgb(226,201,16)" fg:x="13733" fg:w="23"/><text x="29.0905%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (8 samples, 0.02%)</title><rect x="28.8720%" y="1125" width="0.0168%" height="15" fill="rgb(205,98,0)" fg:x="13748" fg:w="8"/><text x="29.1220%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (35 samples, 0.07%)</title><rect x="28.8258%" y="1157" width="0.0735%" height="15" fill="rgb(214,191,48)" fg:x="13726" fg:w="35"/><text x="29.0758%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="28.8888%" y="1141" width="0.0105%" height="15" fill="rgb(237,112,39)" fg:x="13756" fg:w="5"/><text x="29.1388%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (38 samples, 0.08%)</title><rect x="28.8258%" y="1173" width="0.0798%" height="15" fill="rgb(247,203,27)" fg:x="13726" fg:w="38"/><text x="29.0758%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (51 samples, 0.11%)</title><rect x="28.8132%" y="1205" width="0.1071%" height="15" fill="rgb(235,124,28)" fg:x="13720" fg:w="51"/><text x="29.0632%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (47 samples, 0.10%)</title><rect x="28.8216%" y="1189" width="0.0987%" height="15" fill="rgb(208,207,46)" fg:x="13724" fg:w="47"/><text x="29.0716%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (7 samples, 0.01%)</title><rect x="28.9056%" y="1173" width="0.0147%" height="15" fill="rgb(234,176,4)" fg:x="13764" fg:w="7"/><text x="29.1556%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (61 samples, 0.13%)</title><rect x="28.7985%" y="1221" width="0.1281%" height="15" fill="rgb(230,133,28)" fg:x="13713" fg:w="61"/><text x="29.0485%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (5 samples, 0.01%)</title><rect x="28.9350%" y="1221" width="0.0105%" height="15" fill="rgb(211,137,40)" fg:x="13778" fg:w="5"/><text x="29.1850%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (9 samples, 0.02%)</title><rect x="28.9455%" y="1221" width="0.0189%" height="15" fill="rgb(254,35,13)" fg:x="13783" fg:w="9"/><text x="29.1955%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (5 samples, 0.01%)</title><rect x="28.9875%" y="1205" width="0.0105%" height="15" fill="rgb(225,49,51)" fg:x="13803" fg:w="5"/><text x="29.2375%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (128 samples, 0.27%)</title><rect x="28.7397%" y="1253" width="0.2688%" height="15" fill="rgb(251,10,15)" fg:x="13685" fg:w="128"/><text x="28.9897%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (123 samples, 0.26%)</title><rect x="28.7502%" y="1237" width="0.2583%" height="15" fill="rgb(228,207,15)" fg:x="13690" fg:w="123"/><text x="29.0002%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (21 samples, 0.04%)</title><rect x="28.9644%" y="1221" width="0.0441%" height="15" fill="rgb(241,99,19)" fg:x="13792" fg:w="21"/><text x="29.2144%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral::write_prefix (5 samples, 0.01%)</title><rect x="28.9980%" y="1205" width="0.0105%" height="15" fill="rgb(207,104,49)" fg:x="13808" fg:w="5"/><text x="29.2480%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="29.0379%" y="1221" width="0.0105%" height="15" fill="rgb(234,99,18)" fg:x="13827" fg:w="5"/><text x="29.2879%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="29.0484%" y="1221" width="0.0105%" height="15" fill="rgb(213,191,49)" fg:x="13832" fg:w="5"/><text x="29.2984%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (26 samples, 0.05%)</title><rect x="29.0085%" y="1253" width="0.0546%" height="15" fill="rgb(210,226,19)" fg:x="13813" fg:w="26"/><text x="29.2585%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="29.0190%" y="1237" width="0.0441%" height="15" fill="rgb(229,97,18)" fg:x="13818" fg:w="21"/><text x="29.2690%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (246 samples, 0.52%)</title><rect x="28.5696%" y="1285" width="0.5166%" height="15" fill="rgb(211,167,15)" fg:x="13604" fg:w="246"/><text x="28.8196%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (223 samples, 0.47%)</title><rect x="28.6179%" y="1269" width="0.4683%" height="15" fill="rgb(210,169,34)" fg:x="13627" fg:w="223"/><text x="28.8679%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (273 samples, 0.57%)</title><rect x="28.5171%" y="1317" width="0.5733%" height="15" fill="rgb(241,121,31)" fg:x="13579" fg:w="273"/><text x="28.7671%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (269 samples, 0.56%)</title><rect x="28.5255%" y="1301" width="0.5649%" height="15" fill="rgb(232,40,11)" fg:x="13583" fg:w="269"/><text x="28.7755%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="29.1073%" y="1301" width="0.0105%" height="15" fill="rgb(205,86,26)" fg:x="13860" fg:w="5"/><text x="29.3573%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="29.1367%" y="1285" width="0.0126%" height="15" fill="rgb(231,126,28)" fg:x="13874" fg:w="6"/><text x="29.3867%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (28 samples, 0.06%)</title><rect x="29.0926%" y="1317" width="0.0588%" height="15" fill="rgb(219,221,18)" fg:x="13853" fg:w="28"/><text x="29.3426%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="29.1262%" y="1301" width="0.0252%" height="15" fill="rgb(211,40,0)" fg:x="13869" fg:w="12"/><text x="29.3762%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (343 samples, 0.72%)</title><rect x="28.4373%" y="1333" width="0.7203%" height="15" fill="rgb(239,85,43)" fg:x="13541" fg:w="343"/><text x="28.6873%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,947 samples, 4.09%)</title><rect x="25.0898%" y="1349" width="4.0889%" height="15" fill="rgb(231,55,21)" fg:x="11947" fg:w="1947"/><text x="25.3398%" y="1359.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (5 samples, 0.01%)</title><rect x="29.1682%" y="1333" width="0.0105%" height="15" fill="rgb(225,184,43)" fg:x="13889" fg:w="5"/><text x="29.4182%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select (5,109 samples, 10.73%)</title><rect x="18.4514%" y="1365" width="10.7294%" height="15" fill="rgb(251,158,41)" fg:x="8786" fg:w="5109"/><text x="18.7014%" y="1375.50">sqlparser_bench-..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query_body (5,450 samples, 11.45%)</title><rect x="17.7374%" y="1381" width="11.4455%" height="15" fill="rgb(234,159,37)" fg:x="8446" fg:w="5450"/><text x="17.9874%" y="1391.50">sqlparser_bench-9..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select (5 samples, 0.01%)</title><rect x="29.1829%" y="1381" width="0.0105%" height="15" fill="rgb(216,204,22)" fg:x="13896" fg:w="5"/><text x="29.4329%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query (8,118 samples, 17.05%)</title><rect x="12.1553%" y="1397" width="17.0485%" height="15" fill="rgb(214,17,3)" fg:x="5788" fg:w="8118"/><text x="12.4053%" y="1407.50">sqlparser_bench-959bc52679..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_settings (5 samples, 0.01%)</title><rect x="29.1934%" y="1381" width="0.0105%" height="15" fill="rgb(212,111,17)" fg:x="13901" fg:w="5"/><text x="29.4434%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_statements (8,347 samples, 17.53%)</title><rect x="11.6828%" y="1429" width="17.5295%" height="15" fill="rgb(221,157,24)" fg:x="5563" fg:w="8347"/><text x="11.9328%" y="1439.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_statement (8,222 samples, 17.27%)</title><rect x="11.9453%" y="1413" width="17.2669%" height="15" fill="rgb(252,16,13)" fg:x="5688" fg:w="8222"/><text x="12.1953%" y="1423.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::next_token (177 samples, 0.37%)</title><rect x="29.2795%" y="1397" width="0.3717%" height="15" fill="rgb(221,62,2)" fg:x="13942" fg:w="177"/><text x="29.5295%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_identifier_or_keyword (36 samples, 0.08%)</title><rect x="29.6512%" y="1397" width="0.0756%" height="15" fill="rgb(247,87,22)" fg:x="14119" fg:w="36"/><text x="29.9012%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_free (161 samples, 0.34%)</title><rect x="30.7516%" y="1381" width="0.3381%" height="15" fill="rgb(215,73,9)" fg:x="14643" fg:w="161"/><text x="31.0016%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (39 samples, 0.08%)</title><rect x="31.0897%" y="1381" width="0.0819%" height="15" fill="rgb(207,175,33)" fg:x="14804" fg:w="39"/><text x="31.3397%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="31.1716%" y="1381" width="0.0126%" height="15" fill="rgb(243,129,54)" fg:x="14843" fg:w="6"/><text x="31.4216%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::iter::traits::collect::FromIterator&lt;char&gt;&gt;::from_iter (24 samples, 0.05%)</title><rect x="31.1884%" y="1381" width="0.0504%" height="15" fill="rgb(227,119,45)" fg:x="14851" fg:w="24"/><text x="31.4384%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::generic::GenericDialect as sqlparser::dialect::Dialect&gt;::is_delimited_identifier_start (15 samples, 0.03%)</title><rect x="31.2388%" y="1381" width="0.0315%" height="15" fill="rgb(205,109,36)" fg:x="14875" fg:w="15"/><text x="31.4888%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_start (8 samples, 0.02%)</title><rect x="31.2703%" y="1381" width="0.0168%" height="15" fill="rgb(205,6,39)" fg:x="14890" fg:w="8"/><text x="31.5203%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (29 samples, 0.06%)</title><rect x="31.2871%" y="1381" width="0.0609%" height="15" fill="rgb(221,32,16)" fg:x="14898" fg:w="29"/><text x="31.5371%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_dealloc (5 samples, 0.01%)</title><rect x="31.3522%" y="1381" width="0.0105%" height="15" fill="rgb(228,144,50)" fg:x="14929" fg:w="5"/><text x="31.6022%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$realloc (5 samples, 0.01%)</title><rect x="31.4048%" y="1365" width="0.0105%" height="15" fill="rgb(229,201,53)" fg:x="14954" fg:w="5"/><text x="31.6548%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (7 samples, 0.01%)</title><rect x="31.4594%" y="1349" width="0.0147%" height="15" fill="rgb(249,153,27)" fg:x="14980" fg:w="7"/><text x="31.7094%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`szone_good_size (6 samples, 0.01%)</title><rect x="31.5833%" y="1317" width="0.0126%" height="15" fill="rgb(227,106,25)" fg:x="15039" fg:w="6"/><text x="31.8333%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (5 samples, 0.01%)</title><rect x="31.6442%" y="1301" width="0.0105%" height="15" fill="rgb(230,65,29)" fg:x="15068" fg:w="5"/><text x="31.8942%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (6 samples, 0.01%)</title><rect x="31.7114%" y="1269" width="0.0126%" height="15" fill="rgb(221,57,46)" fg:x="15100" fg:w="6"/><text x="31.9614%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (29 samples, 0.06%)</title><rect x="31.6673%" y="1301" width="0.0609%" height="15" fill="rgb(229,161,17)" fg:x="15079" fg:w="29"/><text x="31.9173%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (20 samples, 0.04%)</title><rect x="31.6862%" y="1285" width="0.0420%" height="15" fill="rgb(222,213,11)" fg:x="15088" fg:w="20"/><text x="31.9362%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_try_realloc_in_place (14 samples, 0.03%)</title><rect x="31.7471%" y="1301" width="0.0294%" height="15" fill="rgb(235,35,13)" fg:x="15117" fg:w="14"/><text x="31.9971%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (7 samples, 0.01%)</title><rect x="31.7618%" y="1285" width="0.0147%" height="15" fill="rgb(233,158,34)" fg:x="15124" fg:w="7"/><text x="32.0118%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (5 samples, 0.01%)</title><rect x="31.8416%" y="1253" width="0.0105%" height="15" fill="rgb(215,151,48)" fg:x="15162" fg:w="5"/><text x="32.0916%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (43 samples, 0.09%)</title><rect x="31.7765%" y="1301" width="0.0903%" height="15" fill="rgb(229,84,14)" fg:x="15131" fg:w="43"/><text x="32.0265%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (33 samples, 0.07%)</title><rect x="31.7975%" y="1285" width="0.0693%" height="15" fill="rgb(229,68,14)" fg:x="15141" fg:w="33"/><text x="32.0475%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (28 samples, 0.06%)</title><rect x="31.8080%" y="1269" width="0.0588%" height="15" fill="rgb(243,106,26)" fg:x="15146" fg:w="28"/><text x="32.0580%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (7 samples, 0.01%)</title><rect x="31.8521%" y="1253" width="0.0147%" height="15" fill="rgb(206,45,38)" fg:x="15167" fg:w="7"/><text x="32.1021%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_size (23 samples, 0.05%)</title><rect x="31.8668%" y="1301" width="0.0483%" height="15" fill="rgb(226,6,15)" fg:x="15174" fg:w="23"/><text x="32.1168%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_size (22 samples, 0.05%)</title><rect x="31.8689%" y="1285" width="0.0462%" height="15" fill="rgb(232,22,54)" fg:x="15175" fg:w="22"/><text x="32.1189%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_try_realloc_in_place (23 samples, 0.05%)</title><rect x="31.9214%" y="1301" width="0.0483%" height="15" fill="rgb(229,222,32)" fg:x="15200" fg:w="23"/><text x="32.1714%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (6 samples, 0.01%)</title><rect x="31.9571%" y="1285" width="0.0126%" height="15" fill="rgb(228,62,29)" fg:x="15217" fg:w="6"/><text x="32.2071%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`szone_realloc (186 samples, 0.39%)</title><rect x="31.5980%" y="1317" width="0.3906%" height="15" fill="rgb(251,103,34)" fg:x="15046" fg:w="186"/><text x="31.8480%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (9 samples, 0.02%)</title><rect x="31.9697%" y="1301" width="0.0189%" height="15" fill="rgb(233,12,30)" fg:x="15223" fg:w="9"/><text x="32.2197%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (252 samples, 0.53%)</title><rect x="31.5245%" y="1333" width="0.5292%" height="15" fill="rgb(238,52,0)" fg:x="15011" fg:w="252"/><text x="31.7745%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (29 samples, 0.06%)</title><rect x="31.9928%" y="1317" width="0.0609%" height="15" fill="rgb(223,98,5)" fg:x="15234" fg:w="29"/><text x="32.2428%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (330 samples, 0.69%)</title><rect x="31.4741%" y="1349" width="0.6930%" height="15" fill="rgb(228,75,37)" fg:x="14987" fg:w="330"/><text x="31.7241%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`szone_size (42 samples, 0.09%)</title><rect x="32.0789%" y="1333" width="0.0882%" height="15" fill="rgb(205,115,49)" fg:x="15275" fg:w="42"/><text x="32.3289%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`tiny_size (40 samples, 0.08%)</title><rect x="32.0831%" y="1317" width="0.0840%" height="15" fill="rgb(250,154,43)" fg:x="15277" fg:w="40"/><text x="32.3331%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (47 samples, 0.10%)</title><rect x="32.1692%" y="1349" width="0.0987%" height="15" fill="rgb(226,43,29)" fg:x="15318" fg:w="47"/><text x="32.4192%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (34 samples, 0.07%)</title><rect x="32.1965%" y="1333" width="0.0714%" height="15" fill="rgb(249,228,39)" fg:x="15331" fg:w="34"/><text x="32.4465%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (25 samples, 0.05%)</title><rect x="32.2154%" y="1317" width="0.0525%" height="15" fill="rgb(216,79,43)" fg:x="15340" fg:w="25"/><text x="32.4654%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (436 samples, 0.92%)</title><rect x="31.3648%" y="1381" width="0.9156%" height="15" fill="rgb(228,95,12)" fg:x="14935" fg:w="436"/><text x="31.6148%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (405 samples, 0.85%)</title><rect x="31.4300%" y="1365" width="0.8505%" height="15" fill="rgb(249,221,15)" fg:x="14966" fg:w="405"/><text x="31.6800%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::is_custom_operator_part (11 samples, 0.02%)</title><rect x="32.2847%" y="1381" width="0.0231%" height="15" fill="rgb(233,34,13)" fg:x="15373" fg:w="11"/><text x="32.5347%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::State::next (10 samples, 0.02%)</title><rect x="32.3078%" y="1381" width="0.0210%" height="15" fill="rgb(214,103,39)" fg:x="15384" fg:w="10"/><text x="32.5578%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::State::peek (25 samples, 0.05%)</title><rect x="32.3288%" y="1381" width="0.0525%" height="15" fill="rgb(251,126,39)" fg:x="15394" fg:w="25"/><text x="32.5788%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::consume_and_return (25 samples, 0.05%)</title><rect x="32.3813%" y="1381" width="0.0525%" height="15" fill="rgb(214,216,36)" fg:x="15419" fg:w="25"/><text x="32.6313%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_free (9 samples, 0.02%)</title><rect x="33.4712%" y="1365" width="0.0189%" height="15" fill="rgb(220,221,8)" fg:x="15938" fg:w="9"/><text x="33.7212%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (13 samples, 0.03%)</title><rect x="33.4901%" y="1365" width="0.0273%" height="15" fill="rgb(240,216,3)" fg:x="15947" fg:w="13"/><text x="33.7401%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (30 samples, 0.06%)</title><rect x="33.5174%" y="1365" width="0.0630%" height="15" fill="rgb(232,218,17)" fg:x="15960" fg:w="30"/><text x="33.7674%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memcmp (80 samples, 0.17%)</title><rect x="33.5804%" y="1365" width="0.1680%" height="15" fill="rgb(229,163,45)" fg:x="15990" fg:w="80"/><text x="33.8304%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (12 samples, 0.03%)</title><rect x="33.7485%" y="1365" width="0.0252%" height="15" fill="rgb(231,110,42)" fg:x="16070" fg:w="12"/><text x="33.9985%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_part (17 samples, 0.04%)</title><rect x="33.7737%" y="1365" width="0.0357%" height="15" fill="rgb(208,170,48)" fg:x="16082" fg:w="17"/><text x="34.0237%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcmp (21 samples, 0.04%)</title><rect x="33.8157%" y="1365" width="0.0441%" height="15" fill="rgb(239,116,25)" fg:x="16102" fg:w="21"/><text x="34.0657%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (10 samples, 0.02%)</title><rect x="33.8934%" y="1349" width="0.0210%" height="15" fill="rgb(219,200,50)" fg:x="16139" fg:w="10"/><text x="34.1434%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (41 samples, 0.09%)</title><rect x="33.8745%" y="1365" width="0.0861%" height="15" fill="rgb(245,200,0)" fg:x="16130" fg:w="41"/><text x="34.1245%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (18 samples, 0.04%)</title><rect x="33.9228%" y="1349" width="0.0378%" height="15" fill="rgb(245,119,33)" fg:x="16153" fg:w="18"/><text x="34.1728%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (17 samples, 0.04%)</title><rect x="33.9249%" y="1333" width="0.0357%" height="15" fill="rgb(231,125,12)" fg:x="16154" fg:w="17"/><text x="34.1749%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="34.0005%" y="1349" width="0.0147%" height="15" fill="rgb(216,96,41)" fg:x="16190" fg:w="7"/><text x="34.2505%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Token::make_word (33 samples, 0.07%)</title><rect x="33.9774%" y="1365" width="0.0693%" height="15" fill="rgb(248,43,45)" fg:x="16179" fg:w="33"/><text x="34.2274%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (12 samples, 0.03%)</title><rect x="34.0215%" y="1349" width="0.0252%" height="15" fill="rgb(217,222,7)" fg:x="16200" fg:w="12"/><text x="34.2715%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="34.0341%" y="1333" width="0.0126%" height="15" fill="rgb(233,28,6)" fg:x="16206" fg:w="6"/><text x="34.2841%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="34.1202%" y="1349" width="0.0252%" height="15" fill="rgb(231,218,15)" fg:x="16247" fg:w="12"/><text x="34.3702%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="34.1454%" y="1349" width="0.0147%" height="15" fill="rgb(226,171,48)" fg:x="16259" fg:w="7"/><text x="34.3954%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (14 samples, 0.03%)</title><rect x="34.1601%" y="1349" width="0.0294%" height="15" fill="rgb(235,201,9)" fg:x="16266" fg:w="14"/><text x="34.4101%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="34.1790%" y="1333" width="0.0105%" height="15" fill="rgb(217,80,15)" fg:x="16275" fg:w="5"/><text x="34.4290%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (11 samples, 0.02%)</title><rect x="34.2357%" y="1285" width="0.0231%" height="15" fill="rgb(219,152,8)" fg:x="16302" fg:w="11"/><text x="34.4857%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (30 samples, 0.06%)</title><rect x="34.2084%" y="1317" width="0.0630%" height="15" fill="rgb(243,107,38)" fg:x="16289" fg:w="30"/><text x="34.4584%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (23 samples, 0.05%)</title><rect x="34.2231%" y="1301" width="0.0483%" height="15" fill="rgb(231,17,5)" fg:x="16296" fg:w="23"/><text x="34.4731%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (6 samples, 0.01%)</title><rect x="34.2588%" y="1285" width="0.0126%" height="15" fill="rgb(209,25,54)" fg:x="16313" fg:w="6"/><text x="34.5088%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (47 samples, 0.10%)</title><rect x="34.1895%" y="1349" width="0.0987%" height="15" fill="rgb(219,0,2)" fg:x="16280" fg:w="47"/><text x="34.4395%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (39 samples, 0.08%)</title><rect x="34.2063%" y="1333" width="0.0819%" height="15" fill="rgb(246,9,5)" fg:x="16288" fg:w="39"/><text x="34.4563%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (8 samples, 0.02%)</title><rect x="34.2714%" y="1317" width="0.0168%" height="15" fill="rgb(226,159,4)" fg:x="16319" fg:w="8"/><text x="34.5214%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::next_token (884 samples, 1.86%)</title><rect x="32.4338%" y="1381" width="1.8565%" height="15" fill="rgb(219,175,34)" fg:x="15444" fg:w="884"/><text x="32.6838%" y="1391.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (116 samples, 0.24%)</title><rect x="34.0467%" y="1365" width="0.2436%" height="15" fill="rgb(236,10,46)" fg:x="16212" fg:w="116"/><text x="34.2967%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_free (37 samples, 0.08%)</title><rect x="34.4478%" y="1365" width="0.0777%" height="15" fill="rgb(240,211,16)" fg:x="16403" fg:w="37"/><text x="34.6978%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (39 samples, 0.08%)</title><rect x="34.5255%" y="1365" width="0.0819%" height="15" fill="rgb(205,3,43)" fg:x="16440" fg:w="39"/><text x="34.7755%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (231 samples, 0.49%)</title><rect x="34.6074%" y="1365" width="0.4851%" height="15" fill="rgb(245,7,22)" fg:x="16479" fg:w="231"/><text x="34.8574%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memcmp (593 samples, 1.25%)</title><rect x="35.0925%" y="1365" width="1.2454%" height="15" fill="rgb(239,132,32)" fg:x="16710" fg:w="593"/><text x="35.3425%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (110 samples, 0.23%)</title><rect x="36.3379%" y="1365" width="0.2310%" height="15" fill="rgb(228,202,34)" fg:x="17303" fg:w="110"/><text x="36.5879%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (41 samples, 0.09%)</title><rect x="36.7369%" y="1333" width="0.0861%" height="15" fill="rgb(254,200,22)" fg:x="17493" fg:w="41"/><text x="36.9869%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (17 samples, 0.04%)</title><rect x="36.8314%" y="1333" width="0.0357%" height="15" fill="rgb(219,10,39)" fg:x="17538" fg:w="17"/><text x="37.0814%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (183 samples, 0.38%)</title><rect x="36.6571%" y="1349" width="0.3843%" height="15" fill="rgb(226,210,39)" fg:x="17455" fg:w="183"/><text x="36.9071%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (83 samples, 0.17%)</title><rect x="36.8671%" y="1333" width="0.1743%" height="15" fill="rgb(208,219,16)" fg:x="17555" fg:w="83"/><text x="37.1171%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (66 samples, 0.14%)</title><rect x="36.9028%" y="1317" width="0.1386%" height="15" fill="rgb(216,158,51)" fg:x="17572" fg:w="66"/><text x="37.1528%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::iter::traits::collect::FromIterator&lt;char&gt;&gt;::from_iter (235 samples, 0.49%)</title><rect x="36.5689%" y="1365" width="0.4935%" height="15" fill="rgb(233,14,44)" fg:x="17413" fg:w="235"/><text x="36.8189%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (10 samples, 0.02%)</title><rect x="37.0414%" y="1349" width="0.0210%" height="15" fill="rgb(237,97,39)" fg:x="17638" fg:w="10"/><text x="37.2914%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_part (119 samples, 0.25%)</title><rect x="37.0624%" y="1365" width="0.2499%" height="15" fill="rgb(218,198,43)" fg:x="17648" fg:w="119"/><text x="37.3124%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (28 samples, 0.06%)</title><rect x="37.3123%" y="1365" width="0.0588%" height="15" fill="rgb(231,104,20)" fg:x="17767" fg:w="28"/><text x="37.5623%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (8 samples, 0.02%)</title><rect x="37.3711%" y="1365" width="0.0168%" height="15" fill="rgb(254,36,13)" fg:x="17795" fg:w="8"/><text x="37.6211%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcmp (194 samples, 0.41%)</title><rect x="37.3879%" y="1365" width="0.4074%" height="15" fill="rgb(248,14,50)" fg:x="17803" fg:w="194"/><text x="37.6379%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (17 samples, 0.04%)</title><rect x="37.7953%" y="1365" width="0.0357%" height="15" fill="rgb(217,107,29)" fg:x="17997" fg:w="17"/><text x="38.0453%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (12 samples, 0.03%)</title><rect x="37.8415%" y="1365" width="0.0252%" height="15" fill="rgb(251,169,33)" fg:x="18019" fg:w="12"/><text x="38.0915%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (12 samples, 0.03%)</title><rect x="37.8667%" y="1365" width="0.0252%" height="15" fill="rgb(217,108,32)" fg:x="18031" fg:w="12"/><text x="38.1167%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (38 samples, 0.08%)</title><rect x="37.8919%" y="1365" width="0.0798%" height="15" fill="rgb(219,66,42)" fg:x="18043" fg:w="38"/><text x="38.1419%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (42 samples, 0.09%)</title><rect x="38.2027%" y="1349" width="0.0882%" height="15" fill="rgb(206,180,7)" fg:x="18191" fg:w="42"/><text x="38.4527%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (55 samples, 0.12%)</title><rect x="38.2909%" y="1349" width="0.1155%" height="15" fill="rgb(208,226,31)" fg:x="18233" fg:w="55"/><text x="38.5409%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (6 samples, 0.01%)</title><rect x="38.4065%" y="1349" width="0.0126%" height="15" fill="rgb(218,26,49)" fg:x="18288" fg:w="6"/><text x="38.6565%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (13 samples, 0.03%)</title><rect x="38.4191%" y="1349" width="0.0273%" height="15" fill="rgb(233,197,48)" fg:x="18294" fg:w="13"/><text x="38.6691%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Token::make_word (363 samples, 0.76%)</title><rect x="37.9717%" y="1365" width="0.7623%" height="15" fill="rgb(252,181,51)" fg:x="18081" fg:w="363"/><text x="38.2217%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (137 samples, 0.29%)</title><rect x="38.4464%" y="1349" width="0.2877%" height="15" fill="rgb(253,90,19)" fg:x="18307" fg:w="137"/><text x="38.6964%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (59 samples, 0.12%)</title><rect x="38.6102%" y="1333" width="0.1239%" height="15" fill="rgb(215,171,30)" fg:x="18385" fg:w="59"/><text x="38.8602%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (78 samples, 0.16%)</title><rect x="39.2738%" y="1349" width="0.1638%" height="15" fill="rgb(214,222,9)" fg:x="18701" fg:w="78"/><text x="39.5238%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (46 samples, 0.10%)</title><rect x="39.5132%" y="1333" width="0.0966%" height="15" fill="rgb(223,3,22)" fg:x="18815" fg:w="46"/><text x="39.7632%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (9 samples, 0.02%)</title><rect x="39.6098%" y="1333" width="0.0189%" height="15" fill="rgb(225,196,46)" fg:x="18861" fg:w="9"/><text x="39.8598%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (12 samples, 0.03%)</title><rect x="39.6287%" y="1333" width="0.0252%" height="15" fill="rgb(209,110,37)" fg:x="18870" fg:w="12"/><text x="39.8787%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (158 samples, 0.33%)</title><rect x="39.4376%" y="1349" width="0.3318%" height="15" fill="rgb(249,89,12)" fg:x="18779" fg:w="158"/><text x="39.6876%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (55 samples, 0.12%)</title><rect x="39.6539%" y="1333" width="0.1155%" height="15" fill="rgb(226,27,33)" fg:x="18882" fg:w="55"/><text x="39.9039%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (43 samples, 0.09%)</title><rect x="39.6791%" y="1317" width="0.0903%" height="15" fill="rgb(213,82,22)" fg:x="18894" fg:w="43"/><text x="39.9291%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (13 samples, 0.03%)</title><rect x="39.7694%" y="1349" width="0.0273%" height="15" fill="rgb(248,140,0)" fg:x="18937" fg:w="13"/><text x="40.0194%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (7 samples, 0.01%)</title><rect x="39.7820%" y="1333" width="0.0147%" height="15" fill="rgb(228,106,3)" fg:x="18943" fg:w="7"/><text x="40.0320%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_identifier_or_keyword (2,644 samples, 5.55%)</title><rect x="34.2903%" y="1381" width="5.5526%" height="15" fill="rgb(209,23,37)" fg:x="16328" fg:w="2644"/><text x="34.5403%" y="1391.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (528 samples, 1.11%)</title><rect x="38.7341%" y="1365" width="1.1088%" height="15" fill="rgb(241,93,50)" fg:x="18444" fg:w="528"/><text x="38.9841%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (22 samples, 0.05%)</title><rect x="39.7967%" y="1349" width="0.0462%" height="15" fill="rgb(253,46,43)" fg:x="18950" fg:w="22"/><text x="40.0467%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_with_location (5,051 samples, 10.61%)</title><rect x="29.2732%" y="1413" width="10.6076%" height="15" fill="rgb(226,206,43)" fg:x="13939" fg:w="5051"/><text x="29.5232%" y="1423.50">sqlparser_bench..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_with_location_into_buf (4,835 samples, 10.15%)</title><rect x="29.7268%" y="1397" width="10.1539%" height="15" fill="rgb(217,54,7)" fg:x="14155" fg:w="4835"/><text x="29.9768%" y="1407.50">sqlparser_bench..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (18 samples, 0.04%)</title><rect x="39.8429%" y="1381" width="0.0378%" height="15" fill="rgb(223,5,52)" fg:x="18972" fg:w="18"/><text x="40.0929%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_with_sql (5,081 samples, 10.67%)</title><rect x="29.2123%" y="1429" width="10.6706%" height="15" fill="rgb(206,52,46)" fg:x="13910" fg:w="5081"/><text x="29.4623%" y="1439.50">sqlparser_bench-..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_sql (13,813 samples, 29.01%)</title><rect x="10.8785%" y="1445" width="29.0085%" height="15" fill="rgb(253,136,11)" fg:x="5180" fg:w="13813"/><text x="11.1285%" y="1455.50">sqlparser_bench-959bc5267970ca34`sqlparser::par..</text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::bencher::Bencher&lt;M&gt;::iter (18,926 samples, 39.75%)</title><rect x="0.1575%" y="1461" width="39.7463%" height="15" fill="rgb(208,106,33)" fg:x="75" fg:w="18926"/><text x="0.4075%" y="1471.50">sqlparser_bench-959bc5267970ca34`criterion::bencher::Bencher&lt;M&gt;::..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_with_sql (5 samples, 0.01%)</title><rect x="39.8933%" y="1445" width="0.0105%" height="15" fill="rgb(206,54,4)" fg:x="18996" fg:w="5"/><text x="40.1433%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::vec::Vec&lt;T&gt; as alloc::vec::spec_from_iter::SpecFromIter&lt;T,I&gt;&gt;::from_iter (18,946 samples, 39.79%)</title><rect x="0.1176%" y="1477" width="39.7883%" height="15" fill="rgb(213,3,15)" fg:x="56" fg:w="18946"/><text x="0.3676%" y="1487.50">sqlparser_bench-959bc5267970ca34`&lt;alloc::vec::Vec&lt;T&gt; as alloc::ve..</text></g><g><title>libsystem_malloc.dylib`_free (8 samples, 0.02%)</title><rect x="39.9059%" y="1461" width="0.0168%" height="15" fill="rgb(252,211,39)" fg:x="19002" fg:w="8"/><text x="40.1559%" y="1471.50"></text></g><g><title>libsystem_malloc.dylib`_free (57 samples, 0.12%)</title><rect x="39.9500%" y="1445" width="0.1197%" height="15" fill="rgb(223,6,36)" fg:x="19023" fg:w="57"/><text x="40.2000%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (33 samples, 0.07%)</title><rect x="40.0739%" y="1445" width="0.0693%" height="15" fill="rgb(252,169,45)" fg:x="19082" fg:w="33"/><text x="40.3239%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (12 samples, 0.03%)</title><rect x="40.1432%" y="1445" width="0.0252%" height="15" fill="rgb(212,48,26)" fg:x="19115" fg:w="12"/><text x="40.3932%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (14 samples, 0.03%)</title><rect x="40.2146%" y="1429" width="0.0294%" height="15" fill="rgb(251,102,48)" fg:x="19149" fg:w="14"/><text x="40.4646%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_find_by_ptr (8 samples, 0.02%)</title><rect x="40.2440%" y="1429" width="0.0168%" height="15" fill="rgb(243,208,16)" fg:x="19163" fg:w="8"/><text x="40.4940%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`free_small (60 samples, 0.13%)</title><rect x="40.1705%" y="1445" width="0.1260%" height="15" fill="rgb(219,96,24)" fg:x="19128" fg:w="60"/><text x="40.4205%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (14 samples, 0.03%)</title><rect x="40.2671%" y="1429" width="0.0294%" height="15" fill="rgb(219,33,29)" fg:x="19174" fg:w="14"/><text x="40.5171%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (12 samples, 0.03%)</title><rect x="40.3112%" y="1333" width="0.0252%" height="15" fill="rgb(223,176,5)" fg:x="19195" fg:w="12"/><text x="40.5612%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderByExpr as core::fmt::Display&gt;::fmt (11 samples, 0.02%)</title><rect x="40.3385%" y="1333" width="0.0231%" height="15" fill="rgb(228,140,14)" fg:x="19208" fg:w="11"/><text x="40.5885%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (11 samples, 0.02%)</title><rect x="40.3637%" y="1333" width="0.0231%" height="15" fill="rgb(217,179,31)" fg:x="19220" fg:w="11"/><text x="40.6137%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (11 samples, 0.02%)</title><rect x="40.4939%" y="1317" width="0.0231%" height="15" fill="rgb(230,9,30)" fg:x="19282" fg:w="11"/><text x="40.7439%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (22 samples, 0.05%)</title><rect x="40.5170%" y="1317" width="0.0462%" height="15" fill="rgb(230,136,20)" fg:x="19293" fg:w="22"/><text x="40.7670%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (34 samples, 0.07%)</title><rect x="40.6241%" y="1301" width="0.0714%" height="15" fill="rgb(215,210,22)" fg:x="19344" fg:w="34"/><text x="40.8741%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (12 samples, 0.03%)</title><rect x="40.6955%" y="1301" width="0.0252%" height="15" fill="rgb(218,43,5)" fg:x="19378" fg:w="12"/><text x="40.9455%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="40.7208%" y="1301" width="0.0189%" height="15" fill="rgb(216,11,5)" fg:x="19390" fg:w="9"/><text x="40.9708%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (5 samples, 0.01%)</title><rect x="40.7397%" y="1301" width="0.0105%" height="15" fill="rgb(209,82,29)" fg:x="19399" fg:w="5"/><text x="40.9897%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (5 samples, 0.01%)</title><rect x="40.7502%" y="1301" width="0.0105%" height="15" fill="rgb(244,115,12)" fg:x="19404" fg:w="5"/><text x="41.0002%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="40.8279%" y="1285" width="0.0105%" height="15" fill="rgb(222,82,18)" fg:x="19441" fg:w="5"/><text x="41.0779%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="40.8720%" y="1269" width="0.0189%" height="15" fill="rgb(249,227,8)" fg:x="19462" fg:w="9"/><text x="41.1220%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="40.8909%" y="1269" width="0.0105%" height="15" fill="rgb(253,141,45)" fg:x="19471" fg:w="5"/><text x="41.1409%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (43 samples, 0.09%)</title><rect x="40.9749%" y="1253" width="0.0903%" height="15" fill="rgb(234,184,4)" fg:x="19511" fg:w="43"/><text x="41.2249%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (7 samples, 0.01%)</title><rect x="41.0652%" y="1253" width="0.0147%" height="15" fill="rgb(218,194,23)" fg:x="19554" fg:w="7"/><text x="41.3152%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (17 samples, 0.04%)</title><rect x="41.0799%" y="1253" width="0.0357%" height="15" fill="rgb(235,66,41)" fg:x="19561" fg:w="17"/><text x="41.3299%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (143 samples, 0.30%)</title><rect x="40.8384%" y="1285" width="0.3003%" height="15" fill="rgb(245,217,1)" fg:x="19446" fg:w="143"/><text x="41.0884%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (113 samples, 0.24%)</title><rect x="40.9014%" y="1269" width="0.2373%" height="15" fill="rgb(229,91,1)" fg:x="19476" fg:w="113"/><text x="41.1514%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (8 samples, 0.02%)</title><rect x="41.1219%" y="1253" width="0.0168%" height="15" fill="rgb(207,101,30)" fg:x="19581" fg:w="8"/><text x="41.3719%" y="1263.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (15 samples, 0.03%)</title><rect x="41.1387%" y="1269" width="0.0315%" height="15" fill="rgb(223,82,49)" fg:x="19589" fg:w="15"/><text x="41.3887%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (7 samples, 0.01%)</title><rect x="41.1702%" y="1269" width="0.0147%" height="15" fill="rgb(218,167,17)" fg:x="19604" fg:w="7"/><text x="41.4202%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (14 samples, 0.03%)</title><rect x="41.1849%" y="1269" width="0.0294%" height="15" fill="rgb(208,103,14)" fg:x="19611" fg:w="14"/><text x="41.4349%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (49 samples, 0.10%)</title><rect x="41.1387%" y="1285" width="0.1029%" height="15" fill="rgb(238,20,8)" fg:x="19589" fg:w="49"/><text x="41.3887%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (13 samples, 0.03%)</title><rect x="41.2143%" y="1269" width="0.0273%" height="15" fill="rgb(218,80,54)" fg:x="19625" fg:w="13"/><text x="41.4643%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_fmt (6 samples, 0.01%)</title><rect x="41.2416%" y="1285" width="0.0126%" height="15" fill="rgb(240,144,17)" fg:x="19638" fg:w="6"/><text x="41.4916%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (17 samples, 0.04%)</title><rect x="41.2542%" y="1285" width="0.0357%" height="15" fill="rgb(245,27,50)" fg:x="19644" fg:w="17"/><text x="41.5042%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (17 samples, 0.04%)</title><rect x="41.2899%" y="1285" width="0.0357%" height="15" fill="rgb(251,51,7)" fg:x="19661" fg:w="17"/><text x="41.5399%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (7 samples, 0.01%)</title><rect x="41.3256%" y="1285" width="0.0147%" height="15" fill="rgb(245,217,29)" fg:x="19678" fg:w="7"/><text x="41.5756%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderByExpr as core::fmt::Display&gt;::fmt (376 samples, 0.79%)</title><rect x="40.5632%" y="1317" width="0.7896%" height="15" fill="rgb(221,176,29)" fg:x="19315" fg:w="376"/><text x="40.8132%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (282 samples, 0.59%)</title><rect x="40.7607%" y="1301" width="0.5922%" height="15" fill="rgb(212,180,24)" fg:x="19409" fg:w="282"/><text x="41.0107%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (6 samples, 0.01%)</title><rect x="41.3403%" y="1285" width="0.0126%" height="15" fill="rgb(254,24,2)" fg:x="19685" fg:w="6"/><text x="41.5903%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (11 samples, 0.02%)</title><rect x="41.3529%" y="1317" width="0.0231%" height="15" fill="rgb(230,100,2)" fg:x="19691" fg:w="11"/><text x="41.6029%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (17 samples, 0.04%)</title><rect x="41.3760%" y="1317" width="0.0357%" height="15" fill="rgb(219,142,25)" fg:x="19702" fg:w="17"/><text x="41.6260%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (542 samples, 1.14%)</title><rect x="40.2986%" y="1349" width="1.1382%" height="15" fill="rgb(240,73,43)" fg:x="19189" fg:w="542"/><text x="40.5486%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (500 samples, 1.05%)</title><rect x="40.3868%" y="1333" width="1.0500%" height="15" fill="rgb(214,114,15)" fg:x="19231" fg:w="500"/><text x="40.6368%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (12 samples, 0.03%)</title><rect x="41.4117%" y="1317" width="0.0252%" height="15" fill="rgb(207,130,4)" fg:x="19719" fg:w="12"/><text x="41.6617%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::OrderBy as core::fmt::Display&gt;::fmt (570 samples, 1.20%)</title><rect x="40.2986%" y="1381" width="1.1971%" height="15" fill="rgb(221,25,40)" fg:x="19189" fg:w="570"/><text x="40.5486%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (570 samples, 1.20%)</title><rect x="40.2986%" y="1365" width="1.1971%" height="15" fill="rgb(241,184,7)" fg:x="19189" fg:w="570"/><text x="40.5486%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (28 samples, 0.06%)</title><rect x="41.4369%" y="1349" width="0.0588%" height="15" fill="rgb(235,159,4)" fg:x="19731" fg:w="28"/><text x="41.6869%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (16 samples, 0.03%)</title><rect x="41.5041%" y="1301" width="0.0336%" height="15" fill="rgb(214,87,48)" fg:x="19763" fg:w="16"/><text x="41.7541%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (9 samples, 0.02%)</title><rect x="41.5377%" y="1301" width="0.0189%" height="15" fill="rgb(246,198,24)" fg:x="19779" fg:w="9"/><text x="41.7877%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (11 samples, 0.02%)</title><rect x="41.5713%" y="1301" width="0.0231%" height="15" fill="rgb(209,66,40)" fg:x="19795" fg:w="11"/><text x="41.8213%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (13 samples, 0.03%)</title><rect x="41.6973%" y="1285" width="0.0273%" height="15" fill="rgb(233,147,39)" fg:x="19855" fg:w="13"/><text x="41.9473%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="41.7246%" y="1269" width="0.0189%" height="15" fill="rgb(231,145,52)" fg:x="19868" fg:w="9"/><text x="41.9746%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt (12 samples, 0.03%)</title><rect x="41.7435%" y="1269" width="0.0252%" height="15" fill="rgb(206,20,26)" fg:x="19877" fg:w="12"/><text x="41.9935%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt::suffix::Suffix as core::fmt::Display&gt;::fmt (10 samples, 0.02%)</title><rect x="41.8800%" y="1237" width="0.0210%" height="15" fill="rgb(238,220,4)" fg:x="19942" fg:w="10"/><text x="42.1300%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (30 samples, 0.06%)</title><rect x="41.9010%" y="1237" width="0.0630%" height="15" fill="rgb(252,195,42)" fg:x="19952" fg:w="30"/><text x="42.1510%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::TableFactor as core::fmt::Display&gt;::fmt (14 samples, 0.03%)</title><rect x="41.9640%" y="1237" width="0.0294%" height="15" fill="rgb(209,10,6)" fg:x="19982" fg:w="14"/><text x="42.2140%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (6 samples, 0.01%)</title><rect x="41.9997%" y="1237" width="0.0126%" height="15" fill="rgb(229,3,52)" fg:x="19999" fg:w="6"/><text x="42.2497%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (65 samples, 0.14%)</title><rect x="42.1593%" y="1221" width="0.1365%" height="15" fill="rgb(253,49,37)" fg:x="20075" fg:w="65"/><text x="42.4093%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt::suffix::Suffix as core::fmt::Display&gt;::fmt (20 samples, 0.04%)</title><rect x="42.2958%" y="1221" width="0.0420%" height="15" fill="rgb(240,103,49)" fg:x="20140" fg:w="20"/><text x="42.5458%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (42 samples, 0.09%)</title><rect x="42.3378%" y="1221" width="0.0882%" height="15" fill="rgb(250,182,30)" fg:x="20160" fg:w="42"/><text x="42.5878%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (10 samples, 0.02%)</title><rect x="42.5415%" y="1205" width="0.0210%" height="15" fill="rgb(248,8,30)" fg:x="20257" fg:w="10"/><text x="42.7915%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (16 samples, 0.03%)</title><rect x="42.6612%" y="1173" width="0.0336%" height="15" fill="rgb(237,120,30)" fg:x="20314" fg:w="16"/><text x="42.9112%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (11 samples, 0.02%)</title><rect x="42.7830%" y="1141" width="0.0231%" height="15" fill="rgb(221,146,34)" fg:x="20372" fg:w="11"/><text x="43.0330%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (18 samples, 0.04%)</title><rect x="42.8061%" y="1141" width="0.0378%" height="15" fill="rgb(242,55,13)" fg:x="20383" fg:w="18"/><text x="43.0561%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="42.8439%" y="1141" width="0.0105%" height="15" fill="rgb(242,112,31)" fg:x="20401" fg:w="5"/><text x="43.0939%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (18 samples, 0.04%)</title><rect x="42.8628%" y="1141" width="0.0378%" height="15" fill="rgb(249,192,27)" fg:x="20410" fg:w="18"/><text x="43.1128%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (38 samples, 0.08%)</title><rect x="43.0288%" y="1125" width="0.0798%" height="15" fill="rgb(208,204,44)" fg:x="20489" fg:w="38"/><text x="43.2788%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (14 samples, 0.03%)</title><rect x="43.1086%" y="1125" width="0.0294%" height="15" fill="rgb(208,93,54)" fg:x="20527" fg:w="14"/><text x="43.3586%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (19 samples, 0.04%)</title><rect x="43.1380%" y="1125" width="0.0399%" height="15" fill="rgb(242,1,31)" fg:x="20541" fg:w="19"/><text x="43.3880%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (10 samples, 0.02%)</title><rect x="43.1779%" y="1125" width="0.0210%" height="15" fill="rgb(241,83,25)" fg:x="20560" fg:w="10"/><text x="43.4279%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (14 samples, 0.03%)</title><rect x="43.2073%" y="1125" width="0.0294%" height="15" fill="rgb(205,169,50)" fg:x="20574" fg:w="14"/><text x="43.4573%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (232 samples, 0.49%)</title><rect x="42.7515%" y="1157" width="0.4872%" height="15" fill="rgb(239,186,37)" fg:x="20357" fg:w="232"/><text x="43.0015%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (161 samples, 0.34%)</title><rect x="42.9006%" y="1141" width="0.3381%" height="15" fill="rgb(205,221,10)" fg:x="20428" fg:w="161"/><text x="43.1506%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (311 samples, 0.65%)</title><rect x="42.6129%" y="1189" width="0.6531%" height="15" fill="rgb(218,196,15)" fg:x="20291" fg:w="311"/><text x="42.8629%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (272 samples, 0.57%)</title><rect x="42.6948%" y="1173" width="0.5712%" height="15" fill="rgb(218,196,35)" fg:x="20330" fg:w="272"/><text x="42.9448%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="43.2388%" y="1157" width="0.0273%" height="15" fill="rgb(233,63,24)" fg:x="20589" fg:w="13"/><text x="43.4888%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::TableFactor as core::fmt::Display&gt;::fmt (412 samples, 0.87%)</title><rect x="42.4260%" y="1221" width="0.8652%" height="15" fill="rgb(225,8,4)" fg:x="20202" fg:w="412"/><text x="42.6760%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (347 samples, 0.73%)</title><rect x="42.5625%" y="1205" width="0.7287%" height="15" fill="rgb(234,105,35)" fg:x="20267" fg:w="347"/><text x="42.8125%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (12 samples, 0.03%)</title><rect x="43.2661%" y="1189" width="0.0252%" height="15" fill="rgb(236,21,32)" fg:x="20602" fg:w="12"/><text x="43.5161%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (6 samples, 0.01%)</title><rect x="43.2913%" y="1221" width="0.0126%" height="15" fill="rgb(228,109,6)" fg:x="20614" fg:w="6"/><text x="43.5413%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (11 samples, 0.02%)</title><rect x="43.3039%" y="1221" width="0.0231%" height="15" fill="rgb(229,215,31)" fg:x="20620" fg:w="11"/><text x="43.5539%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (11 samples, 0.02%)</title><rect x="43.3270%" y="1221" width="0.0231%" height="15" fill="rgb(221,52,54)" fg:x="20631" fg:w="11"/><text x="43.5770%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Join as core::fmt::Display&gt;::fmt (733 samples, 1.54%)</title><rect x="41.8338%" y="1253" width="1.5394%" height="15" fill="rgb(252,129,43)" fg:x="19920" fg:w="733"/><text x="42.0838%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (648 samples, 1.36%)</title><rect x="42.0123%" y="1237" width="1.3609%" height="15" fill="rgb(248,183,27)" fg:x="20005" fg:w="648"/><text x="42.2623%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (11 samples, 0.02%)</title><rect x="43.3501%" y="1221" width="0.0231%" height="15" fill="rgb(250,0,22)" fg:x="20642" fg:w="11"/><text x="43.6001%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (801 samples, 1.68%)</title><rect x="41.7246%" y="1285" width="1.6822%" height="15" fill="rgb(213,166,10)" fg:x="19868" fg:w="801"/><text x="41.9746%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (780 samples, 1.64%)</title><rect x="41.7687%" y="1269" width="1.6381%" height="15" fill="rgb(207,163,36)" fg:x="19889" fg:w="780"/><text x="42.0187%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (15 samples, 0.03%)</title><rect x="43.3753%" y="1253" width="0.0315%" height="15" fill="rgb(208,122,22)" fg:x="20654" fg:w="15"/><text x="43.6253%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="43.4068%" y="1285" width="0.0273%" height="15" fill="rgb(207,104,49)" fg:x="20669" fg:w="13"/><text x="43.6568%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (15 samples, 0.03%)</title><rect x="43.4551%" y="1269" width="0.0315%" height="15" fill="rgb(248,211,50)" fg:x="20692" fg:w="15"/><text x="43.7051%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (11 samples, 0.02%)</title><rect x="43.4866%" y="1269" width="0.0231%" height="15" fill="rgb(217,13,45)" fg:x="20707" fg:w="11"/><text x="43.7366%" y="1279.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (16 samples, 0.03%)</title><rect x="43.6126%" y="1237" width="0.0336%" height="15" fill="rgb(211,216,49)" fg:x="20767" fg:w="16"/><text x="43.8626%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (7 samples, 0.01%)</title><rect x="43.6462%" y="1237" width="0.0147%" height="15" fill="rgb(221,58,53)" fg:x="20783" fg:w="7"/><text x="43.8962%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (10 samples, 0.02%)</title><rect x="43.6609%" y="1237" width="0.0210%" height="15" fill="rgb(220,112,41)" fg:x="20790" fg:w="10"/><text x="43.9109%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (56 samples, 0.12%)</title><rect x="43.5937%" y="1253" width="0.1176%" height="15" fill="rgb(236,38,28)" fg:x="20758" fg:w="56"/><text x="43.8437%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (14 samples, 0.03%)</title><rect x="43.6819%" y="1237" width="0.0294%" height="15" fill="rgb(227,195,22)" fg:x="20800" fg:w="14"/><text x="43.9319%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="43.7386%" y="1237" width="0.0168%" height="15" fill="rgb(214,55,33)" fg:x="20827" fg:w="8"/><text x="43.9886%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Function as core::fmt::Display&gt;::fmt (12 samples, 0.03%)</title><rect x="43.7554%" y="1237" width="0.0252%" height="15" fill="rgb(248,80,13)" fg:x="20835" fg:w="12"/><text x="44.0054%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArguments as core::fmt::Display&gt;::fmt (36 samples, 0.08%)</title><rect x="43.9066%" y="1205" width="0.0756%" height="15" fill="rgb(238,52,6)" fg:x="20907" fg:w="36"/><text x="44.1566%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (23 samples, 0.05%)</title><rect x="44.1460%" y="1173" width="0.0483%" height="15" fill="rgb(224,198,47)" fg:x="21021" fg:w="23"/><text x="44.3960%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (24 samples, 0.05%)</title><rect x="44.2888%" y="1157" width="0.0504%" height="15" fill="rgb(233,171,20)" fg:x="21089" fg:w="24"/><text x="44.5388%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (27 samples, 0.06%)</title><rect x="44.3392%" y="1157" width="0.0567%" height="15" fill="rgb(241,30,25)" fg:x="21113" fg:w="27"/><text x="44.5892%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="44.4148%" y="1141" width="0.0189%" height="15" fill="rgb(207,171,38)" fg:x="21149" fg:w="9"/><text x="44.6648%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (16 samples, 0.03%)</title><rect x="44.5366%" y="1109" width="0.0336%" height="15" fill="rgb(234,70,1)" fg:x="21207" fg:w="16"/><text x="44.7866%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (6 samples, 0.01%)</title><rect x="44.5702%" y="1109" width="0.0126%" height="15" fill="rgb(232,178,18)" fg:x="21223" fg:w="6"/><text x="44.8202%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArg as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="44.5828%" y="1109" width="0.0147%" height="15" fill="rgb(241,78,40)" fg:x="21229" fg:w="7"/><text x="44.8328%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="44.5975%" y="1109" width="0.0105%" height="15" fill="rgb(222,35,25)" fg:x="21236" fg:w="5"/><text x="44.8475%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (21 samples, 0.04%)</title><rect x="44.6080%" y="1109" width="0.0441%" height="15" fill="rgb(207,92,16)" fg:x="21241" fg:w="21"/><text x="44.8580%" y="1119.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="44.7592%" y="1093" width="0.0315%" height="15" fill="rgb(216,59,51)" fg:x="21313" fg:w="15"/><text x="45.0092%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (12 samples, 0.03%)</title><rect x="44.7907%" y="1093" width="0.0252%" height="15" fill="rgb(213,80,28)" fg:x="21328" fg:w="12"/><text x="45.0407%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgExpr as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="44.8537%" y="1077" width="0.0105%" height="15" fill="rgb(220,93,7)" fg:x="21358" fg:w="5"/><text x="45.1037%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (11 samples, 0.02%)</title><rect x="44.9587%" y="1045" width="0.0231%" height="15" fill="rgb(225,24,44)" fg:x="21408" fg:w="11"/><text x="45.2087%" y="1055.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (9 samples, 0.02%)</title><rect x="45.0658%" y="1013" width="0.0189%" height="15" fill="rgb(243,74,40)" fg:x="21459" fg:w="9"/><text x="45.3158%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (6 samples, 0.01%)</title><rect x="45.0847%" y="1013" width="0.0126%" height="15" fill="rgb(228,39,7)" fg:x="21468" fg:w="6"/><text x="45.3347%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (9 samples, 0.02%)</title><rect x="45.0973%" y="1013" width="0.0189%" height="15" fill="rgb(227,79,8)" fg:x="21474" fg:w="9"/><text x="45.3473%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (40 samples, 0.08%)</title><rect x="45.0574%" y="1029" width="0.0840%" height="15" fill="rgb(236,58,11)" fg:x="21455" fg:w="40"/><text x="45.3074%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (12 samples, 0.03%)</title><rect x="45.1162%" y="1013" width="0.0252%" height="15" fill="rgb(249,63,35)" fg:x="21483" fg:w="12"/><text x="45.3662%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (8 samples, 0.02%)</title><rect x="45.1960%" y="1013" width="0.0168%" height="15" fill="rgb(252,114,16)" fg:x="21521" fg:w="8"/><text x="45.4460%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (6 samples, 0.01%)</title><rect x="45.2128%" y="1013" width="0.0126%" height="15" fill="rgb(254,151,24)" fg:x="21529" fg:w="6"/><text x="45.4628%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="45.2254%" y="1013" width="0.0105%" height="15" fill="rgb(253,54,39)" fg:x="21535" fg:w="5"/><text x="45.4754%" y="1023.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (42 samples, 0.09%)</title><rect x="45.3304%" y="997" width="0.0882%" height="15" fill="rgb(243,25,45)" fg:x="21585" fg:w="42"/><text x="45.5804%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (19 samples, 0.04%)</title><rect x="45.4187%" y="997" width="0.0399%" height="15" fill="rgb(234,134,9)" fg:x="21627" fg:w="19"/><text x="45.6687%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (15 samples, 0.03%)</title><rect x="45.4586%" y="997" width="0.0315%" height="15" fill="rgb(227,166,31)" fg:x="21646" fg:w="15"/><text x="45.7086%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="45.4901%" y="997" width="0.0126%" height="15" fill="rgb(245,143,41)" fg:x="21661" fg:w="6"/><text x="45.7401%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (178 samples, 0.37%)</title><rect x="45.1414%" y="1029" width="0.3738%" height="15" fill="rgb(238,181,32)" fg:x="21495" fg:w="178"/><text x="45.3914%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (133 samples, 0.28%)</title><rect x="45.2359%" y="1013" width="0.2793%" height="15" fill="rgb(224,113,18)" fg:x="21540" fg:w="133"/><text x="45.4859%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (6 samples, 0.01%)</title><rect x="45.5027%" y="997" width="0.0126%" height="15" fill="rgb(240,229,28)" fg:x="21667" fg:w="6"/><text x="45.7527%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_fmt (10 samples, 0.02%)</title><rect x="45.5153%" y="1029" width="0.0210%" height="15" fill="rgb(250,185,3)" fg:x="21673" fg:w="10"/><text x="45.7653%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (11 samples, 0.02%)</title><rect x="45.5363%" y="1029" width="0.0231%" height="15" fill="rgb(212,59,25)" fg:x="21683" fg:w="11"/><text x="45.7863%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (23 samples, 0.05%)</title><rect x="45.5594%" y="1029" width="0.0483%" height="15" fill="rgb(221,87,20)" fg:x="21694" fg:w="23"/><text x="45.8094%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (7 samples, 0.01%)</title><rect x="45.6077%" y="1029" width="0.0147%" height="15" fill="rgb(213,74,28)" fg:x="21717" fg:w="7"/><text x="45.8577%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgExpr as core::fmt::Display&gt;::fmt (340 samples, 0.71%)</title><rect x="44.9209%" y="1061" width="0.7140%" height="15" fill="rgb(224,132,34)" fg:x="21390" fg:w="340"/><text x="45.1709%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (311 samples, 0.65%)</title><rect x="44.9818%" y="1045" width="0.6531%" height="15" fill="rgb(222,101,24)" fg:x="21419" fg:w="311"/><text x="45.2318%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (6 samples, 0.01%)</title><rect x="45.6224%" y="1029" width="0.0126%" height="15" fill="rgb(254,142,4)" fg:x="21724" fg:w="6"/><text x="45.8724%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArg as core::fmt::Display&gt;::fmt (401 samples, 0.84%)</title><rect x="44.8159%" y="1093" width="0.8421%" height="15" fill="rgb(230,229,49)" fg:x="21340" fg:w="401"/><text x="45.0659%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (378 samples, 0.79%)</title><rect x="44.8642%" y="1077" width="0.7938%" height="15" fill="rgb(238,70,47)" fg:x="21363" fg:w="378"/><text x="45.1142%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (11 samples, 0.02%)</title><rect x="45.6350%" y="1061" width="0.0231%" height="15" fill="rgb(231,160,17)" fg:x="21730" fg:w="11"/><text x="45.8850%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (9 samples, 0.02%)</title><rect x="45.6665%" y="1093" width="0.0189%" height="15" fill="rgb(218,68,53)" fg:x="21745" fg:w="9"/><text x="45.9165%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (580 samples, 1.22%)</title><rect x="44.5009%" y="1125" width="1.2181%" height="15" fill="rgb(236,111,10)" fg:x="21190" fg:w="580"/><text x="44.7509%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (508 samples, 1.07%)</title><rect x="44.6521%" y="1109" width="1.0668%" height="15" fill="rgb(224,34,41)" fg:x="21262" fg:w="508"/><text x="44.9021%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (16 samples, 0.03%)</title><rect x="45.6854%" y="1093" width="0.0336%" height="15" fill="rgb(241,118,19)" fg:x="21754" fg:w="16"/><text x="45.9354%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArgumentList as core::fmt::Display&gt;::fmt (655 samples, 1.38%)</title><rect x="44.3959%" y="1157" width="1.3756%" height="15" fill="rgb(238,129,25)" fg:x="21140" fg:w="655"/><text x="44.6459%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (637 samples, 1.34%)</title><rect x="44.4337%" y="1141" width="1.3378%" height="15" fill="rgb(238,22,31)" fg:x="21158" fg:w="637"/><text x="44.6837%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (25 samples, 0.05%)</title><rect x="45.7190%" y="1125" width="0.0525%" height="15" fill="rgb(222,174,48)" fg:x="21770" fg:w="25"/><text x="45.9690%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (10 samples, 0.02%)</title><rect x="45.7715%" y="1157" width="0.0210%" height="15" fill="rgb(206,152,40)" fg:x="21795" fg:w="10"/><text x="46.0215%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::FunctionArguments as core::fmt::Display&gt;::fmt (813 samples, 1.71%)</title><rect x="44.1145%" y="1189" width="1.7074%" height="15" fill="rgb(218,99,54)" fg:x="21006" fg:w="813"/><text x="44.3645%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (772 samples, 1.62%)</title><rect x="44.2006%" y="1173" width="1.6213%" height="15" fill="rgb(220,174,26)" fg:x="21047" fg:w="772"/><text x="44.4506%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (14 samples, 0.03%)</title><rect x="45.7925%" y="1157" width="0.0294%" height="15" fill="rgb(245,116,9)" fg:x="21805" fg:w="14"/><text x="46.0425%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="45.8618%" y="1173" width="0.0147%" height="15" fill="rgb(209,72,35)" fg:x="21838" fg:w="7"/><text x="46.1118%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (13 samples, 0.03%)</title><rect x="45.9857%" y="1141" width="0.0273%" height="15" fill="rgb(226,126,21)" fg:x="21897" fg:w="13"/><text x="46.2357%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (29 samples, 0.06%)</title><rect x="46.0130%" y="1141" width="0.0609%" height="15" fill="rgb(227,192,1)" fg:x="21910" fg:w="29"/><text x="46.2630%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (7 samples, 0.01%)</title><rect x="46.0823%" y="1141" width="0.0147%" height="15" fill="rgb(237,180,29)" fg:x="21943" fg:w="7"/><text x="46.3323%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (15 samples, 0.03%)</title><rect x="46.0970%" y="1141" width="0.0315%" height="15" fill="rgb(230,197,35)" fg:x="21950" fg:w="15"/><text x="46.3470%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (49 samples, 0.10%)</title><rect x="46.2188%" y="1125" width="0.1029%" height="15" fill="rgb(246,193,31)" fg:x="22008" fg:w="49"/><text x="46.4688%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (23 samples, 0.05%)</title><rect x="46.3217%" y="1125" width="0.0483%" height="15" fill="rgb(241,36,4)" fg:x="22057" fg:w="23"/><text x="46.5717%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (21 samples, 0.04%)</title><rect x="46.3700%" y="1125" width="0.0441%" height="15" fill="rgb(241,130,17)" fg:x="22080" fg:w="21"/><text x="46.6200%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (7 samples, 0.01%)</title><rect x="46.4288%" y="1125" width="0.0147%" height="15" fill="rgb(206,137,32)" fg:x="22108" fg:w="7"/><text x="46.6788%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (239 samples, 0.50%)</title><rect x="45.9458%" y="1157" width="0.5019%" height="15" fill="rgb(237,228,51)" fg:x="21878" fg:w="239"/><text x="46.1958%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (152 samples, 0.32%)</title><rect x="46.1285%" y="1141" width="0.3192%" height="15" fill="rgb(243,6,42)" fg:x="21965" fg:w="152"/><text x="46.3785%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::ObjectName as core::fmt::Display&gt;::fmt (320 samples, 0.67%)</title><rect x="45.8219%" y="1189" width="0.6720%" height="15" fill="rgb(251,74,28)" fg:x="21819" fg:w="320"/><text x="46.0719%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (294 samples, 0.62%)</title><rect x="45.8765%" y="1173" width="0.6174%" height="15" fill="rgb(218,20,49)" fg:x="21845" fg:w="294"/><text x="46.1265%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (22 samples, 0.05%)</title><rect x="46.4477%" y="1157" width="0.0462%" height="15" fill="rgb(238,28,14)" fg:x="22117" fg:w="22"/><text x="46.6977%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Function as core::fmt::Display&gt;::fmt (1,284 samples, 2.70%)</title><rect x="43.8541%" y="1221" width="2.6965%" height="15" fill="rgb(229,40,46)" fg:x="20882" fg:w="1284"/><text x="44.1041%" y="1231.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,221 samples, 2.56%)</title><rect x="43.9864%" y="1205" width="2.5642%" height="15" fill="rgb(244,195,20)" fg:x="20945" fg:w="1221"/><text x="44.2364%" y="1215.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="46.4939%" y="1189" width="0.0567%" height="15" fill="rgb(253,56,35)" fg:x="22139" fg:w="27"/><text x="46.7439%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,364 samples, 2.86%)</title><rect x="43.7113%" y="1253" width="2.8645%" height="15" fill="rgb(210,149,44)" fg:x="20814" fg:w="1364"/><text x="43.9613%" y="1263.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,331 samples, 2.80%)</title><rect x="43.7806%" y="1237" width="2.7952%" height="15" fill="rgb(240,135,12)" fg:x="20847" fg:w="1331"/><text x="44.0306%" y="1247.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (12 samples, 0.03%)</title><rect x="46.5506%" y="1221" width="0.0252%" height="15" fill="rgb(251,24,50)" fg:x="22166" fg:w="12"/><text x="46.8006%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="46.5842%" y="1253" width="0.0273%" height="15" fill="rgb(243,200,47)" fg:x="22182" fg:w="13"/><text x="46.8342%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (9 samples, 0.02%)</title><rect x="46.6115%" y="1253" width="0.0189%" height="15" fill="rgb(224,166,26)" fg:x="22195" fg:w="9"/><text x="46.8615%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (8 samples, 0.02%)</title><rect x="46.6304%" y="1253" width="0.0168%" height="15" fill="rgb(233,0,47)" fg:x="22204" fg:w="8"/><text x="46.8804%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::SelectItem as core::fmt::Display&gt;::fmt (1,540 samples, 3.23%)</title><rect x="43.4341%" y="1285" width="3.2341%" height="15" fill="rgb(253,80,5)" fg:x="20682" fg:w="1540"/><text x="43.6841%" y="1295.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,504 samples, 3.16%)</title><rect x="43.5097%" y="1269" width="3.1585%" height="15" fill="rgb(214,133,25)" fg:x="20718" fg:w="1504"/><text x="43.7597%" y="1279.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (10 samples, 0.02%)</title><rect x="46.6472%" y="1253" width="0.0210%" height="15" fill="rgb(209,27,14)" fg:x="22212" fg:w="10"/><text x="46.8972%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (5 samples, 0.01%)</title><rect x="46.6766%" y="1285" width="0.0105%" height="15" fill="rgb(219,102,51)" fg:x="22226" fg:w="5"/><text x="46.9266%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::DisplaySeparated&lt;T&gt; as core::fmt::Display&gt;::fmt (2,493 samples, 5.24%)</title><rect x="41.4957%" y="1317" width="5.2355%" height="15" fill="rgb(237,18,16)" fg:x="19759" fg:w="2493"/><text x="41.7457%" y="1327.50">sqlpar..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (2,446 samples, 5.14%)</title><rect x="41.5944%" y="1301" width="5.1368%" height="15" fill="rgb(241,85,17)" fg:x="19806" fg:w="2446"/><text x="41.8444%" y="1311.50">sqlpar..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (21 samples, 0.04%)</title><rect x="46.6871%" y="1285" width="0.0441%" height="15" fill="rgb(236,90,42)" fg:x="22231" fg:w="21"/><text x="46.9371%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (10 samples, 0.02%)</title><rect x="46.7795%" y="229" width="0.0210%" height="15" fill="rgb(249,57,21)" fg:x="22275" fg:w="10"/><text x="47.0295%" y="239.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (9 samples, 0.02%)</title><rect x="46.7816%" y="213" width="0.0189%" height="15" fill="rgb(243,12,36)" fg:x="22276" fg:w="9"/><text x="47.0316%" y="223.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (8 samples, 0.02%)</title><rect x="46.7837%" y="197" width="0.0168%" height="15" fill="rgb(253,128,47)" fg:x="22277" fg:w="8"/><text x="47.0337%" y="207.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (7 samples, 0.01%)</title><rect x="46.7858%" y="181" width="0.0147%" height="15" fill="rgb(207,33,20)" fg:x="22278" fg:w="7"/><text x="47.0358%" y="191.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (14 samples, 0.03%)</title><rect x="46.7732%" y="293" width="0.0294%" height="15" fill="rgb(233,215,35)" fg:x="22272" fg:w="14"/><text x="47.0232%" y="303.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (14 samples, 0.03%)</title><rect x="46.7732%" y="277" width="0.0294%" height="15" fill="rgb(249,188,52)" fg:x="22272" fg:w="14"/><text x="47.0232%" y="287.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (14 samples, 0.03%)</title><rect x="46.7732%" y="261" width="0.0294%" height="15" fill="rgb(225,12,32)" fg:x="22272" fg:w="14"/><text x="47.0232%" y="271.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (12 samples, 0.03%)</title><rect x="46.7774%" y="245" width="0.0252%" height="15" fill="rgb(247,98,14)" fg:x="22274" fg:w="12"/><text x="47.0274%" y="255.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (15 samples, 0.03%)</title><rect x="46.7732%" y="325" width="0.0315%" height="15" fill="rgb(247,219,48)" fg:x="22272" fg:w="15"/><text x="47.0232%" y="335.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (15 samples, 0.03%)</title><rect x="46.7732%" y="309" width="0.0315%" height="15" fill="rgb(253,60,48)" fg:x="22272" fg:w="15"/><text x="47.0232%" y="319.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (16 samples, 0.03%)</title><rect x="46.7732%" y="357" width="0.0336%" height="15" fill="rgb(245,15,52)" fg:x="22272" fg:w="16"/><text x="47.0232%" y="367.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (16 samples, 0.03%)</title><rect x="46.7732%" y="341" width="0.0336%" height="15" fill="rgb(220,133,28)" fg:x="22272" fg:w="16"/><text x="47.0232%" y="351.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (23 samples, 0.05%)</title><rect x="46.7606%" y="421" width="0.0483%" height="15" fill="rgb(217,180,4)" fg:x="22266" fg:w="23"/><text x="47.0106%" y="431.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (22 samples, 0.05%)</title><rect x="46.7627%" y="405" width="0.0462%" height="15" fill="rgb(251,24,1)" fg:x="22267" fg:w="22"/><text x="47.0127%" y="415.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (19 samples, 0.04%)</title><rect x="46.7690%" y="389" width="0.0399%" height="15" fill="rgb(212,185,49)" fg:x="22270" fg:w="19"/><text x="47.0190%" y="399.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (18 samples, 0.04%)</title><rect x="46.7711%" y="373" width="0.0378%" height="15" fill="rgb(215,175,22)" fg:x="22271" fg:w="18"/><text x="47.0211%" y="383.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (26 samples, 0.05%)</title><rect x="46.7585%" y="485" width="0.0546%" height="15" fill="rgb(250,205,14)" fg:x="22265" fg:w="26"/><text x="47.0085%" y="495.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="46.7585%" y="469" width="0.0546%" height="15" fill="rgb(225,211,22)" fg:x="22265" fg:w="26"/><text x="47.0085%" y="479.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (26 samples, 0.05%)</title><rect x="46.7585%" y="453" width="0.0546%" height="15" fill="rgb(251,179,42)" fg:x="22265" fg:w="26"/><text x="47.0085%" y="463.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (25 samples, 0.05%)</title><rect x="46.7606%" y="437" width="0.0525%" height="15" fill="rgb(208,216,51)" fg:x="22266" fg:w="25"/><text x="47.0106%" y="447.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (27 samples, 0.06%)</title><rect x="46.7585%" y="581" width="0.0567%" height="15" fill="rgb(235,36,11)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="591.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="46.7585%" y="565" width="0.0567%" height="15" fill="rgb(213,189,28)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="575.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (27 samples, 0.06%)</title><rect x="46.7585%" y="549" width="0.0567%" height="15" fill="rgb(227,203,42)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="559.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="46.7585%" y="533" width="0.0567%" height="15" fill="rgb(244,72,36)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="543.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (27 samples, 0.06%)</title><rect x="46.7585%" y="517" width="0.0567%" height="15" fill="rgb(213,53,17)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="527.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="46.7585%" y="501" width="0.0567%" height="15" fill="rgb(207,167,3)" fg:x="22265" fg:w="27"/><text x="47.0085%" y="511.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (30 samples, 0.06%)</title><rect x="46.7564%" y="677" width="0.0630%" height="15" fill="rgb(216,98,30)" fg:x="22264" fg:w="30"/><text x="47.0064%" y="687.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (30 samples, 0.06%)</title><rect x="46.7564%" y="661" width="0.0630%" height="15" fill="rgb(236,123,15)" fg:x="22264" fg:w="30"/><text x="47.0064%" y="671.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (30 samples, 0.06%)</title><rect x="46.7564%" y="645" width="0.0630%" height="15" fill="rgb(248,81,50)" fg:x="22264" fg:w="30"/><text x="47.0064%" y="655.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (29 samples, 0.06%)</title><rect x="46.7585%" y="629" width="0.0609%" height="15" fill="rgb(214,120,4)" fg:x="22265" fg:w="29"/><text x="47.0085%" y="639.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (29 samples, 0.06%)</title><rect x="46.7585%" y="613" width="0.0609%" height="15" fill="rgb(208,179,34)" fg:x="22265" fg:w="29"/><text x="47.0085%" y="623.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (29 samples, 0.06%)</title><rect x="46.7585%" y="597" width="0.0609%" height="15" fill="rgb(227,140,7)" fg:x="22265" fg:w="29"/><text x="47.0085%" y="607.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (32 samples, 0.07%)</title><rect x="46.7543%" y="741" width="0.0672%" height="15" fill="rgb(214,22,6)" fg:x="22263" fg:w="32"/><text x="47.0043%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (32 samples, 0.07%)</title><rect x="46.7543%" y="725" width="0.0672%" height="15" fill="rgb(207,137,27)" fg:x="22263" fg:w="32"/><text x="47.0043%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (31 samples, 0.07%)</title><rect x="46.7564%" y="709" width="0.0651%" height="15" fill="rgb(210,8,46)" fg:x="22264" fg:w="31"/><text x="47.0064%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (31 samples, 0.07%)</title><rect x="46.7564%" y="693" width="0.0651%" height="15" fill="rgb(240,16,54)" fg:x="22264" fg:w="31"/><text x="47.0064%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (33 samples, 0.07%)</title><rect x="46.7543%" y="773" width="0.0693%" height="15" fill="rgb(211,209,29)" fg:x="22263" fg:w="33"/><text x="47.0043%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (33 samples, 0.07%)</title><rect x="46.7543%" y="757" width="0.0693%" height="15" fill="rgb(226,228,24)" fg:x="22263" fg:w="33"/><text x="47.0043%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (36 samples, 0.08%)</title><rect x="46.7501%" y="869" width="0.0756%" height="15" fill="rgb(222,84,9)" fg:x="22261" fg:w="36"/><text x="47.0001%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (36 samples, 0.08%)</title><rect x="46.7501%" y="853" width="0.0756%" height="15" fill="rgb(234,203,30)" fg:x="22261" fg:w="36"/><text x="47.0001%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (35 samples, 0.07%)</title><rect x="46.7522%" y="837" width="0.0735%" height="15" fill="rgb(238,109,14)" fg:x="22262" fg:w="35"/><text x="47.0022%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (35 samples, 0.07%)</title><rect x="46.7522%" y="821" width="0.0735%" height="15" fill="rgb(233,206,34)" fg:x="22262" fg:w="35"/><text x="47.0022%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (34 samples, 0.07%)</title><rect x="46.7543%" y="805" width="0.0714%" height="15" fill="rgb(220,167,47)" fg:x="22263" fg:w="34"/><text x="47.0043%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (34 samples, 0.07%)</title><rect x="46.7543%" y="789" width="0.0714%" height="15" fill="rgb(238,105,10)" fg:x="22263" fg:w="34"/><text x="47.0043%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (38 samples, 0.08%)</title><rect x="46.7480%" y="933" width="0.0798%" height="15" fill="rgb(213,227,17)" fg:x="22260" fg:w="38"/><text x="46.9980%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (38 samples, 0.08%)</title><rect x="46.7480%" y="917" width="0.0798%" height="15" fill="rgb(217,132,38)" fg:x="22260" fg:w="38"/><text x="46.9980%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (38 samples, 0.08%)</title><rect x="46.7480%" y="901" width="0.0798%" height="15" fill="rgb(242,146,4)" fg:x="22260" fg:w="38"/><text x="46.9980%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (38 samples, 0.08%)</title><rect x="46.7480%" y="885" width="0.0798%" height="15" fill="rgb(212,61,9)" fg:x="22260" fg:w="38"/><text x="46.9980%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (41 samples, 0.09%)</title><rect x="46.7438%" y="1029" width="0.0861%" height="15" fill="rgb(247,126,22)" fg:x="22258" fg:w="41"/><text x="46.9938%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (40 samples, 0.08%)</title><rect x="46.7459%" y="1013" width="0.0840%" height="15" fill="rgb(220,196,2)" fg:x="22259" fg:w="40"/><text x="46.9959%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (40 samples, 0.08%)</title><rect x="46.7459%" y="997" width="0.0840%" height="15" fill="rgb(208,46,4)" fg:x="22259" fg:w="40"/><text x="46.9959%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (40 samples, 0.08%)</title><rect x="46.7459%" y="981" width="0.0840%" height="15" fill="rgb(252,104,46)" fg:x="22259" fg:w="40"/><text x="46.9959%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (39 samples, 0.08%)</title><rect x="46.7480%" y="965" width="0.0819%" height="15" fill="rgb(237,152,48)" fg:x="22260" fg:w="39"/><text x="46.9980%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (39 samples, 0.08%)</title><rect x="46.7480%" y="949" width="0.0819%" height="15" fill="rgb(221,59,37)" fg:x="22260" fg:w="39"/><text x="46.9980%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (44 samples, 0.09%)</title><rect x="46.7396%" y="1061" width="0.0924%" height="15" fill="rgb(209,202,51)" fg:x="22256" fg:w="44"/><text x="46.9896%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (42 samples, 0.09%)</title><rect x="46.7438%" y="1045" width="0.0882%" height="15" fill="rgb(228,81,30)" fg:x="22258" fg:w="42"/><text x="46.9938%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (48 samples, 0.10%)</title><rect x="46.7333%" y="1157" width="0.1008%" height="15" fill="rgb(227,42,39)" fg:x="22253" fg:w="48"/><text x="46.9833%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (47 samples, 0.10%)</title><rect x="46.7354%" y="1141" width="0.0987%" height="15" fill="rgb(221,26,2)" fg:x="22254" fg:w="47"/><text x="46.9854%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (47 samples, 0.10%)</title><rect x="46.7354%" y="1125" width="0.0987%" height="15" fill="rgb(254,61,31)" fg:x="22254" fg:w="47"/><text x="46.9854%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (47 samples, 0.10%)</title><rect x="46.7354%" y="1109" width="0.0987%" height="15" fill="rgb(222,173,38)" fg:x="22254" fg:w="47"/><text x="46.9854%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (46 samples, 0.10%)</title><rect x="46.7375%" y="1093" width="0.0966%" height="15" fill="rgb(218,50,12)" fg:x="22255" fg:w="46"/><text x="46.9875%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (45 samples, 0.09%)</title><rect x="46.7396%" y="1077" width="0.0945%" height="15" fill="rgb(223,88,40)" fg:x="22256" fg:w="45"/><text x="46.9896%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (51 samples, 0.11%)</title><rect x="46.7312%" y="1317" width="0.1071%" height="15" fill="rgb(237,54,19)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="46.7312%" y="1301" width="0.1071%" height="15" fill="rgb(251,129,25)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (51 samples, 0.11%)</title><rect x="46.7312%" y="1285" width="0.1071%" height="15" fill="rgb(238,97,19)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="46.7312%" y="1269" width="0.1071%" height="15" fill="rgb(240,169,18)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (51 samples, 0.11%)</title><rect x="46.7312%" y="1253" width="0.1071%" height="15" fill="rgb(230,187,49)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="46.7312%" y="1237" width="0.1071%" height="15" fill="rgb(209,44,26)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (51 samples, 0.11%)</title><rect x="46.7312%" y="1221" width="0.1071%" height="15" fill="rgb(244,0,6)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="46.7312%" y="1205" width="0.1071%" height="15" fill="rgb(248,18,21)" fg:x="22252" fg:w="51"/><text x="46.9812%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (50 samples, 0.11%)</title><rect x="46.7333%" y="1189" width="0.1050%" height="15" fill="rgb(245,180,19)" fg:x="22253" fg:w="50"/><text x="46.9833%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (50 samples, 0.11%)</title><rect x="46.7333%" y="1173" width="0.1050%" height="15" fill="rgb(252,118,36)" fg:x="22253" fg:w="50"/><text x="46.9833%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Statement as core::fmt::Display&gt;::fmt (3,140 samples, 6.59%)</title><rect x="40.2986%" y="1445" width="6.5943%" height="15" fill="rgb(210,224,19)" fg:x="19189" fg:w="3140"/><text x="40.5486%" y="1455.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,140 samples, 6.59%)</title><rect x="40.2986%" y="1429" width="6.5943%" height="15" fill="rgb(218,30,24)" fg:x="19189" fg:w="3140"/><text x="40.5486%" y="1439.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Query as core::fmt::Display&gt;::fmt (3,140 samples, 6.59%)</title><rect x="40.2986%" y="1413" width="6.5943%" height="15" fill="rgb(219,75,50)" fg:x="19189" fg:w="3140"/><text x="40.5486%" y="1423.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (3,140 samples, 6.59%)</title><rect x="40.2986%" y="1397" width="6.5943%" height="15" fill="rgb(234,72,50)" fg:x="19189" fg:w="3140"/><text x="40.5486%" y="1407.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::SetExpr as core::fmt::Display&gt;::fmt (2,570 samples, 5.40%)</title><rect x="41.4957%" y="1381" width="5.3972%" height="15" fill="rgb(219,100,48)" fg:x="19759" fg:w="2570"/><text x="41.7457%" y="1391.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (2,570 samples, 5.40%)</title><rect x="41.4957%" y="1365" width="5.3972%" height="15" fill="rgb(253,5,41)" fg:x="19759" fg:w="2570"/><text x="41.7457%" y="1375.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::query::Select as core::fmt::Display&gt;::fmt (2,570 samples, 5.40%)</title><rect x="41.4957%" y="1349" width="5.3972%" height="15" fill="rgb(247,181,11)" fg:x="19759" fg:w="2570"/><text x="41.7457%" y="1359.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (2,570 samples, 5.40%)</title><rect x="41.4957%" y="1333" width="5.3972%" height="15" fill="rgb(222,223,25)" fg:x="19759" fg:w="2570"/><text x="41.7457%" y="1343.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="46.8383%" y="1317" width="0.0546%" height="15" fill="rgb(214,198,28)" fg:x="22303" fg:w="26"/><text x="47.0883%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (24 samples, 0.05%)</title><rect x="46.8929%" y="1445" width="0.0504%" height="15" fill="rgb(230,46,43)" fg:x="22329" fg:w="24"/><text x="47.1429%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="46.9454%" y="1429" width="0.0126%" height="15" fill="rgb(233,65,53)" fg:x="22354" fg:w="6"/><text x="47.1954%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="46.9664%" y="1429" width="0.0105%" height="15" fill="rgb(221,121,27)" fg:x="22364" fg:w="5"/><text x="47.2164%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`_free (14 samples, 0.03%)</title><rect x="47.0000%" y="1413" width="0.0294%" height="15" fill="rgb(247,70,47)" fg:x="22380" fg:w="14"/><text x="47.2500%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="47.0294%" y="1413" width="0.0252%" height="15" fill="rgb(228,85,35)" fg:x="22394" fg:w="12"/><text x="47.2794%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (18 samples, 0.04%)</title><rect x="47.0546%" y="1413" width="0.0378%" height="15" fill="rgb(209,50,18)" fg:x="22406" fg:w="18"/><text x="47.3046%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (8 samples, 0.02%)</title><rect x="47.1638%" y="1397" width="0.0168%" height="15" fill="rgb(250,19,35)" fg:x="22458" fg:w="8"/><text x="47.4138%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr (7 samples, 0.01%)</title><rect x="47.1890%" y="1397" width="0.0147%" height="15" fill="rgb(253,107,29)" fg:x="22470" fg:w="7"/><text x="47.4390%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_small (64 samples, 0.13%)</title><rect x="47.0924%" y="1413" width="0.1344%" height="15" fill="rgb(252,179,29)" fg:x="22424" fg:w="64"/><text x="47.3424%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (11 samples, 0.02%)</title><rect x="47.2037%" y="1397" width="0.0231%" height="15" fill="rgb(238,194,6)" fg:x="22477" fg:w="11"/><text x="47.4537%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (8 samples, 0.02%)</title><rect x="47.2373%" y="1413" width="0.0168%" height="15" fill="rgb(238,164,29)" fg:x="22493" fg:w="8"/><text x="47.4873%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="47.2772%" y="1381" width="0.0147%" height="15" fill="rgb(224,25,9)" fg:x="22512" fg:w="7"/><text x="47.5272%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="47.3150%" y="1365" width="0.0147%" height="15" fill="rgb(244,153,23)" fg:x="22530" fg:w="7"/><text x="47.5650%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`free_small (7 samples, 0.01%)</title><rect x="47.3318%" y="1365" width="0.0147%" height="15" fill="rgb(212,203,14)" fg:x="22538" fg:w="7"/><text x="47.5818%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="47.3696%" y="1333" width="0.0168%" height="15" fill="rgb(220,164,20)" fg:x="22556" fg:w="8"/><text x="47.6196%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`free_small (8 samples, 0.02%)</title><rect x="47.4011%" y="1317" width="0.0168%" height="15" fill="rgb(222,203,48)" fg:x="22571" fg:w="8"/><text x="47.6511%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Function&gt; (28 samples, 0.06%)</title><rect x="47.3612%" y="1349" width="0.0588%" height="15" fill="rgb(215,159,22)" fg:x="22552" fg:w="28"/><text x="47.6112%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::FunctionArgumentList&gt; (12 samples, 0.03%)</title><rect x="47.3948%" y="1333" width="0.0252%" height="15" fill="rgb(216,183,47)" fg:x="22568" fg:w="12"/><text x="47.6448%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Cte&gt; (77 samples, 0.16%)</title><rect x="47.2604%" y="1413" width="0.1617%" height="15" fill="rgb(229,195,25)" fg:x="22504" fg:w="77"/><text x="47.5104%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Query&gt; (69 samples, 0.14%)</title><rect x="47.2772%" y="1397" width="0.1449%" height="15" fill="rgb(224,132,51)" fg:x="22512" fg:w="69"/><text x="47.5272%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SetExpr&gt; (53 samples, 0.11%)</title><rect x="47.3108%" y="1381" width="0.1113%" height="15" fill="rgb(240,63,7)" fg:x="22528" fg:w="53"/><text x="47.5608%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SelectItem&gt; (32 samples, 0.07%)</title><rect x="47.3549%" y="1365" width="0.0672%" height="15" fill="rgb(249,182,41)" fg:x="22549" fg:w="32"/><text x="47.6049%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="47.4221%" y="1397" width="0.0252%" height="15" fill="rgb(243,47,26)" fg:x="22581" fg:w="12"/><text x="47.6721%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (28 samples, 0.06%)</title><rect x="47.4473%" y="1397" width="0.0588%" height="15" fill="rgb(233,48,2)" fg:x="22593" fg:w="28"/><text x="47.6973%" y="1407.50"></text></g><g><title>libsystem_kernel.dylib`madvise (28 samples, 0.06%)</title><rect x="47.4473%" y="1381" width="0.0588%" height="15" fill="rgb(244,165,34)" fg:x="22593" fg:w="28"/><text x="47.6973%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::OrderBy&gt; (42 samples, 0.09%)</title><rect x="47.4221%" y="1413" width="0.0882%" height="15" fill="rgb(207,89,7)" fg:x="22581" fg:w="42"/><text x="47.6721%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_free (10 samples, 0.02%)</title><rect x="47.5460%" y="1397" width="0.0210%" height="15" fill="rgb(244,117,36)" fg:x="22640" fg:w="10"/><text x="47.7960%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (20 samples, 0.04%)</title><rect x="47.5670%" y="1397" width="0.0420%" height="15" fill="rgb(226,144,34)" fg:x="22650" fg:w="20"/><text x="47.8170%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (10 samples, 0.02%)</title><rect x="47.6090%" y="1397" width="0.0210%" height="15" fill="rgb(213,23,19)" fg:x="22670" fg:w="10"/><text x="47.8590%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (27 samples, 0.06%)</title><rect x="47.6300%" y="1397" width="0.0567%" height="15" fill="rgb(217,75,12)" fg:x="22680" fg:w="27"/><text x="47.8800%" y="1407.50"></text></g><g><title>libsystem_kernel.dylib`madvise (27 samples, 0.06%)</title><rect x="47.6300%" y="1381" width="0.0567%" height="15" fill="rgb(224,159,17)" fg:x="22680" fg:w="27"/><text x="47.8800%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (14 samples, 0.03%)</title><rect x="47.7603%" y="1381" width="0.0294%" height="15" fill="rgb(217,118,1)" fg:x="22742" fg:w="14"/><text x="48.0103%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_find_by_ptr (5 samples, 0.01%)</title><rect x="47.7897%" y="1381" width="0.0105%" height="15" fill="rgb(232,180,48)" fg:x="22756" fg:w="5"/><text x="48.0397%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`free_small (64 samples, 0.13%)</title><rect x="47.6868%" y="1397" width="0.1344%" height="15" fill="rgb(230,27,33)" fg:x="22707" fg:w="64"/><text x="47.9368%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (8 samples, 0.02%)</title><rect x="47.8044%" y="1381" width="0.0168%" height="15" fill="rgb(205,31,21)" fg:x="22763" fg:w="8"/><text x="48.0544%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (5 samples, 0.01%)</title><rect x="47.8821%" y="1365" width="0.0105%" height="15" fill="rgb(253,59,4)" fg:x="22800" fg:w="5"/><text x="48.1321%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (40 samples, 0.08%)</title><rect x="47.8212%" y="1397" width="0.0840%" height="15" fill="rgb(224,201,9)" fg:x="22771" fg:w="40"/><text x="48.0712%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (23 samples, 0.05%)</title><rect x="47.8569%" y="1381" width="0.0483%" height="15" fill="rgb(229,206,30)" fg:x="22788" fg:w="23"/><text x="48.1069%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (6 samples, 0.01%)</title><rect x="47.8926%" y="1365" width="0.0126%" height="15" fill="rgb(212,67,47)" fg:x="22805" fg:w="6"/><text x="48.1426%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="47.9262%" y="1381" width="0.0126%" height="15" fill="rgb(211,96,50)" fg:x="22821" fg:w="6"/><text x="48.1762%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="47.9388%" y="1381" width="0.0231%" height="15" fill="rgb(252,114,18)" fg:x="22827" fg:w="11"/><text x="48.1888%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (12 samples, 0.03%)</title><rect x="47.9619%" y="1381" width="0.0252%" height="15" fill="rgb(223,58,37)" fg:x="22838" fg:w="12"/><text x="48.2119%" y="1391.50"></text></g><g><title>libsystem_kernel.dylib`madvise (12 samples, 0.03%)</title><rect x="47.9619%" y="1365" width="0.0252%" height="15" fill="rgb(237,70,4)" fg:x="22838" fg:w="12"/><text x="48.2119%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="47.9955%" y="1381" width="0.0105%" height="15" fill="rgb(244,85,46)" fg:x="22854" fg:w="5"/><text x="48.2455%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (45 samples, 0.09%)</title><rect x="48.0459%" y="1365" width="0.0945%" height="15" fill="rgb(223,39,52)" fg:x="22878" fg:w="45"/><text x="48.2959%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (13 samples, 0.03%)</title><rect x="48.1404%" y="1365" width="0.0273%" height="15" fill="rgb(218,200,14)" fg:x="22923" fg:w="13"/><text x="48.3904%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (13 samples, 0.03%)</title><rect x="48.1404%" y="1349" width="0.0273%" height="15" fill="rgb(208,171,16)" fg:x="22923" fg:w="13"/><text x="48.3904%" y="1359.50"></text></g><g><title>libsystem_kernel.dylib`madvise (13 samples, 0.03%)</title><rect x="48.1404%" y="1333" width="0.0273%" height="15" fill="rgb(234,200,18)" fg:x="22923" fg:w="13"/><text x="48.3904%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::vec::Vec&lt;T,A&gt; as core::ops::drop::Drop&gt;::drop (133 samples, 0.28%)</title><rect x="47.9157%" y="1397" width="0.2793%" height="15" fill="rgb(228,45,11)" fg:x="22816" fg:w="133"/><text x="48.1657%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::TableFactor&gt; (89 samples, 0.19%)</title><rect x="48.0081%" y="1381" width="0.1869%" height="15" fill="rgb(237,182,11)" fg:x="22860" fg:w="89"/><text x="48.2581%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (13 samples, 0.03%)</title><rect x="48.1677%" y="1365" width="0.0273%" height="15" fill="rgb(241,175,49)" fg:x="22936" fg:w="13"/><text x="48.4177%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (9 samples, 0.02%)</title><rect x="48.1950%" y="1397" width="0.0189%" height="15" fill="rgb(247,38,35)" fg:x="22949" fg:w="9"/><text x="48.4450%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="48.2181%" y="1381" width="0.0189%" height="15" fill="rgb(228,39,49)" fg:x="22960" fg:w="9"/><text x="48.4681%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (11 samples, 0.02%)</title><rect x="48.2181%" y="1397" width="0.0231%" height="15" fill="rgb(226,101,26)" fg:x="22960" fg:w="11"/><text x="48.4681%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_free (6 samples, 0.01%)</title><rect x="48.2475%" y="1381" width="0.0126%" height="15" fill="rgb(206,141,19)" fg:x="22974" fg:w="6"/><text x="48.4975%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (25 samples, 0.05%)</title><rect x="48.2643%" y="1381" width="0.0525%" height="15" fill="rgb(211,200,13)" fg:x="22982" fg:w="25"/><text x="48.5143%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (15 samples, 0.03%)</title><rect x="48.2853%" y="1365" width="0.0315%" height="15" fill="rgb(241,121,6)" fg:x="22992" fg:w="15"/><text x="48.5353%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (9 samples, 0.02%)</title><rect x="48.2979%" y="1349" width="0.0189%" height="15" fill="rgb(234,221,29)" fg:x="22998" fg:w="9"/><text x="48.5479%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="48.3231%" y="1365" width="0.0168%" height="15" fill="rgb(229,136,5)" fg:x="23010" fg:w="8"/><text x="48.5731%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (15 samples, 0.03%)</title><rect x="48.3231%" y="1381" width="0.0315%" height="15" fill="rgb(238,36,11)" fg:x="23010" fg:w="15"/><text x="48.5731%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="48.3420%" y="1365" width="0.0126%" height="15" fill="rgb(251,55,41)" fg:x="23019" fg:w="6"/><text x="48.5920%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (56 samples, 0.12%)</title><rect x="48.2412%" y="1397" width="0.1176%" height="15" fill="rgb(242,34,40)" fg:x="22971" fg:w="56"/><text x="48.4912%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="48.3735%" y="1381" width="0.0231%" height="15" fill="rgb(215,42,17)" fg:x="23034" fg:w="11"/><text x="48.6235%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="48.3987%" y="1365" width="0.0105%" height="15" fill="rgb(207,44,46)" fg:x="23046" fg:w="5"/><text x="48.6487%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (7 samples, 0.01%)</title><rect x="48.4092%" y="1365" width="0.0147%" height="15" fill="rgb(211,206,28)" fg:x="23051" fg:w="7"/><text x="48.6592%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (14 samples, 0.03%)</title><rect x="48.4407%" y="1349" width="0.0294%" height="15" fill="rgb(237,167,16)" fg:x="23066" fg:w="14"/><text x="48.6907%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`free_small (28 samples, 0.06%)</title><rect x="48.4239%" y="1365" width="0.0588%" height="15" fill="rgb(233,66,6)" fg:x="23058" fg:w="28"/><text x="48.6739%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (6 samples, 0.01%)</title><rect x="48.4701%" y="1349" width="0.0126%" height="15" fill="rgb(246,123,29)" fg:x="23080" fg:w="6"/><text x="48.7201%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Function&gt; (63 samples, 0.13%)</title><rect x="48.3588%" y="1397" width="0.1323%" height="15" fill="rgb(209,62,40)" fg:x="23027" fg:w="63"/><text x="48.6088%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::FunctionArgumentList&gt; (44 samples, 0.09%)</title><rect x="48.3987%" y="1381" width="0.0924%" height="15" fill="rgb(218,4,25)" fg:x="23046" fg:w="44"/><text x="48.6487%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::SetExpr&gt; (478 samples, 1.00%)</title><rect x="47.5124%" y="1413" width="1.0038%" height="15" fill="rgb(253,91,49)" fg:x="22624" fg:w="478"/><text x="47.7624%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::query::Query&gt;&gt; (753 samples, 1.58%)</title><rect x="46.9454%" y="1445" width="1.5814%" height="15" fill="rgb(228,155,29)" fg:x="22354" fg:w="753"/><text x="47.1954%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::query::Query&gt; (737 samples, 1.55%)</title><rect x="46.9790%" y="1429" width="1.5478%" height="15" fill="rgb(243,57,37)" fg:x="22370" fg:w="737"/><text x="47.2290%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (142 samples, 0.30%)</title><rect x="48.5394%" y="1445" width="0.2982%" height="15" fill="rgb(244,167,17)" fg:x="23113" fg:w="142"/><text x="48.7894%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Whitespace&gt; (32 samples, 0.07%)</title><rect x="48.8376%" y="1445" width="0.0672%" height="15" fill="rgb(207,181,38)" fg:x="23255" fg:w="32"/><text x="49.0876%" y="1455.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (121 samples, 0.25%)</title><rect x="49.0161%" y="1429" width="0.2541%" height="15" fill="rgb(211,8,23)" fg:x="23340" fg:w="121"/><text x="49.2661%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (45 samples, 0.09%)</title><rect x="49.2723%" y="1429" width="0.0945%" height="15" fill="rgb(235,11,44)" fg:x="23462" fg:w="45"/><text x="49.5223%" y="1439.50"></text></g><g><title>libsystem_kernel.dylib`madvise (45 samples, 0.09%)</title><rect x="49.2723%" y="1413" width="0.0945%" height="15" fill="rgb(248,18,52)" fg:x="23462" fg:w="45"/><text x="49.5223%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`free_small (5 samples, 0.01%)</title><rect x="49.3668%" y="1429" width="0.0105%" height="15" fill="rgb(208,4,7)" fg:x="23507" fg:w="5"/><text x="49.6168%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block (6 samples, 0.01%)</title><rect x="49.3773%" y="1429" width="0.0126%" height="15" fill="rgb(240,17,39)" fg:x="23512" fg:w="6"/><text x="49.6273%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_madvise_block_locked (6 samples, 0.01%)</title><rect x="49.3773%" y="1413" width="0.0126%" height="15" fill="rgb(207,170,3)" fg:x="23512" fg:w="6"/><text x="49.6273%" y="1423.50"></text></g><g><title>libsystem_kernel.dylib`madvise (6 samples, 0.01%)</title><rect x="49.3773%" y="1397" width="0.0126%" height="15" fill="rgb(236,100,52)" fg:x="23512" fg:w="6"/><text x="49.6273%" y="1407.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (95 samples, 0.20%)</title><rect x="49.3983%" y="1429" width="0.1995%" height="15" fill="rgb(246,78,51)" fg:x="23522" fg:w="95"/><text x="49.6483%" y="1439.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (6 samples, 0.01%)</title><rect x="49.5978%" y="1429" width="0.0126%" height="15" fill="rgb(211,17,15)" fg:x="23617" fg:w="6"/><text x="49.8478%" y="1439.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="49.6671%" y="1413" width="0.0210%" height="15" fill="rgb(209,59,46)" fg:x="23650" fg:w="10"/><text x="49.9171%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="49.7112%" y="1397" width="0.0105%" height="15" fill="rgb(210,92,25)" fg:x="23671" fg:w="5"/><text x="49.9612%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="49.7301%" y="1397" width="0.0189%" height="15" fill="rgb(238,174,52)" fg:x="23680" fg:w="9"/><text x="49.9801%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="49.7343%" y="1381" width="0.0147%" height="15" fill="rgb(230,73,7)" fg:x="23682" fg:w="7"/><text x="49.9843%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (27 samples, 0.06%)</title><rect x="49.6965%" y="1413" width="0.0567%" height="15" fill="rgb(243,124,40)" fg:x="23664" fg:w="27"/><text x="49.9465%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (5 samples, 0.01%)</title><rect x="49.8939%" y="1333" width="0.0105%" height="15" fill="rgb(244,170,11)" fg:x="23758" fg:w="5"/><text x="50.1439%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (80 samples, 0.17%)</title><rect x="49.7616%" y="1413" width="0.1680%" height="15" fill="rgb(207,114,54)" fg:x="23695" fg:w="80"/><text x="50.0116%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (58 samples, 0.12%)</title><rect x="49.8078%" y="1397" width="0.1218%" height="15" fill="rgb(205,42,20)" fg:x="23717" fg:w="58"/><text x="50.0578%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (36 samples, 0.08%)</title><rect x="49.8540%" y="1381" width="0.0756%" height="15" fill="rgb(230,30,28)" fg:x="23739" fg:w="36"/><text x="50.1040%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (30 samples, 0.06%)</title><rect x="49.8666%" y="1365" width="0.0630%" height="15" fill="rgb(205,73,54)" fg:x="23745" fg:w="30"/><text x="50.1166%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (25 samples, 0.05%)</title><rect x="49.8771%" y="1349" width="0.0525%" height="15" fill="rgb(254,227,23)" fg:x="23750" fg:w="25"/><text x="50.1271%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (10 samples, 0.02%)</title><rect x="49.9086%" y="1333" width="0.0210%" height="15" fill="rgb(228,202,34)" fg:x="23765" fg:w="10"/><text x="50.1586%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (6 samples, 0.01%)</title><rect x="49.9296%" y="1413" width="0.0126%" height="15" fill="rgb(222,225,37)" fg:x="23775" fg:w="6"/><text x="50.1796%" y="1423.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (14 samples, 0.03%)</title><rect x="49.9905%" y="1397" width="0.0294%" height="15" fill="rgb(221,14,54)" fg:x="23804" fg:w="14"/><text x="50.2405%" y="1407.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (54 samples, 0.11%)</title><rect x="50.0200%" y="1397" width="0.1134%" height="15" fill="rgb(254,102,2)" fg:x="23818" fg:w="54"/><text x="50.2700%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="50.1544%" y="1381" width="0.0126%" height="15" fill="rgb(232,104,17)" fg:x="23882" fg:w="6"/><text x="50.4044%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (9 samples, 0.02%)</title><rect x="50.1670%" y="1381" width="0.0189%" height="15" fill="rgb(250,220,14)" fg:x="23888" fg:w="9"/><text x="50.4170%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="50.1859%" y="1381" width="0.0147%" height="15" fill="rgb(241,158,9)" fg:x="23897" fg:w="7"/><text x="50.4359%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (30 samples, 0.06%)</title><rect x="50.1439%" y="1397" width="0.0630%" height="15" fill="rgb(246,9,43)" fg:x="23877" fg:w="30"/><text x="50.3939%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (8 samples, 0.02%)</title><rect x="50.2216%" y="1397" width="0.0168%" height="15" fill="rgb(206,73,33)" fg:x="23914" fg:w="8"/><text x="50.4716%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="50.4463%" y="1381" width="0.0105%" height="15" fill="rgb(222,79,8)" fg:x="24021" fg:w="5"/><text x="50.6963%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="50.4610%" y="1381" width="0.0105%" height="15" fill="rgb(234,8,54)" fg:x="24028" fg:w="5"/><text x="50.7110%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (138 samples, 0.29%)</title><rect x="50.4715%" y="1381" width="0.2898%" height="15" fill="rgb(209,134,38)" fg:x="24033" fg:w="138"/><text x="50.7215%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (6 samples, 0.01%)</title><rect x="50.8348%" y="1317" width="0.0126%" height="15" fill="rgb(230,127,29)" fg:x="24206" fg:w="6"/><text x="51.0848%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::alloc::exchange_malloc (35 samples, 0.07%)</title><rect x="50.7865%" y="1381" width="0.0735%" height="15" fill="rgb(242,44,41)" fg:x="24183" fg:w="35"/><text x="51.0365%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (32 samples, 0.07%)</title><rect x="50.7928%" y="1365" width="0.0672%" height="15" fill="rgb(222,56,43)" fg:x="24186" fg:w="32"/><text x="51.0428%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (24 samples, 0.05%)</title><rect x="50.8096%" y="1349" width="0.0504%" height="15" fill="rgb(238,39,47)" fg:x="24194" fg:w="24"/><text x="51.0596%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (23 samples, 0.05%)</title><rect x="50.8117%" y="1333" width="0.0483%" height="15" fill="rgb(226,79,43)" fg:x="24195" fg:w="23"/><text x="51.0617%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (6 samples, 0.01%)</title><rect x="50.8474%" y="1317" width="0.0126%" height="15" fill="rgb(242,105,53)" fg:x="24212" fg:w="6"/><text x="51.0974%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (7 samples, 0.01%)</title><rect x="50.8600%" y="1381" width="0.0147%" height="15" fill="rgb(251,132,46)" fg:x="24218" fg:w="7"/><text x="51.1100%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="50.8642%" y="1365" width="0.0105%" height="15" fill="rgb(231,77,14)" fg:x="24220" fg:w="5"/><text x="51.1142%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (11 samples, 0.02%)</title><rect x="50.8747%" y="1381" width="0.0231%" height="15" fill="rgb(240,135,9)" fg:x="24225" fg:w="11"/><text x="51.1247%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="50.9230%" y="1365" width="0.0168%" height="15" fill="rgb(248,109,14)" fg:x="24248" fg:w="8"/><text x="51.1730%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (5 samples, 0.01%)</title><rect x="50.9461%" y="1365" width="0.0105%" height="15" fill="rgb(227,146,52)" fg:x="24259" fg:w="5"/><text x="51.1961%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (5 samples, 0.01%)</title><rect x="50.9566%" y="1365" width="0.0105%" height="15" fill="rgb(232,54,3)" fg:x="24264" fg:w="5"/><text x="51.2066%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (8 samples, 0.02%)</title><rect x="50.9671%" y="1365" width="0.0168%" height="15" fill="rgb(229,201,43)" fg:x="24269" fg:w="8"/><text x="51.2171%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="51.0259%" y="1349" width="0.0399%" height="15" fill="rgb(252,161,33)" fg:x="24297" fg:w="19"/><text x="51.2759%" y="1359.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="51.0973%" y="1333" width="0.0399%" height="15" fill="rgb(226,146,40)" fg:x="24331" fg:w="19"/><text x="51.3473%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::FnOnce::call_once (6 samples, 0.01%)</title><rect x="51.1372%" y="1333" width="0.0126%" height="15" fill="rgb(219,47,25)" fg:x="24350" fg:w="6"/><text x="51.3872%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (6 samples, 0.01%)</title><rect x="51.1372%" y="1317" width="0.0126%" height="15" fill="rgb(250,135,13)" fg:x="24350" fg:w="6"/><text x="51.3872%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (10 samples, 0.02%)</title><rect x="51.1519%" y="1333" width="0.0210%" height="15" fill="rgb(219,229,18)" fg:x="24357" fg:w="10"/><text x="51.4019%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keywords (5 samples, 0.01%)</title><rect x="51.1729%" y="1333" width="0.0105%" height="15" fill="rgb(217,152,27)" fg:x="24367" fg:w="5"/><text x="51.4229%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (10 samples, 0.02%)</title><rect x="51.2212%" y="1317" width="0.0210%" height="15" fill="rgb(225,71,47)" fg:x="24390" fg:w="10"/><text x="51.4712%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_keyword (6 samples, 0.01%)</title><rect x="51.2548%" y="1317" width="0.0126%" height="15" fill="rgb(220,139,14)" fg:x="24406" fg:w="6"/><text x="51.5048%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (12 samples, 0.03%)</title><rect x="51.2968%" y="1301" width="0.0252%" height="15" fill="rgb(247,54,32)" fg:x="24426" fg:w="12"/><text x="51.5468%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (14 samples, 0.03%)</title><rect x="51.3262%" y="1301" width="0.0294%" height="15" fill="rgb(252,131,39)" fg:x="24440" fg:w="14"/><text x="51.5762%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (13 samples, 0.03%)</title><rect x="51.3283%" y="1285" width="0.0273%" height="15" fill="rgb(210,108,39)" fg:x="24441" fg:w="13"/><text x="51.5783%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="51.3451%" y="1269" width="0.0105%" height="15" fill="rgb(205,23,29)" fg:x="24449" fg:w="5"/><text x="51.5951%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (5 samples, 0.01%)</title><rect x="51.3451%" y="1253" width="0.0105%" height="15" fill="rgb(246,139,46)" fg:x="24449" fg:w="5"/><text x="51.5951%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (5 samples, 0.01%)</title><rect x="51.3451%" y="1237" width="0.0105%" height="15" fill="rgb(250,81,26)" fg:x="24449" fg:w="5"/><text x="51.5951%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="51.4354%" y="1253" width="0.0105%" height="15" fill="rgb(214,104,7)" fg:x="24492" fg:w="5"/><text x="51.6854%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_alias (21 samples, 0.04%)</title><rect x="51.4039%" y="1285" width="0.0441%" height="15" fill="rgb(233,189,8)" fg:x="24477" fg:w="21"/><text x="51.6539%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="51.4270%" y="1269" width="0.0210%" height="15" fill="rgb(228,141,17)" fg:x="24488" fg:w="10"/><text x="51.6770%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="51.4648%" y="1269" width="0.0126%" height="15" fill="rgb(247,157,1)" fg:x="24506" fg:w="6"/><text x="51.7148%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="51.4774%" y="1269" width="0.0126%" height="15" fill="rgb(249,225,5)" fg:x="24512" fg:w="6"/><text x="51.7274%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="51.4900%" y="1269" width="0.0126%" height="15" fill="rgb(242,55,13)" fg:x="24518" fg:w="6"/><text x="51.7400%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (16 samples, 0.03%)</title><rect x="51.5341%" y="1253" width="0.0336%" height="15" fill="rgb(230,49,50)" fg:x="24539" fg:w="16"/><text x="51.7841%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="51.5677%" y="1253" width="0.0105%" height="15" fill="rgb(241,111,38)" fg:x="24555" fg:w="5"/><text x="51.8177%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (12 samples, 0.03%)</title><rect x="51.5824%" y="1253" width="0.0252%" height="15" fill="rgb(252,155,4)" fg:x="24562" fg:w="12"/><text x="51.8324%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (9 samples, 0.02%)</title><rect x="51.5887%" y="1237" width="0.0189%" height="15" fill="rgb(212,69,32)" fg:x="24565" fg:w="9"/><text x="51.8387%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="51.5929%" y="1221" width="0.0147%" height="15" fill="rgb(243,107,47)" fg:x="24567" fg:w="7"/><text x="51.8429%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (7 samples, 0.01%)</title><rect x="51.6097%" y="1253" width="0.0147%" height="15" fill="rgb(247,130,12)" fg:x="24575" fg:w="7"/><text x="51.8597%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="51.6685%" y="1237" width="0.0105%" height="15" fill="rgb(233,74,16)" fg:x="24603" fg:w="5"/><text x="51.9185%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="51.6874%" y="1237" width="0.0189%" height="15" fill="rgb(208,58,18)" fg:x="24612" fg:w="9"/><text x="51.9374%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="51.7084%" y="1237" width="0.0168%" height="15" fill="rgb(242,225,1)" fg:x="24622" fg:w="8"/><text x="51.9584%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="51.7252%" y="1237" width="0.0105%" height="15" fill="rgb(249,39,40)" fg:x="24630" fg:w="5"/><text x="51.9752%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (7 samples, 0.01%)</title><rect x="51.8113%" y="1077" width="0.0147%" height="15" fill="rgb(207,72,44)" fg:x="24671" fg:w="7"/><text x="52.0613%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (13 samples, 0.03%)</title><rect x="51.8029%" y="1093" width="0.0273%" height="15" fill="rgb(215,193,12)" fg:x="24667" fg:w="13"/><text x="52.0529%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (20 samples, 0.04%)</title><rect x="51.7924%" y="1109" width="0.0420%" height="15" fill="rgb(248,41,39)" fg:x="24662" fg:w="20"/><text x="52.0424%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (23 samples, 0.05%)</title><rect x="51.7882%" y="1125" width="0.0483%" height="15" fill="rgb(253,85,4)" fg:x="24660" fg:w="23"/><text x="52.0382%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (34 samples, 0.07%)</title><rect x="51.7735%" y="1173" width="0.0714%" height="15" fill="rgb(243,70,31)" fg:x="24653" fg:w="34"/><text x="52.0235%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (33 samples, 0.07%)</title><rect x="51.7756%" y="1157" width="0.0693%" height="15" fill="rgb(253,195,26)" fg:x="24654" fg:w="33"/><text x="52.0256%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (28 samples, 0.06%)</title><rect x="51.7861%" y="1141" width="0.0588%" height="15" fill="rgb(243,42,11)" fg:x="24659" fg:w="28"/><text x="52.0361%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (67 samples, 0.14%)</title><rect x="51.7462%" y="1237" width="0.1407%" height="15" fill="rgb(239,66,17)" fg:x="24640" fg:w="67"/><text x="51.9962%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (66 samples, 0.14%)</title><rect x="51.7483%" y="1221" width="0.1386%" height="15" fill="rgb(217,132,21)" fg:x="24641" fg:w="66"/><text x="51.9983%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (61 samples, 0.13%)</title><rect x="51.7588%" y="1205" width="0.1281%" height="15" fill="rgb(252,202,21)" fg:x="24646" fg:w="61"/><text x="52.0088%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (58 samples, 0.12%)</title><rect x="51.7651%" y="1189" width="0.1218%" height="15" fill="rgb(233,98,36)" fg:x="24649" fg:w="58"/><text x="52.0151%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (14 samples, 0.03%)</title><rect x="51.8575%" y="1173" width="0.0294%" height="15" fill="rgb(216,153,54)" fg:x="24693" fg:w="14"/><text x="52.1075%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="51.8974%" y="1221" width="0.0231%" height="15" fill="rgb(250,99,7)" fg:x="24712" fg:w="11"/><text x="52.1474%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (18 samples, 0.04%)</title><rect x="51.8869%" y="1237" width="0.0378%" height="15" fill="rgb(207,56,50)" fg:x="24707" fg:w="18"/><text x="52.1369%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (14 samples, 0.03%)</title><rect x="51.9940%" y="1189" width="0.0294%" height="15" fill="rgb(244,61,34)" fg:x="24758" fg:w="14"/><text x="52.2440%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (9 samples, 0.02%)</title><rect x="52.0045%" y="1173" width="0.0189%" height="15" fill="rgb(241,50,38)" fg:x="24763" fg:w="9"/><text x="52.2545%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (9 samples, 0.02%)</title><rect x="52.0045%" y="1157" width="0.0189%" height="15" fill="rgb(212,166,30)" fg:x="24763" fg:w="9"/><text x="52.2545%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="52.0444%" y="1173" width="0.0168%" height="15" fill="rgb(249,127,32)" fg:x="24782" fg:w="8"/><text x="52.2944%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (46 samples, 0.10%)</title><rect x="51.9793%" y="1205" width="0.0966%" height="15" fill="rgb(209,103,0)" fg:x="24751" fg:w="46"/><text x="52.2293%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (23 samples, 0.05%)</title><rect x="52.0276%" y="1189" width="0.0483%" height="15" fill="rgb(238,209,51)" fg:x="24774" fg:w="23"/><text x="52.2776%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="52.0612%" y="1173" width="0.0147%" height="15" fill="rgb(237,56,23)" fg:x="24790" fg:w="7"/><text x="52.3112%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="52.1011%" y="1189" width="0.0105%" height="15" fill="rgb(215,153,46)" fg:x="24809" fg:w="5"/><text x="52.3511%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="52.1116%" y="1189" width="0.0147%" height="15" fill="rgb(224,49,31)" fg:x="24814" fg:w="7"/><text x="52.3616%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (96 samples, 0.20%)</title><rect x="51.9310%" y="1221" width="0.2016%" height="15" fill="rgb(250,18,42)" fg:x="24728" fg:w="96"/><text x="52.1810%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_type_modifiers (27 samples, 0.06%)</title><rect x="52.0759%" y="1205" width="0.0567%" height="15" fill="rgb(215,176,39)" fg:x="24797" fg:w="27"/><text x="52.3259%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (99 samples, 0.21%)</title><rect x="51.9289%" y="1237" width="0.2079%" height="15" fill="rgb(223,77,29)" fg:x="24727" fg:w="99"/><text x="52.1789%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_compound_field_access (9 samples, 0.02%)</title><rect x="52.1767%" y="1221" width="0.0189%" height="15" fill="rgb(234,94,52)" fg:x="24845" fg:w="9"/><text x="52.4267%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="52.1851%" y="1205" width="0.0105%" height="15" fill="rgb(220,154,50)" fg:x="24849" fg:w="5"/><text x="52.4351%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (10 samples, 0.02%)</title><rect x="52.2691%" y="1189" width="0.0210%" height="15" fill="rgb(212,11,10)" fg:x="24889" fg:w="10"/><text x="52.5191%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="52.2901%" y="1189" width="0.0168%" height="15" fill="rgb(205,166,19)" fg:x="24899" fg:w="8"/><text x="52.5401%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (11 samples, 0.02%)</title><rect x="52.3469%" y="1173" width="0.0231%" height="15" fill="rgb(244,198,16)" fg:x="24926" fg:w="11"/><text x="52.5969%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (7 samples, 0.01%)</title><rect x="52.3553%" y="1157" width="0.0147%" height="15" fill="rgb(219,69,12)" fg:x="24930" fg:w="7"/><text x="52.6053%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (5 samples, 0.01%)</title><rect x="52.3595%" y="1141" width="0.0105%" height="15" fill="rgb(245,30,7)" fg:x="24932" fg:w="5"/><text x="52.6095%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="52.3868%" y="1157" width="0.0147%" height="15" fill="rgb(218,221,48)" fg:x="24945" fg:w="7"/><text x="52.6368%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (10 samples, 0.02%)</title><rect x="52.4498%" y="1109" width="0.0210%" height="15" fill="rgb(216,66,15)" fg:x="24975" fg:w="10"/><text x="52.6998%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (7 samples, 0.01%)</title><rect x="52.5128%" y="997" width="0.0147%" height="15" fill="rgb(226,122,50)" fg:x="25005" fg:w="7"/><text x="52.7628%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (13 samples, 0.03%)</title><rect x="52.5023%" y="1029" width="0.0273%" height="15" fill="rgb(239,156,16)" fg:x="25000" fg:w="13"/><text x="52.7523%" y="1039.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (12 samples, 0.03%)</title><rect x="52.5044%" y="1013" width="0.0252%" height="15" fill="rgb(224,27,38)" fg:x="25001" fg:w="12"/><text x="52.7544%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (21 samples, 0.04%)</title><rect x="52.4918%" y="1077" width="0.0441%" height="15" fill="rgb(224,39,27)" fg:x="24995" fg:w="21"/><text x="52.7418%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (21 samples, 0.04%)</title><rect x="52.4918%" y="1061" width="0.0441%" height="15" fill="rgb(215,92,29)" fg:x="24995" fg:w="21"/><text x="52.7418%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (17 samples, 0.04%)</title><rect x="52.5002%" y="1045" width="0.0357%" height="15" fill="rgb(207,159,16)" fg:x="24999" fg:w="17"/><text x="52.7502%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (35 samples, 0.07%)</title><rect x="52.4750%" y="1109" width="0.0735%" height="15" fill="rgb(238,163,47)" fg:x="24987" fg:w="35"/><text x="52.7250%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (34 samples, 0.07%)</title><rect x="52.4771%" y="1093" width="0.0714%" height="15" fill="rgb(219,91,49)" fg:x="24988" fg:w="34"/><text x="52.7271%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (5 samples, 0.01%)</title><rect x="52.5380%" y="1077" width="0.0105%" height="15" fill="rgb(227,167,31)" fg:x="25017" fg:w="5"/><text x="52.7880%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (62 samples, 0.13%)</title><rect x="52.4246%" y="1141" width="0.1302%" height="15" fill="rgb(234,80,54)" fg:x="24963" fg:w="62"/><text x="52.6746%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (52 samples, 0.11%)</title><rect x="52.4456%" y="1125" width="0.1092%" height="15" fill="rgb(212,114,2)" fg:x="24973" fg:w="52"/><text x="52.6956%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_named_arg_operator (70 samples, 0.15%)</title><rect x="52.4099%" y="1157" width="0.1470%" height="15" fill="rgb(234,50,24)" fg:x="24956" fg:w="70"/><text x="52.6599%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="52.5653%" y="1141" width="0.0105%" height="15" fill="rgb(221,68,8)" fg:x="25030" fg:w="5"/><text x="52.8153%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="52.5779%" y="1141" width="0.0105%" height="15" fill="rgb(254,180,31)" fg:x="25036" fg:w="5"/><text x="52.8279%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (18 samples, 0.04%)</title><rect x="52.5569%" y="1157" width="0.0378%" height="15" fill="rgb(247,130,50)" fg:x="25026" fg:w="18"/><text x="52.8069%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="52.6073%" y="1141" width="0.0168%" height="15" fill="rgb(211,109,4)" fg:x="25050" fg:w="8"/><text x="52.8573%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (12 samples, 0.03%)</title><rect x="52.6409%" y="1125" width="0.0252%" height="15" fill="rgb(238,50,21)" fg:x="25066" fg:w="12"/><text x="52.8909%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (16 samples, 0.03%)</title><rect x="52.7543%" y="1045" width="0.0336%" height="15" fill="rgb(225,57,45)" fg:x="25120" fg:w="16"/><text x="53.0043%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (15 samples, 0.03%)</title><rect x="52.7564%" y="1029" width="0.0315%" height="15" fill="rgb(209,196,50)" fg:x="25121" fg:w="15"/><text x="53.0064%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (13 samples, 0.03%)</title><rect x="52.7606%" y="1013" width="0.0273%" height="15" fill="rgb(242,140,13)" fg:x="25123" fg:w="13"/><text x="53.0106%" y="1023.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (13 samples, 0.03%)</title><rect x="52.7606%" y="997" width="0.0273%" height="15" fill="rgb(217,111,7)" fg:x="25123" fg:w="13"/><text x="53.0106%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (10 samples, 0.02%)</title><rect x="52.7669%" y="981" width="0.0210%" height="15" fill="rgb(253,193,51)" fg:x="25126" fg:w="10"/><text x="53.0169%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (33 samples, 0.07%)</title><rect x="52.7270%" y="1109" width="0.0693%" height="15" fill="rgb(252,70,29)" fg:x="25107" fg:w="33"/><text x="52.9770%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="52.7417%" y="1093" width="0.0546%" height="15" fill="rgb(232,127,12)" fg:x="25114" fg:w="26"/><text x="52.9917%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (25 samples, 0.05%)</title><rect x="52.7438%" y="1077" width="0.0525%" height="15" fill="rgb(211,180,21)" fg:x="25115" fg:w="25"/><text x="52.9938%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (24 samples, 0.05%)</title><rect x="52.7459%" y="1061" width="0.0504%" height="15" fill="rgb(229,72,13)" fg:x="25116" fg:w="24"/><text x="52.9959%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (7 samples, 0.01%)</title><rect x="52.7963%" y="1109" width="0.0147%" height="15" fill="rgb(240,211,49)" fg:x="25140" fg:w="7"/><text x="53.0463%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="52.8404%" y="1045" width="0.0105%" height="15" fill="rgb(219,149,40)" fg:x="25161" fg:w="5"/><text x="53.0904%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (22 samples, 0.05%)</title><rect x="52.8152%" y="1077" width="0.0462%" height="15" fill="rgb(210,127,46)" fg:x="25149" fg:w="22"/><text x="53.0652%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (14 samples, 0.03%)</title><rect x="52.8320%" y="1061" width="0.0294%" height="15" fill="rgb(220,106,7)" fg:x="25157" fg:w="14"/><text x="53.0820%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (26 samples, 0.05%)</title><rect x="52.8131%" y="1093" width="0.0546%" height="15" fill="rgb(249,31,22)" fg:x="25148" fg:w="26"/><text x="53.0631%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (29 samples, 0.06%)</title><rect x="52.8110%" y="1109" width="0.0609%" height="15" fill="rgb(253,1,49)" fg:x="25147" fg:w="29"/><text x="53.0610%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (93 samples, 0.20%)</title><rect x="52.6829%" y="1125" width="0.1953%" height="15" fill="rgb(227,144,33)" fg:x="25086" fg:w="93"/><text x="52.9329%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_args (239 samples, 0.50%)</title><rect x="52.3784%" y="1173" width="0.5019%" height="15" fill="rgb(249,163,44)" fg:x="24941" fg:w="239"/><text x="52.6284%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (136 samples, 0.29%)</title><rect x="52.5947%" y="1157" width="0.2856%" height="15" fill="rgb(234,15,39)" fg:x="25044" fg:w="136"/><text x="52.8447%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (120 samples, 0.25%)</title><rect x="52.6283%" y="1141" width="0.2520%" height="15" fill="rgb(207,66,16)" fg:x="25060" fg:w="120"/><text x="52.8783%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_argument_list (315 samples, 0.66%)</title><rect x="52.2229%" y="1205" width="0.6615%" height="15" fill="rgb(233,112,24)" fg:x="24867" fg:w="315"/><text x="52.4729%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (274 samples, 0.58%)</title><rect x="52.3090%" y="1189" width="0.5754%" height="15" fill="rgb(230,90,22)" fg:x="24908" fg:w="274"/><text x="52.5590%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_call (334 samples, 0.70%)</title><rect x="52.1956%" y="1221" width="0.7014%" height="15" fill="rgb(229,61,13)" fg:x="24854" fg:w="334"/><text x="52.4456%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (364 samples, 0.76%)</title><rect x="52.1368%" y="1237" width="0.7644%" height="15" fill="rgb(225,57,24)" fg:x="24826" fg:w="364"/><text x="52.3868%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (614 samples, 1.29%)</title><rect x="51.6244%" y="1253" width="1.2895%" height="15" fill="rgb(208,169,48)" fg:x="24582" fg:w="614"/><text x="51.8744%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_parse (5 samples, 0.01%)</title><rect x="52.9034%" y="1237" width="0.0105%" height="15" fill="rgb(244,218,51)" fg:x="25191" fg:w="5"/><text x="53.1534%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select_item (740 samples, 1.55%)</title><rect x="51.3619%" y="1301" width="1.5541%" height="15" fill="rgb(214,148,10)" fg:x="24457" fg:w="740"/><text x="51.6119%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (698 samples, 1.47%)</title><rect x="51.4501%" y="1285" width="1.4659%" height="15" fill="rgb(225,174,27)" fg:x="24499" fg:w="698"/><text x="51.7001%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (669 samples, 1.40%)</title><rect x="51.5110%" y="1269" width="1.4050%" height="15" fill="rgb(230,96,26)" fg:x="24528" fg:w="669"/><text x="51.7610%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="52.9349%" y="1285" width="0.0126%" height="15" fill="rgb(232,10,30)" fg:x="25206" fg:w="6"/><text x="53.1849%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (14 samples, 0.03%)</title><rect x="52.9916%" y="1269" width="0.0294%" height="15" fill="rgb(222,8,50)" fg:x="25233" fg:w="14"/><text x="53.2416%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (8 samples, 0.02%)</title><rect x="53.0042%" y="1253" width="0.0168%" height="15" fill="rgb(213,81,27)" fg:x="25239" fg:w="8"/><text x="53.2542%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (7 samples, 0.01%)</title><rect x="53.0315%" y="1269" width="0.0147%" height="15" fill="rgb(245,50,10)" fg:x="25252" fg:w="7"/><text x="53.2815%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_factor (58 samples, 0.12%)</title><rect x="52.9601%" y="1285" width="0.1218%" height="15" fill="rgb(216,100,18)" fg:x="25218" fg:w="58"/><text x="53.2101%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_tokens (17 samples, 0.04%)</title><rect x="53.0462%" y="1269" width="0.0357%" height="15" fill="rgb(236,147,54)" fg:x="25259" fg:w="17"/><text x="53.2962%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="53.0714%" y="1253" width="0.0105%" height="15" fill="rgb(205,143,26)" fg:x="25271" fg:w="5"/><text x="53.3214%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (865 samples, 1.82%)</title><rect x="51.2716%" y="1317" width="1.8166%" height="15" fill="rgb(236,26,9)" fg:x="24414" fg:w="865"/><text x="51.5216%" y="1327.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_and_joins (82 samples, 0.17%)</title><rect x="52.9160%" y="1301" width="0.1722%" height="15" fill="rgb(221,165,53)" fg:x="25197" fg:w="82"/><text x="53.1660%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (8 samples, 0.02%)</title><rect x="53.1029%" y="1301" width="0.0168%" height="15" fill="rgb(214,110,17)" fg:x="25286" fg:w="8"/><text x="53.3529%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="53.1092%" y="1285" width="0.0105%" height="15" fill="rgb(237,197,12)" fg:x="25289" fg:w="5"/><text x="53.3592%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (6 samples, 0.01%)</title><rect x="53.1869%" y="1125" width="0.0126%" height="15" fill="rgb(205,84,17)" fg:x="25326" fg:w="6"/><text x="53.4369%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (13 samples, 0.03%)</title><rect x="53.1806%" y="1141" width="0.0273%" height="15" fill="rgb(237,18,45)" fg:x="25323" fg:w="13"/><text x="53.4306%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (14 samples, 0.03%)</title><rect x="53.1806%" y="1157" width="0.0294%" height="15" fill="rgb(221,87,14)" fg:x="25323" fg:w="14"/><text x="53.4306%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (19 samples, 0.04%)</title><rect x="53.1722%" y="1205" width="0.0399%" height="15" fill="rgb(238,186,15)" fg:x="25319" fg:w="19"/><text x="53.4222%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (19 samples, 0.04%)</title><rect x="53.1722%" y="1189" width="0.0399%" height="15" fill="rgb(208,115,11)" fg:x="25319" fg:w="19"/><text x="53.4222%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (18 samples, 0.04%)</title><rect x="53.1743%" y="1173" width="0.0378%" height="15" fill="rgb(254,175,0)" fg:x="25320" fg:w="18"/><text x="53.4243%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (29 samples, 0.06%)</title><rect x="53.1617%" y="1269" width="0.0609%" height="15" fill="rgb(227,24,42)" fg:x="25314" fg:w="29"/><text x="53.4117%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (27 samples, 0.06%)</title><rect x="53.1659%" y="1253" width="0.0567%" height="15" fill="rgb(223,211,37)" fg:x="25316" fg:w="27"/><text x="53.4159%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (27 samples, 0.06%)</title><rect x="53.1659%" y="1237" width="0.0567%" height="15" fill="rgb(235,49,27)" fg:x="25316" fg:w="27"/><text x="53.4159%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (26 samples, 0.05%)</title><rect x="53.1680%" y="1221" width="0.0546%" height="15" fill="rgb(254,97,51)" fg:x="25317" fg:w="26"/><text x="53.4180%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (5 samples, 0.01%)</title><rect x="53.2226%" y="1269" width="0.0105%" height="15" fill="rgb(249,51,40)" fg:x="25343" fg:w="5"/><text x="53.4726%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (12 samples, 0.03%)</title><rect x="53.2436%" y="1237" width="0.0252%" height="15" fill="rgb(210,128,45)" fg:x="25353" fg:w="12"/><text x="53.4936%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (8 samples, 0.02%)</title><rect x="53.2520%" y="1221" width="0.0168%" height="15" fill="rgb(224,137,50)" fg:x="25357" fg:w="8"/><text x="53.5020%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (18 samples, 0.04%)</title><rect x="53.2331%" y="1253" width="0.0378%" height="15" fill="rgb(242,15,9)" fg:x="25348" fg:w="18"/><text x="53.4831%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (19 samples, 0.04%)</title><rect x="53.2331%" y="1269" width="0.0399%" height="15" fill="rgb(233,187,41)" fg:x="25348" fg:w="19"/><text x="53.4831%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_group_by (93 samples, 0.20%)</title><rect x="53.0882%" y="1317" width="0.1953%" height="15" fill="rgb(227,2,29)" fg:x="25279" fg:w="93"/><text x="53.3382%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (76 samples, 0.16%)</title><rect x="53.1239%" y="1301" width="0.1596%" height="15" fill="rgb(222,70,3)" fg:x="25296" fg:w="76"/><text x="53.3739%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (68 samples, 0.14%)</title><rect x="53.1407%" y="1285" width="0.1428%" height="15" fill="rgb(213,11,42)" fg:x="25304" fg:w="68"/><text x="53.3907%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query (1,096 samples, 2.30%)</title><rect x="50.9860%" y="1365" width="2.3017%" height="15" fill="rgb(225,150,9)" fg:x="24278" fg:w="1096"/><text x="51.2360%" y="1375.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query_body (1,055 samples, 2.22%)</title><rect x="51.0721%" y="1349" width="2.2156%" height="15" fill="rgb(230,162,45)" fg:x="24319" fg:w="1055"/><text x="51.3221%" y="1359.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select (1,000 samples, 2.10%)</title><rect x="51.1876%" y="1333" width="2.1001%" height="15" fill="rgb(222,14,52)" fg:x="24374" fg:w="1000"/><text x="51.4376%" y="1343.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_cte (1,138 samples, 2.39%)</title><rect x="50.8999%" y="1381" width="2.3899%" height="15" fill="rgb(254,198,14)" fg:x="24237" fg:w="1138"/><text x="51.1499%" y="1391.50">sq..</text></g><g><title>libsystem_platform.dylib`_platform_memmove (79 samples, 0.17%)</title><rect x="53.3003%" y="1365" width="0.1659%" height="15" fill="rgb(220,217,30)" fg:x="25380" fg:w="79"/><text x="53.5503%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="53.4725%" y="1349" width="0.0315%" height="15" fill="rgb(215,146,41)" fg:x="25462" fg:w="15"/><text x="53.7225%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (11 samples, 0.02%)</title><rect x="53.5040%" y="1349" width="0.0231%" height="15" fill="rgb(217,27,36)" fg:x="25477" fg:w="11"/><text x="53.7540%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (11 samples, 0.02%)</title><rect x="53.5040%" y="1333" width="0.0231%" height="15" fill="rgb(219,218,39)" fg:x="25477" fg:w="11"/><text x="53.7540%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (11 samples, 0.02%)</title><rect x="53.5040%" y="1317" width="0.0231%" height="15" fill="rgb(219,4,42)" fg:x="25477" fg:w="11"/><text x="53.7540%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (11 samples, 0.02%)</title><rect x="53.5040%" y="1301" width="0.0231%" height="15" fill="rgb(249,119,36)" fg:x="25477" fg:w="11"/><text x="53.7540%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="53.5124%" y="1285" width="0.0147%" height="15" fill="rgb(209,23,33)" fg:x="25481" fg:w="7"/><text x="53.7624%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (13 samples, 0.03%)</title><rect x="53.5460%" y="1333" width="0.0273%" height="15" fill="rgb(211,10,0)" fg:x="25497" fg:w="13"/><text x="53.7960%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (16 samples, 0.03%)</title><rect x="53.6006%" y="1317" width="0.0336%" height="15" fill="rgb(208,99,37)" fg:x="25523" fg:w="16"/><text x="53.8506%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (16 samples, 0.03%)</title><rect x="53.6468%" y="1317" width="0.0336%" height="15" fill="rgb(213,132,31)" fg:x="25545" fg:w="16"/><text x="53.8968%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (9 samples, 0.02%)</title><rect x="53.6615%" y="1301" width="0.0189%" height="15" fill="rgb(243,129,40)" fg:x="25552" fg:w="9"/><text x="53.9115%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="53.6636%" y="1285" width="0.0168%" height="15" fill="rgb(210,66,33)" fg:x="25553" fg:w="8"/><text x="53.9136%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="53.7413%" y="1301" width="0.0210%" height="15" fill="rgb(209,189,4)" fg:x="25590" fg:w="10"/><text x="53.9913%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="53.7623%" y="1301" width="0.0168%" height="15" fill="rgb(214,107,37)" fg:x="25600" fg:w="8"/><text x="54.0123%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="53.7854%" y="1301" width="0.0126%" height="15" fill="rgb(245,88,54)" fg:x="25611" fg:w="6"/><text x="54.0354%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="53.8316%" y="1237" width="0.0126%" height="15" fill="rgb(205,146,20)" fg:x="25633" fg:w="6"/><text x="54.0816%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="53.8904%" y="1157" width="0.0105%" height="15" fill="rgb(220,161,25)" fg:x="25661" fg:w="5"/><text x="54.1404%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="53.9072%" y="1141" width="0.0252%" height="15" fill="rgb(215,152,15)" fg:x="25669" fg:w="12"/><text x="54.1572%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (5 samples, 0.01%)</title><rect x="53.9324%" y="1141" width="0.0105%" height="15" fill="rgb(233,192,44)" fg:x="25681" fg:w="5"/><text x="54.1824%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (20 samples, 0.04%)</title><rect x="53.9072%" y="1157" width="0.0420%" height="15" fill="rgb(240,170,46)" fg:x="25669" fg:w="20"/><text x="54.1572%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (42 samples, 0.09%)</title><rect x="53.8631%" y="1189" width="0.0882%" height="15" fill="rgb(207,104,33)" fg:x="25648" fg:w="42"/><text x="54.1131%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (39 samples, 0.08%)</title><rect x="53.8694%" y="1173" width="0.0819%" height="15" fill="rgb(219,21,39)" fg:x="25651" fg:w="39"/><text x="54.1194%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (51 samples, 0.11%)</title><rect x="53.8484%" y="1221" width="0.1071%" height="15" fill="rgb(214,133,29)" fg:x="25641" fg:w="51"/><text x="54.0984%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (45 samples, 0.09%)</title><rect x="53.8610%" y="1205" width="0.0945%" height="15" fill="rgb(226,93,6)" fg:x="25647" fg:w="45"/><text x="54.1110%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (54 samples, 0.11%)</title><rect x="53.8442%" y="1237" width="0.1134%" height="15" fill="rgb(252,222,34)" fg:x="25639" fg:w="54"/><text x="54.0942%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (84 samples, 0.18%)</title><rect x="53.8253%" y="1269" width="0.1764%" height="15" fill="rgb(252,92,48)" fg:x="25630" fg:w="84"/><text x="54.0753%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (81 samples, 0.17%)</title><rect x="53.8316%" y="1253" width="0.1701%" height="15" fill="rgb(245,223,24)" fg:x="25633" fg:w="81"/><text x="54.0816%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (16 samples, 0.03%)</title><rect x="53.9681%" y="1237" width="0.0336%" height="15" fill="rgb(205,176,3)" fg:x="25698" fg:w="16"/><text x="54.2181%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (99 samples, 0.21%)</title><rect x="53.8001%" y="1301" width="0.2079%" height="15" fill="rgb(235,151,15)" fg:x="25618" fg:w="99"/><text x="54.0501%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (93 samples, 0.20%)</title><rect x="53.8127%" y="1285" width="0.1953%" height="15" fill="rgb(237,209,11)" fg:x="25624" fg:w="93"/><text x="54.0627%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (11 samples, 0.02%)</title><rect x="54.0143%" y="1285" width="0.0231%" height="15" fill="rgb(243,227,24)" fg:x="25720" fg:w="11"/><text x="54.2643%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (16 samples, 0.03%)</title><rect x="54.0080%" y="1301" width="0.0336%" height="15" fill="rgb(239,193,16)" fg:x="25717" fg:w="16"/><text x="54.2580%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="54.1130%" y="1237" width="0.0126%" height="15" fill="rgb(231,27,9)" fg:x="25767" fg:w="6"/><text x="54.3630%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="54.1256%" y="1237" width="0.0168%" height="15" fill="rgb(219,169,10)" fg:x="25773" fg:w="8"/><text x="54.3756%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (10 samples, 0.02%)</title><rect x="54.1424%" y="1237" width="0.0210%" height="15" fill="rgb(244,229,43)" fg:x="25781" fg:w="10"/><text x="54.3924%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (50 samples, 0.11%)</title><rect x="54.0626%" y="1269" width="0.1050%" height="15" fill="rgb(254,38,20)" fg:x="25743" fg:w="50"/><text x="54.3126%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (37 samples, 0.08%)</title><rect x="54.0899%" y="1253" width="0.0777%" height="15" fill="rgb(250,47,30)" fg:x="25756" fg:w="37"/><text x="54.3399%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (61 samples, 0.13%)</title><rect x="54.0458%" y="1285" width="0.1281%" height="15" fill="rgb(224,124,36)" fg:x="25735" fg:w="61"/><text x="54.2958%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (65 samples, 0.14%)</title><rect x="54.0416%" y="1301" width="0.1365%" height="15" fill="rgb(246,68,51)" fg:x="25733" fg:w="65"/><text x="54.2916%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="54.2012%" y="1285" width="0.0147%" height="15" fill="rgb(253,43,49)" fg:x="25809" fg:w="7"/><text x="54.4512%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="54.2264%" y="1269" width="0.0126%" height="15" fill="rgb(219,54,36)" fg:x="25821" fg:w="6"/><text x="54.4764%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (30 samples, 0.06%)</title><rect x="54.1781%" y="1301" width="0.0630%" height="15" fill="rgb(227,133,34)" fg:x="25798" fg:w="30"/><text x="54.4281%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="54.2159%" y="1285" width="0.0252%" height="15" fill="rgb(247,227,15)" fg:x="25816" fg:w="12"/><text x="54.4659%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (269 samples, 0.56%)</title><rect x="53.6867%" y="1317" width="0.5649%" height="15" fill="rgb(229,96,14)" fg:x="25564" fg:w="269"/><text x="53.9367%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (377 samples, 0.79%)</title><rect x="53.4662%" y="1365" width="0.7917%" height="15" fill="rgb(220,79,17)" fg:x="25459" fg:w="377"/><text x="53.7162%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_order_by_expr (348 samples, 0.73%)</title><rect x="53.5271%" y="1349" width="0.7308%" height="15" fill="rgb(205,131,53)" fg:x="25488" fg:w="348"/><text x="53.7771%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (323 samples, 0.68%)</title><rect x="53.5796%" y="1333" width="0.6783%" height="15" fill="rgb(209,50,29)" fg:x="25513" fg:w="323"/><text x="53.8296%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_order_by (462 samples, 0.97%)</title><rect x="53.2898%" y="1381" width="0.9702%" height="15" fill="rgb(245,86,46)" fg:x="25375" fg:w="462"/><text x="53.5398%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (6 samples, 0.01%)</title><rect x="54.3986%" y="1317" width="0.0126%" height="15" fill="rgb(235,66,46)" fg:x="25903" fg:w="6"/><text x="54.6486%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (36 samples, 0.08%)</title><rect x="54.3461%" y="1365" width="0.0756%" height="15" fill="rgb(232,148,31)" fg:x="25878" fg:w="36"/><text x="54.5961%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (23 samples, 0.05%)</title><rect x="54.3734%" y="1349" width="0.0483%" height="15" fill="rgb(217,149,8)" fg:x="25891" fg:w="23"/><text x="54.6234%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (20 samples, 0.04%)</title><rect x="54.3797%" y="1333" width="0.0420%" height="15" fill="rgb(209,183,11)" fg:x="25894" fg:w="20"/><text x="54.6297%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (139 samples, 0.29%)</title><rect x="54.4217%" y="1365" width="0.2919%" height="15" fill="rgb(208,55,20)" fg:x="25914" fg:w="139"/><text x="54.6717%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (9 samples, 0.02%)</title><rect x="54.7221%" y="1365" width="0.0189%" height="15" fill="rgb(218,39,14)" fg:x="26057" fg:w="9"/><text x="54.9721%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr (6 samples, 0.01%)</title><rect x="54.8019%" y="1301" width="0.0126%" height="15" fill="rgb(216,169,33)" fg:x="26095" fg:w="6"/><text x="55.0519%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::FnOnce::call_once (40 samples, 0.08%)</title><rect x="54.7431%" y="1365" width="0.0840%" height="15" fill="rgb(233,80,24)" fg:x="26067" fg:w="40"/><text x="54.9931%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (34 samples, 0.07%)</title><rect x="54.7557%" y="1349" width="0.0714%" height="15" fill="rgb(213,179,31)" fg:x="26073" fg:w="34"/><text x="55.0057%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (25 samples, 0.05%)</title><rect x="54.7746%" y="1333" width="0.0525%" height="15" fill="rgb(209,19,5)" fg:x="26082" fg:w="25"/><text x="55.0246%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (22 samples, 0.05%)</title><rect x="54.7809%" y="1317" width="0.0462%" height="15" fill="rgb(219,18,35)" fg:x="26085" fg:w="22"/><text x="55.0309%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (6 samples, 0.01%)</title><rect x="54.8145%" y="1301" width="0.0126%" height="15" fill="rgb(209,169,16)" fg:x="26101" fg:w="6"/><text x="55.0645%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (6 samples, 0.01%)</title><rect x="54.8460%" y="1365" width="0.0126%" height="15" fill="rgb(245,90,51)" fg:x="26116" fg:w="6"/><text x="55.0960%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (16 samples, 0.03%)</title><rect x="54.8586%" y="1365" width="0.0336%" height="15" fill="rgb(220,99,45)" fg:x="26122" fg:w="16"/><text x="55.1086%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keywords (13 samples, 0.03%)</title><rect x="54.8922%" y="1365" width="0.0273%" height="15" fill="rgb(249,89,25)" fg:x="26138" fg:w="13"/><text x="55.1422%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (95 samples, 0.20%)</title><rect x="55.1967%" y="1349" width="0.1995%" height="15" fill="rgb(239,193,0)" fg:x="26283" fg:w="95"/><text x="55.4467%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (11 samples, 0.02%)</title><rect x="55.4046%" y="1349" width="0.0231%" height="15" fill="rgb(231,126,1)" fg:x="26382" fg:w="11"/><text x="55.6546%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (6 samples, 0.01%)</title><rect x="55.4298%" y="1349" width="0.0126%" height="15" fill="rgb(243,166,3)" fg:x="26394" fg:w="6"/><text x="55.6798%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="55.4844%" y="1317" width="0.0126%" height="15" fill="rgb(223,22,34)" fg:x="26420" fg:w="6"/><text x="55.7344%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="55.5033%" y="1317" width="0.0189%" height="15" fill="rgb(251,52,51)" fg:x="26429" fg:w="9"/><text x="55.7533%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="55.5075%" y="1301" width="0.0147%" height="15" fill="rgb(221,165,28)" fg:x="26431" fg:w="7"/><text x="55.7575%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_keyword (38 samples, 0.08%)</title><rect x="55.4445%" y="1349" width="0.0798%" height="15" fill="rgb(218,121,47)" fg:x="26401" fg:w="38"/><text x="55.6945%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (22 samples, 0.05%)</title><rect x="55.4781%" y="1333" width="0.0462%" height="15" fill="rgb(209,120,9)" fg:x="26417" fg:w="22"/><text x="55.7281%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::is_parse_comma_separated_end_with_trailing_commas (8 samples, 0.02%)</title><rect x="55.5243%" y="1349" width="0.0168%" height="15" fill="rgb(236,68,12)" fg:x="26439" fg:w="8"/><text x="55.7743%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_all_or_distinct (12 samples, 0.03%)</title><rect x="55.5411%" y="1349" width="0.0252%" height="15" fill="rgb(225,194,26)" fg:x="26447" fg:w="12"/><text x="55.7911%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="55.6440%" y="1333" width="0.0147%" height="15" fill="rgb(231,84,39)" fg:x="26496" fg:w="7"/><text x="55.8940%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (191 samples, 0.40%)</title><rect x="55.6671%" y="1333" width="0.4011%" height="15" fill="rgb(210,11,45)" fg:x="26507" fg:w="191"/><text x="55.9171%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (8 samples, 0.02%)</title><rect x="56.0829%" y="1333" width="0.0168%" height="15" fill="rgb(224,54,52)" fg:x="26705" fg:w="8"/><text x="56.3329%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (16 samples, 0.03%)</title><rect x="56.1312%" y="1317" width="0.0336%" height="15" fill="rgb(238,102,14)" fg:x="26728" fg:w="16"/><text x="56.3812%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (7 samples, 0.01%)</title><rect x="56.2026%" y="1301" width="0.0147%" height="15" fill="rgb(243,160,52)" fg:x="26762" fg:w="7"/><text x="56.4526%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (7 samples, 0.01%)</title><rect x="56.2026%" y="1285" width="0.0147%" height="15" fill="rgb(216,114,19)" fg:x="26762" fg:w="7"/><text x="56.4526%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="56.2047%" y="1269" width="0.0126%" height="15" fill="rgb(244,166,37)" fg:x="26763" fg:w="6"/><text x="56.4547%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`rack_get_thread_index (5 samples, 0.01%)</title><rect x="56.2383%" y="1285" width="0.0105%" height="15" fill="rgb(246,29,44)" fg:x="26779" fg:w="5"/><text x="56.4883%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (9 samples, 0.02%)</title><rect x="56.2929%" y="1253" width="0.0189%" height="15" fill="rgb(215,56,53)" fg:x="26805" fg:w="9"/><text x="56.5429%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (104 samples, 0.22%)</title><rect x="56.1039%" y="1333" width="0.2184%" height="15" fill="rgb(217,60,2)" fg:x="26715" fg:w="104"/><text x="56.3539%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (72 samples, 0.15%)</title><rect x="56.1711%" y="1317" width="0.1512%" height="15" fill="rgb(207,26,24)" fg:x="26747" fg:w="72"/><text x="56.4211%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (47 samples, 0.10%)</title><rect x="56.2236%" y="1301" width="0.0987%" height="15" fill="rgb(252,210,15)" fg:x="26772" fg:w="47"/><text x="56.4736%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (32 samples, 0.07%)</title><rect x="56.2551%" y="1285" width="0.0672%" height="15" fill="rgb(253,209,26)" fg:x="26787" fg:w="32"/><text x="56.5051%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (21 samples, 0.04%)</title><rect x="56.2782%" y="1269" width="0.0441%" height="15" fill="rgb(238,170,14)" fg:x="26798" fg:w="21"/><text x="56.5282%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::is_parse_comma_separated_end_with_trailing_commas (8 samples, 0.02%)</title><rect x="56.3370%" y="1333" width="0.0168%" height="15" fill="rgb(216,178,15)" fg:x="26826" fg:w="8"/><text x="56.5870%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (6 samples, 0.01%)</title><rect x="56.3412%" y="1317" width="0.0126%" height="15" fill="rgb(250,197,2)" fg:x="26828" fg:w="6"/><text x="56.5912%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="56.4042%" y="1317" width="0.0105%" height="15" fill="rgb(212,70,42)" fg:x="26858" fg:w="5"/><text x="56.6542%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_exclude (7 samples, 0.01%)</title><rect x="56.5113%" y="1301" width="0.0147%" height="15" fill="rgb(227,213,9)" fg:x="26909" fg:w="7"/><text x="56.7613%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_rename (7 samples, 0.01%)</title><rect x="56.5323%" y="1301" width="0.0147%" height="15" fill="rgb(245,99,25)" fg:x="26919" fg:w="7"/><text x="56.7823%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_additional_options (56 samples, 0.12%)</title><rect x="56.4399%" y="1317" width="0.1176%" height="15" fill="rgb(250,82,29)" fg:x="26875" fg:w="56"/><text x="56.6899%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_select_item_replace (5 samples, 0.01%)</title><rect x="56.5470%" y="1301" width="0.0105%" height="15" fill="rgb(241,226,54)" fg:x="26926" fg:w="5"/><text x="56.7970%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="56.5785%" y="1301" width="0.0147%" height="15" fill="rgb(221,99,41)" fg:x="26941" fg:w="7"/><text x="56.8285%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="56.5932%" y="1301" width="0.0126%" height="15" fill="rgb(213,90,21)" fg:x="26948" fg:w="6"/><text x="56.8432%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="56.6142%" y="1285" width="0.0147%" height="15" fill="rgb(205,208,24)" fg:x="26958" fg:w="7"/><text x="56.8642%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (14 samples, 0.03%)</title><rect x="56.6079%" y="1301" width="0.0294%" height="15" fill="rgb(246,31,12)" fg:x="26955" fg:w="14"/><text x="56.8579%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (6 samples, 0.01%)</title><rect x="56.6373%" y="1301" width="0.0126%" height="15" fill="rgb(213,154,6)" fg:x="26969" fg:w="6"/><text x="56.8873%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (23 samples, 0.05%)</title><rect x="56.6709%" y="1285" width="0.0483%" height="15" fill="rgb(222,163,29)" fg:x="26985" fg:w="23"/><text x="56.9209%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (5 samples, 0.01%)</title><rect x="56.7213%" y="1285" width="0.0105%" height="15" fill="rgb(227,201,8)" fg:x="27009" fg:w="5"/><text x="56.9713%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (15 samples, 0.03%)</title><rect x="56.7339%" y="1285" width="0.0315%" height="15" fill="rgb(233,9,32)" fg:x="27015" fg:w="15"/><text x="56.9839%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (14 samples, 0.03%)</title><rect x="56.7360%" y="1269" width="0.0294%" height="15" fill="rgb(217,54,24)" fg:x="27016" fg:w="14"/><text x="56.9860%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="56.7402%" y="1253" width="0.0252%" height="15" fill="rgb(235,192,0)" fg:x="27018" fg:w="12"/><text x="56.9902%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="56.8032%" y="1269" width="0.0105%" height="15" fill="rgb(235,45,9)" fg:x="27048" fg:w="5"/><text x="57.0532%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (13 samples, 0.03%)</title><rect x="56.8137%" y="1269" width="0.0273%" height="15" fill="rgb(246,42,40)" fg:x="27053" fg:w="13"/><text x="57.0637%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (17 samples, 0.04%)</title><rect x="56.8410%" y="1269" width="0.0357%" height="15" fill="rgb(248,111,24)" fg:x="27066" fg:w="17"/><text x="57.0910%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="56.8767%" y="1269" width="0.0105%" height="15" fill="rgb(249,65,22)" fg:x="27083" fg:w="5"/><text x="57.1267%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="56.8872%" y="1269" width="0.0168%" height="15" fill="rgb(238,111,51)" fg:x="27088" fg:w="8"/><text x="57.1372%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="56.8914%" y="1253" width="0.0126%" height="15" fill="rgb(250,118,22)" fg:x="27090" fg:w="6"/><text x="57.1414%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="56.9040%" y="1269" width="0.0105%" height="15" fill="rgb(234,84,26)" fg:x="27096" fg:w="5"/><text x="57.1540%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="57.0154%" y="1109" width="0.0189%" height="15" fill="rgb(243,172,12)" fg:x="27149" fg:w="9"/><text x="57.2654%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (18 samples, 0.04%)</title><rect x="57.0133%" y="1125" width="0.0378%" height="15" fill="rgb(236,150,49)" fg:x="27148" fg:w="18"/><text x="57.2633%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (30 samples, 0.06%)</title><rect x="57.0049%" y="1141" width="0.0630%" height="15" fill="rgb(225,197,26)" fg:x="27144" fg:w="30"/><text x="57.2549%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="57.0511%" y="1125" width="0.0168%" height="15" fill="rgb(214,17,42)" fg:x="27166" fg:w="8"/><text x="57.3011%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (41 samples, 0.09%)</title><rect x="56.9944%" y="1157" width="0.0861%" height="15" fill="rgb(224,165,40)" fg:x="27139" fg:w="41"/><text x="57.2444%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (51 samples, 0.11%)</title><rect x="56.9754%" y="1189" width="0.1071%" height="15" fill="rgb(246,100,4)" fg:x="27130" fg:w="51"/><text x="57.2254%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (45 samples, 0.09%)</title><rect x="56.9881%" y="1173" width="0.0945%" height="15" fill="rgb(222,103,0)" fg:x="27136" fg:w="45"/><text x="57.2381%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (56 samples, 0.12%)</title><rect x="56.9691%" y="1205" width="0.1176%" height="15" fill="rgb(227,189,26)" fg:x="27127" fg:w="56"/><text x="57.2191%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (79 samples, 0.17%)</title><rect x="56.9460%" y="1237" width="0.1659%" height="15" fill="rgb(214,202,17)" fg:x="27116" fg:w="79"/><text x="57.1960%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (78 samples, 0.16%)</title><rect x="56.9481%" y="1221" width="0.1638%" height="15" fill="rgb(229,111,3)" fg:x="27117" fg:w="78"/><text x="57.1981%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (7 samples, 0.01%)</title><rect x="57.0973%" y="1205" width="0.0147%" height="15" fill="rgb(229,172,15)" fg:x="27188" fg:w="7"/><text x="57.3473%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (88 samples, 0.18%)</title><rect x="56.9292%" y="1269" width="0.1848%" height="15" fill="rgb(230,224,35)" fg:x="27108" fg:w="88"/><text x="57.1792%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (84 samples, 0.18%)</title><rect x="56.9376%" y="1253" width="0.1764%" height="15" fill="rgb(251,141,6)" fg:x="27112" fg:w="84"/><text x="57.1876%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="57.1351%" y="1253" width="0.0210%" height="15" fill="rgb(225,208,6)" fg:x="27206" fg:w="10"/><text x="57.3851%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (21 samples, 0.04%)</title><rect x="57.1162%" y="1269" width="0.0441%" height="15" fill="rgb(246,181,16)" fg:x="27197" fg:w="21"/><text x="57.3662%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="57.2107%" y="1221" width="0.0105%" height="15" fill="rgb(227,129,36)" fg:x="27242" fg:w="5"/><text x="57.4607%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (9 samples, 0.02%)</title><rect x="57.2233%" y="1221" width="0.0189%" height="15" fill="rgb(248,117,24)" fg:x="27248" fg:w="9"/><text x="57.4733%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="57.2569%" y="1205" width="0.0126%" height="15" fill="rgb(214,185,35)" fg:x="27264" fg:w="6"/><text x="57.5069%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="57.2695%" y="1205" width="0.0168%" height="15" fill="rgb(236,150,34)" fg:x="27270" fg:w="8"/><text x="57.5195%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="57.2989%" y="1189" width="0.0168%" height="15" fill="rgb(243,228,27)" fg:x="27284" fg:w="8"/><text x="57.5489%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="57.3010%" y="1173" width="0.0147%" height="15" fill="rgb(245,77,44)" fg:x="27285" fg:w="7"/><text x="57.5510%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (16 samples, 0.03%)</title><rect x="57.2863%" y="1205" width="0.0336%" height="15" fill="rgb(235,214,42)" fg:x="27278" fg:w="16"/><text x="57.5363%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (62 samples, 0.13%)</title><rect x="57.1918%" y="1237" width="0.1302%" height="15" fill="rgb(221,74,3)" fg:x="27233" fg:w="62"/><text x="57.4418%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (38 samples, 0.08%)</title><rect x="57.2422%" y="1221" width="0.0798%" height="15" fill="rgb(206,121,29)" fg:x="27257" fg:w="38"/><text x="57.4922%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (12 samples, 0.03%)</title><rect x="57.3472%" y="1221" width="0.0252%" height="15" fill="rgb(249,131,53)" fg:x="27307" fg:w="12"/><text x="57.5972%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (12 samples, 0.03%)</title><rect x="57.3472%" y="1205" width="0.0252%" height="15" fill="rgb(236,170,29)" fg:x="27307" fg:w="12"/><text x="57.5972%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="57.3598%" y="1189" width="0.0126%" height="15" fill="rgb(247,96,15)" fg:x="27313" fg:w="6"/><text x="57.6098%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="57.3598%" y="1173" width="0.0126%" height="15" fill="rgb(211,210,7)" fg:x="27313" fg:w="6"/><text x="57.6098%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="57.3724%" y="1221" width="0.0273%" height="15" fill="rgb(240,88,50)" fg:x="27319" fg:w="13"/><text x="57.6224%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="57.3892%" y="1205" width="0.0105%" height="15" fill="rgb(209,229,26)" fg:x="27327" fg:w="5"/><text x="57.6392%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (9 samples, 0.02%)</title><rect x="57.4102%" y="1221" width="0.0189%" height="15" fill="rgb(210,68,23)" fg:x="27337" fg:w="9"/><text x="57.6602%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_type_modifiers (53 samples, 0.11%)</title><rect x="57.3220%" y="1237" width="0.1113%" height="15" fill="rgb(229,180,13)" fg:x="27295" fg:w="53"/><text x="57.5720%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (130 samples, 0.27%)</title><rect x="57.1645%" y="1253" width="0.2730%" height="15" fill="rgb(236,53,44)" fg:x="27220" fg:w="130"/><text x="57.4145%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (131 samples, 0.28%)</title><rect x="57.1645%" y="1269" width="0.2751%" height="15" fill="rgb(244,214,29)" fg:x="27220" fg:w="131"/><text x="57.4145%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="57.4690%" y="1253" width="0.0126%" height="15" fill="rgb(220,75,29)" fg:x="27365" fg:w="6"/><text x="57.7190%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_compound_field_access (7 samples, 0.01%)</title><rect x="57.5110%" y="1253" width="0.0147%" height="15" fill="rgb(214,183,37)" fg:x="27385" fg:w="7"/><text x="57.7610%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (5 samples, 0.01%)</title><rect x="57.5950%" y="1237" width="0.0105%" height="15" fill="rgb(239,117,29)" fg:x="27425" fg:w="5"/><text x="57.8450%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="57.6706%" y="1221" width="0.0105%" height="15" fill="rgb(237,171,35)" fg:x="27461" fg:w="5"/><text x="57.9206%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (25 samples, 0.05%)</title><rect x="57.6811%" y="1221" width="0.0525%" height="15" fill="rgb(229,178,53)" fg:x="27466" fg:w="25"/><text x="57.9311%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="57.7546%" y="1205" width="0.0168%" height="15" fill="rgb(210,102,19)" fg:x="27501" fg:w="8"/><text x="58.0046%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="57.7609%" y="1189" width="0.0105%" height="15" fill="rgb(235,127,22)" fg:x="27504" fg:w="5"/><text x="58.0109%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (18 samples, 0.04%)</title><rect x="57.7357%" y="1221" width="0.0378%" height="15" fill="rgb(244,31,31)" fg:x="27492" fg:w="18"/><text x="57.9857%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::expect_token (19 samples, 0.04%)</title><rect x="57.7777%" y="1221" width="0.0399%" height="15" fill="rgb(231,43,21)" fg:x="27512" fg:w="19"/><text x="58.0277%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="57.8323%" y="1205" width="0.0252%" height="15" fill="rgb(217,131,35)" fg:x="27538" fg:w="12"/><text x="58.0823%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (14 samples, 0.03%)</title><rect x="57.8575%" y="1205" width="0.0294%" height="15" fill="rgb(221,149,4)" fg:x="27550" fg:w="14"/><text x="58.1075%" y="1215.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (7 samples, 0.01%)</title><rect x="57.9499%" y="1125" width="0.0147%" height="15" fill="rgb(232,170,28)" fg:x="27594" fg:w="7"/><text x="58.1999%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (34 samples, 0.07%)</title><rect x="57.9037%" y="1205" width="0.0714%" height="15" fill="rgb(238,56,10)" fg:x="27572" fg:w="34"/><text x="58.1537%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (26 samples, 0.05%)</title><rect x="57.9205%" y="1189" width="0.0546%" height="15" fill="rgb(235,196,14)" fg:x="27580" fg:w="26"/><text x="58.1705%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (22 samples, 0.05%)</title><rect x="57.9289%" y="1173" width="0.0462%" height="15" fill="rgb(216,45,48)" fg:x="27584" fg:w="22"/><text x="58.1789%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (22 samples, 0.05%)</title><rect x="57.9289%" y="1157" width="0.0462%" height="15" fill="rgb(238,213,17)" fg:x="27584" fg:w="22"/><text x="58.1789%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (18 samples, 0.04%)</title><rect x="57.9373%" y="1141" width="0.0378%" height="15" fill="rgb(212,13,2)" fg:x="27588" fg:w="18"/><text x="58.1873%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (5 samples, 0.01%)</title><rect x="57.9646%" y="1125" width="0.0105%" height="15" fill="rgb(240,114,20)" fg:x="27601" fg:w="5"/><text x="58.2146%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_free (8 samples, 0.02%)</title><rect x="57.9898%" y="1189" width="0.0168%" height="15" fill="rgb(228,41,40)" fg:x="27613" fg:w="8"/><text x="58.2398%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (15 samples, 0.03%)</title><rect x="58.0066%" y="1189" width="0.0315%" height="15" fill="rgb(244,132,35)" fg:x="27621" fg:w="15"/><text x="58.2566%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="58.0507%" y="1189" width="0.0105%" height="15" fill="rgb(253,189,4)" fg:x="27642" fg:w="5"/><text x="58.3007%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="58.1011%" y="1157" width="0.0126%" height="15" fill="rgb(224,37,19)" fg:x="27666" fg:w="6"/><text x="58.3511%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="58.1137%" y="1157" width="0.0105%" height="15" fill="rgb(235,223,18)" fg:x="27672" fg:w="5"/><text x="58.3637%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (13 samples, 0.03%)</title><rect x="58.1494%" y="1141" width="0.0273%" height="15" fill="rgb(235,163,25)" fg:x="27689" fg:w="13"/><text x="58.3994%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (6 samples, 0.01%)</title><rect x="58.1809%" y="1125" width="0.0126%" height="15" fill="rgb(217,145,28)" fg:x="27704" fg:w="6"/><text x="58.4309%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (5 samples, 0.01%)</title><rect x="58.1830%" y="1109" width="0.0105%" height="15" fill="rgb(223,223,32)" fg:x="27705" fg:w="5"/><text x="58.4330%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (9 samples, 0.02%)</title><rect x="58.1767%" y="1141" width="0.0189%" height="15" fill="rgb(227,189,39)" fg:x="27702" fg:w="9"/><text x="58.4267%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (10 samples, 0.02%)</title><rect x="58.2292%" y="1029" width="0.0210%" height="15" fill="rgb(248,10,22)" fg:x="27727" fg:w="10"/><text x="58.4792%" y="1039.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (20 samples, 0.04%)</title><rect x="58.2166%" y="1061" width="0.0420%" height="15" fill="rgb(248,46,39)" fg:x="27721" fg:w="20"/><text x="58.4666%" y="1071.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (19 samples, 0.04%)</title><rect x="58.2187%" y="1045" width="0.0399%" height="15" fill="rgb(248,113,48)" fg:x="27722" fg:w="19"/><text x="58.4687%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (24 samples, 0.05%)</title><rect x="58.2145%" y="1093" width="0.0504%" height="15" fill="rgb(245,16,25)" fg:x="27720" fg:w="24"/><text x="58.4645%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (23 samples, 0.05%)</title><rect x="58.2166%" y="1077" width="0.0483%" height="15" fill="rgb(249,152,16)" fg:x="27721" fg:w="23"/><text x="58.4666%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (28 samples, 0.06%)</title><rect x="58.2103%" y="1109" width="0.0588%" height="15" fill="rgb(250,16,1)" fg:x="27718" fg:w="28"/><text x="58.4603%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (52 samples, 0.11%)</title><rect x="58.1956%" y="1141" width="0.1092%" height="15" fill="rgb(249,138,3)" fg:x="27711" fg:w="52"/><text x="58.4456%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (51 samples, 0.11%)</title><rect x="58.1977%" y="1125" width="0.1071%" height="15" fill="rgb(227,71,41)" fg:x="27712" fg:w="51"/><text x="58.4477%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (12 samples, 0.03%)</title><rect x="58.2796%" y="1109" width="0.0252%" height="15" fill="rgb(209,184,23)" fg:x="27751" fg:w="12"/><text x="58.5296%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="58.3048%" y="1141" width="0.0105%" height="15" fill="rgb(223,215,31)" fg:x="27763" fg:w="5"/><text x="58.5548%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (115 samples, 0.24%)</title><rect x="58.0927%" y="1173" width="0.2415%" height="15" fill="rgb(210,146,28)" fg:x="27662" fg:w="115"/><text x="58.3427%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (96 samples, 0.20%)</title><rect x="58.1326%" y="1157" width="0.2016%" height="15" fill="rgb(209,183,41)" fg:x="27681" fg:w="96"/><text x="58.3826%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_named_arg_operator (131 samples, 0.28%)</title><rect x="58.0675%" y="1189" width="0.2751%" height="15" fill="rgb(209,224,45)" fg:x="27650" fg:w="131"/><text x="58.3175%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="58.3531%" y="1173" width="0.0189%" height="15" fill="rgb(224,209,51)" fg:x="27786" fg:w="9"/><text x="58.6031%" y="1183.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="58.3615%" y="1157" width="0.0105%" height="15" fill="rgb(223,17,39)" fg:x="27790" fg:w="5"/><text x="58.6115%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="58.3804%" y="1157" width="0.0126%" height="15" fill="rgb(234,204,37)" fg:x="27799" fg:w="6"/><text x="58.6304%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (17 samples, 0.04%)</title><rect x="58.3720%" y="1173" width="0.0357%" height="15" fill="rgb(236,120,5)" fg:x="27795" fg:w="17"/><text x="58.6220%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="58.3930%" y="1157" width="0.0147%" height="15" fill="rgb(248,97,27)" fg:x="27805" fg:w="7"/><text x="58.6430%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="58.3972%" y="1141" width="0.0105%" height="15" fill="rgb(240,66,17)" fg:x="27807" fg:w="5"/><text x="58.6472%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (32 samples, 0.07%)</title><rect x="58.3426%" y="1189" width="0.0672%" height="15" fill="rgb(210,79,3)" fg:x="27781" fg:w="32"/><text x="58.5926%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="58.4392%" y="1157" width="0.0147%" height="15" fill="rgb(214,176,27)" fg:x="27827" fg:w="7"/><text x="58.6892%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="58.4539%" y="1157" width="0.0126%" height="15" fill="rgb(235,185,3)" fg:x="27834" fg:w="6"/><text x="58.7039%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (16 samples, 0.03%)</title><rect x="58.4371%" y="1173" width="0.0336%" height="15" fill="rgb(227,24,12)" fg:x="27826" fg:w="16"/><text x="58.6871%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (17 samples, 0.04%)</title><rect x="58.4980%" y="1157" width="0.0357%" height="15" fill="rgb(252,169,48)" fg:x="27855" fg:w="17"/><text x="58.7480%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (7 samples, 0.01%)</title><rect x="58.5484%" y="1157" width="0.0147%" height="15" fill="rgb(212,65,1)" fg:x="27879" fg:w="7"/><text x="58.7984%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (7 samples, 0.01%)</title><rect x="58.5484%" y="1141" width="0.0147%" height="15" fill="rgb(242,39,24)" fg:x="27879" fg:w="7"/><text x="58.7984%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="58.5967%" y="1141" width="0.0126%" height="15" fill="rgb(249,32,23)" fg:x="27902" fg:w="6"/><text x="58.8467%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="58.7206%" y="981" width="0.0147%" height="15" fill="rgb(251,195,23)" fg:x="27961" fg:w="7"/><text x="58.9706%" y="991.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (15 samples, 0.03%)</title><rect x="58.7164%" y="997" width="0.0315%" height="15" fill="rgb(236,174,8)" fg:x="27959" fg:w="15"/><text x="58.9664%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (29 samples, 0.06%)</title><rect x="58.7017%" y="1013" width="0.0609%" height="15" fill="rgb(220,197,8)" fg:x="27952" fg:w="29"/><text x="58.9517%" y="1023.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="58.7479%" y="997" width="0.0147%" height="15" fill="rgb(240,108,37)" fg:x="27974" fg:w="7"/><text x="58.9979%" y="1007.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (32 samples, 0.07%)</title><rect x="58.6996%" y="1029" width="0.0672%" height="15" fill="rgb(232,176,24)" fg:x="27951" fg:w="32"/><text x="58.9496%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (41 samples, 0.09%)</title><rect x="58.6912%" y="1077" width="0.0861%" height="15" fill="rgb(243,35,29)" fg:x="27947" fg:w="41"/><text x="58.9412%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (40 samples, 0.08%)</title><rect x="58.6933%" y="1061" width="0.0840%" height="15" fill="rgb(210,37,18)" fg:x="27948" fg:w="40"/><text x="58.9433%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (39 samples, 0.08%)</title><rect x="58.6954%" y="1045" width="0.0819%" height="15" fill="rgb(224,184,40)" fg:x="27949" fg:w="39"/><text x="58.9454%" y="1055.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (5 samples, 0.01%)</title><rect x="58.7668%" y="1029" width="0.0105%" height="15" fill="rgb(236,39,29)" fg:x="27983" fg:w="5"/><text x="59.0168%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (5 samples, 0.01%)</title><rect x="58.7836%" y="1077" width="0.0105%" height="15" fill="rgb(232,48,39)" fg:x="27991" fg:w="5"/><text x="59.0336%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (70 samples, 0.15%)</title><rect x="58.6723%" y="1109" width="0.1470%" height="15" fill="rgb(236,34,42)" fg:x="27938" fg:w="70"/><text x="58.9223%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (68 samples, 0.14%)</title><rect x="58.6765%" y="1093" width="0.1428%" height="15" fill="rgb(243,106,37)" fg:x="27940" fg:w="68"/><text x="58.9265%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (10 samples, 0.02%)</title><rect x="58.7983%" y="1077" width="0.0210%" height="15" fill="rgb(218,96,6)" fg:x="27998" fg:w="10"/><text x="59.0483%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (80 samples, 0.17%)</title><rect x="58.6534%" y="1141" width="0.1680%" height="15" fill="rgb(235,130,12)" fg:x="27929" fg:w="80"/><text x="58.9034%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (74 samples, 0.16%)</title><rect x="58.6660%" y="1125" width="0.1554%" height="15" fill="rgb(231,95,0)" fg:x="27935" fg:w="74"/><text x="58.9160%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="58.8319%" y="1125" width="0.0126%" height="15" fill="rgb(228,12,23)" fg:x="28014" fg:w="6"/><text x="59.0819%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (11 samples, 0.02%)</title><rect x="58.8235%" y="1141" width="0.0231%" height="15" fill="rgb(216,12,1)" fg:x="28010" fg:w="11"/><text x="59.0735%" y="1151.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="58.9117%" y="1077" width="0.0105%" height="15" fill="rgb(219,59,3)" fg:x="28052" fg:w="5"/><text x="59.1617%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (7 samples, 0.01%)</title><rect x="58.9264%" y="1077" width="0.0147%" height="15" fill="rgb(215,208,46)" fg:x="28059" fg:w="7"/><text x="59.1764%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (31 samples, 0.07%)</title><rect x="58.8781%" y="1109" width="0.0651%" height="15" fill="rgb(254,224,29)" fg:x="28036" fg:w="31"/><text x="59.1281%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (19 samples, 0.04%)</title><rect x="58.9033%" y="1093" width="0.0399%" height="15" fill="rgb(232,14,29)" fg:x="28048" fg:w="19"/><text x="59.1533%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (44 samples, 0.09%)</title><rect x="58.8613%" y="1125" width="0.0924%" height="15" fill="rgb(208,45,52)" fg:x="28028" fg:w="44"/><text x="59.1113%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (49 samples, 0.10%)</title><rect x="58.8529%" y="1141" width="0.1029%" height="15" fill="rgb(234,191,28)" fg:x="28024" fg:w="49"/><text x="59.1029%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (9 samples, 0.02%)</title><rect x="58.9558%" y="1141" width="0.0189%" height="15" fill="rgb(244,67,43)" fg:x="28073" fg:w="9"/><text x="59.2058%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (200 samples, 0.42%)</title><rect x="58.5652%" y="1157" width="0.4200%" height="15" fill="rgb(236,189,24)" fg:x="27887" fg:w="200"/><text x="58.8152%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (559 samples, 1.17%)</title><rect x="57.8197%" y="1221" width="1.1740%" height="15" fill="rgb(239,214,33)" fg:x="27532" fg:w="559"/><text x="58.0697%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_args (485 samples, 1.02%)</title><rect x="57.9751%" y="1205" width="1.0185%" height="15" fill="rgb(226,176,41)" fg:x="27606" fg:w="485"/><text x="58.2251%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (277 samples, 0.58%)</title><rect x="58.4119%" y="1189" width="0.5817%" height="15" fill="rgb(248,47,8)" fg:x="27814" fg:w="277"/><text x="58.6619%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (243 samples, 0.51%)</title><rect x="58.4833%" y="1173" width="0.5103%" height="15" fill="rgb(218,81,44)" fg:x="27848" fg:w="243"/><text x="58.7333%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_argument_list (663 samples, 1.39%)</title><rect x="57.6139%" y="1237" width="1.3924%" height="15" fill="rgb(213,98,6)" fg:x="27434" fg:w="663"/><text x="57.8639%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_listagg_on_overflow (5 samples, 0.01%)</title><rect x="58.9957%" y="1221" width="0.0105%" height="15" fill="rgb(222,85,22)" fg:x="28092" fg:w="5"/><text x="59.2457%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_json_null_clause (13 samples, 0.03%)</title><rect x="59.0062%" y="1237" width="0.0273%" height="15" fill="rgb(239,46,39)" fg:x="28097" fg:w="13"/><text x="59.2562%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_function_call (723 samples, 1.52%)</title><rect x="57.5278%" y="1253" width="1.5184%" height="15" fill="rgb(237,12,29)" fg:x="27393" fg:w="723"/><text x="57.7778%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_listagg_on_overflow (6 samples, 0.01%)</title><rect x="59.0335%" y="1237" width="0.0126%" height="15" fill="rgb(214,77,8)" fg:x="28110" fg:w="6"/><text x="59.2835%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (766 samples, 1.61%)</title><rect x="57.4396%" y="1269" width="1.6087%" height="15" fill="rgb(217,168,37)" fg:x="27351" fg:w="766"/><text x="57.6896%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (1,085 samples, 2.28%)</title><rect x="56.7759%" y="1285" width="2.2786%" height="15" fill="rgb(221,217,23)" fg:x="27035" fg:w="1085"/><text x="57.0259%" y="1295.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select_item (1,285 samples, 2.70%)</title><rect x="56.3580%" y="1333" width="2.6986%" height="15" fill="rgb(243,229,36)" fg:x="26836" fg:w="1285"/><text x="56.6080%" y="1343.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_wildcard_expr (1,190 samples, 2.50%)</title><rect x="56.5575%" y="1317" width="2.4991%" height="15" fill="rgb(251,163,40)" fg:x="26931" fg:w="1190"/><text x="56.8075%" y="1327.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,144 samples, 2.40%)</title><rect x="56.6541%" y="1301" width="2.4025%" height="15" fill="rgb(237,222,12)" fg:x="26977" fg:w="1144"/><text x="56.9041%" y="1311.50">sq..</text></g><g><title>libsystem_malloc.dylib`_free (15 samples, 0.03%)</title><rect x="59.1847%" y="1317" width="0.0315%" height="15" fill="rgb(248,132,6)" fg:x="28182" fg:w="15"/><text x="59.4347%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (15 samples, 0.03%)</title><rect x="59.2162%" y="1317" width="0.0315%" height="15" fill="rgb(227,167,50)" fg:x="28197" fg:w="15"/><text x="59.4662%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (45 samples, 0.09%)</title><rect x="59.2477%" y="1317" width="0.0945%" height="15" fill="rgb(242,84,37)" fg:x="28212" fg:w="45"/><text x="59.4977%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;T as core::any::Any&gt;::type_id (7 samples, 0.01%)</title><rect x="59.3423%" y="1317" width="0.0147%" height="15" fill="rgb(212,4,50)" fg:x="28257" fg:w="7"/><text x="59.5923%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (10 samples, 0.02%)</title><rect x="59.3717%" y="1301" width="0.0210%" height="15" fill="rgb(230,228,32)" fg:x="28271" fg:w="10"/><text x="59.6217%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="59.3990%" y="1301" width="0.0168%" height="15" fill="rgb(248,217,23)" fg:x="28284" fg:w="8"/><text x="59.6490%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="59.4053%" y="1285" width="0.0105%" height="15" fill="rgb(238,197,32)" fg:x="28287" fg:w="5"/><text x="59.6553%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (29 samples, 0.06%)</title><rect x="59.3654%" y="1317" width="0.0609%" height="15" fill="rgb(236,106,1)" fg:x="28268" fg:w="29"/><text x="59.6154%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (8 samples, 0.02%)</title><rect x="59.4284%" y="1317" width="0.0168%" height="15" fill="rgb(219,228,13)" fg:x="28298" fg:w="8"/><text x="59.6784%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (7 samples, 0.01%)</title><rect x="59.4641%" y="1285" width="0.0147%" height="15" fill="rgb(238,30,35)" fg:x="28315" fg:w="7"/><text x="59.7141%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (7 samples, 0.01%)</title><rect x="59.4641%" y="1269" width="0.0147%" height="15" fill="rgb(236,70,23)" fg:x="28315" fg:w="7"/><text x="59.7141%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="59.4662%" y="1253" width="0.0126%" height="15" fill="rgb(249,104,48)" fg:x="28316" fg:w="6"/><text x="59.7162%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (17 samples, 0.04%)</title><rect x="59.4515%" y="1317" width="0.0357%" height="15" fill="rgb(254,117,50)" fg:x="28309" fg:w="17"/><text x="59.7015%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (13 samples, 0.03%)</title><rect x="59.4599%" y="1301" width="0.0273%" height="15" fill="rgb(223,152,4)" fg:x="28313" fg:w="13"/><text x="59.7099%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (10 samples, 0.02%)</title><rect x="59.4872%" y="1317" width="0.0210%" height="15" fill="rgb(245,6,2)" fg:x="28326" fg:w="10"/><text x="59.7372%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_join_constraint (16 samples, 0.03%)</title><rect x="59.5334%" y="1317" width="0.0336%" height="15" fill="rgb(249,150,24)" fg:x="28348" fg:w="16"/><text x="59.7834%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_parenthesized_column_list (13 samples, 0.03%)</title><rect x="59.5397%" y="1301" width="0.0273%" height="15" fill="rgb(228,185,42)" fg:x="28351" fg:w="13"/><text x="59.7897%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (5 samples, 0.01%)</title><rect x="59.5565%" y="1285" width="0.0105%" height="15" fill="rgb(226,39,33)" fg:x="28359" fg:w="5"/><text x="59.8065%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (15 samples, 0.03%)</title><rect x="59.5670%" y="1317" width="0.0315%" height="15" fill="rgb(221,166,19)" fg:x="28364" fg:w="15"/><text x="59.8170%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keywords (12 samples, 0.03%)</title><rect x="59.5985%" y="1317" width="0.0252%" height="15" fill="rgb(209,109,2)" fg:x="28379" fg:w="12"/><text x="59.8485%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (5 samples, 0.01%)</title><rect x="59.6237%" y="1317" width="0.0105%" height="15" fill="rgb(252,216,26)" fg:x="28391" fg:w="5"/><text x="59.8737%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_one_of_keywords (7 samples, 0.01%)</title><rect x="59.6342%" y="1317" width="0.0147%" height="15" fill="rgb(227,173,36)" fg:x="28396" fg:w="7"/><text x="59.8842%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (42 samples, 0.09%)</title><rect x="59.8001%" y="1301" width="0.0882%" height="15" fill="rgb(209,90,7)" fg:x="28475" fg:w="42"/><text x="60.0501%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;T as core::any::Any&gt;::type_id (7 samples, 0.01%)</title><rect x="59.8883%" y="1301" width="0.0147%" height="15" fill="rgb(250,194,11)" fg:x="28517" fg:w="7"/><text x="60.1383%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::cmp::PartialEq&gt;::eq (5 samples, 0.01%)</title><rect x="59.9051%" y="1301" width="0.0105%" height="15" fill="rgb(220,72,50)" fg:x="28525" fg:w="5"/><text x="60.1551%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (8 samples, 0.02%)</title><rect x="59.9198%" y="1301" width="0.0168%" height="15" fill="rgb(222,106,48)" fg:x="28532" fg:w="8"/><text x="60.1698%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::maybe_parse_table_sample (6 samples, 0.01%)</title><rect x="59.9471%" y="1301" width="0.0126%" height="15" fill="rgb(216,220,45)" fg:x="28545" fg:w="6"/><text x="60.1971%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_free (5 samples, 0.01%)</title><rect x="59.9996%" y="1285" width="0.0105%" height="15" fill="rgb(234,112,18)" fg:x="28570" fg:w="5"/><text x="60.2496%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (5 samples, 0.01%)</title><rect x="60.0227%" y="1285" width="0.0105%" height="15" fill="rgb(206,179,9)" fg:x="28581" fg:w="5"/><text x="60.2727%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (11 samples, 0.02%)</title><rect x="60.0458%" y="1269" width="0.0231%" height="15" fill="rgb(215,115,40)" fg:x="28592" fg:w="11"/><text x="60.2958%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (43 samples, 0.09%)</title><rect x="60.0332%" y="1285" width="0.0903%" height="15" fill="rgb(222,69,34)" fg:x="28586" fg:w="43"/><text x="60.2832%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (26 samples, 0.05%)</title><rect x="60.0689%" y="1269" width="0.0546%" height="15" fill="rgb(209,161,10)" fg:x="28603" fg:w="26"/><text x="60.3189%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (25 samples, 0.05%)</title><rect x="60.0710%" y="1253" width="0.0525%" height="15" fill="rgb(217,6,38)" fg:x="28604" fg:w="25"/><text x="60.3210%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_allocate_outlined (12 samples, 0.03%)</title><rect x="60.0983%" y="1237" width="0.0252%" height="15" fill="rgb(229,229,48)" fg:x="28617" fg:w="12"/><text x="60.3483%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (7 samples, 0.01%)</title><rect x="60.1235%" y="1285" width="0.0147%" height="15" fill="rgb(225,21,28)" fg:x="28629" fg:w="7"/><text x="60.3735%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="60.2537%" y="1269" width="0.0105%" height="15" fill="rgb(206,33,13)" fg:x="28691" fg:w="5"/><text x="60.5037%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (12 samples, 0.03%)</title><rect x="60.2642%" y="1269" width="0.0252%" height="15" fill="rgb(242,178,17)" fg:x="28696" fg:w="12"/><text x="60.5142%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (11 samples, 0.02%)</title><rect x="60.2894%" y="1269" width="0.0231%" height="15" fill="rgb(220,162,5)" fg:x="28708" fg:w="11"/><text x="60.5394%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (23 samples, 0.05%)</title><rect x="60.3125%" y="1269" width="0.0483%" height="15" fill="rgb(210,33,43)" fg:x="28719" fg:w="23"/><text x="60.5625%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (14 samples, 0.03%)</title><rect x="60.3314%" y="1253" width="0.0294%" height="15" fill="rgb(216,116,54)" fg:x="28728" fg:w="14"/><text x="60.5814%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (23 samples, 0.05%)</title><rect x="60.3797%" y="1253" width="0.0483%" height="15" fill="rgb(249,92,24)" fg:x="28751" fg:w="23"/><text x="60.6297%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="60.4133%" y="1237" width="0.0147%" height="15" fill="rgb(231,189,14)" fg:x="28767" fg:w="7"/><text x="60.6633%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (37 samples, 0.08%)</title><rect x="60.3608%" y="1269" width="0.0777%" height="15" fill="rgb(230,8,41)" fg:x="28742" fg:w="37"/><text x="60.6108%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (231 samples, 0.49%)</title><rect x="59.9618%" y="1301" width="0.4851%" height="15" fill="rgb(249,7,27)" fg:x="28552" fg:w="231"/><text x="60.2118%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (147 samples, 0.31%)</title><rect x="60.1382%" y="1285" width="0.3087%" height="15" fill="rgb(232,86,5)" fg:x="28636" fg:w="147"/><text x="60.3882%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (6 samples, 0.01%)</title><rect x="60.4763%" y="1285" width="0.0126%" height="15" fill="rgb(224,175,18)" fg:x="28797" fg:w="6"/><text x="60.7263%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="60.5624%" y="1269" width="0.0168%" height="15" fill="rgb(220,129,12)" fg:x="28838" fg:w="8"/><text x="60.8124%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (9 samples, 0.02%)</title><rect x="60.6023%" y="1253" width="0.0189%" height="15" fill="rgb(210,19,36)" fg:x="28857" fg:w="9"/><text x="60.8523%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="60.6212%" y="1253" width="0.0273%" height="15" fill="rgb(219,96,14)" fg:x="28866" fg:w="13"/><text x="60.8712%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (9 samples, 0.02%)</title><rect x="60.6296%" y="1237" width="0.0189%" height="15" fill="rgb(249,106,1)" fg:x="28870" fg:w="9"/><text x="60.8796%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_table_alias (100 samples, 0.21%)</title><rect x="60.4532%" y="1301" width="0.2100%" height="15" fill="rgb(249,155,20)" fg:x="28786" fg:w="100"/><text x="60.7032%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_optional_alias (82 samples, 0.17%)</title><rect x="60.4910%" y="1285" width="0.1722%" height="15" fill="rgb(244,168,9)" fg:x="28804" fg:w="82"/><text x="60.7410%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (37 samples, 0.08%)</title><rect x="60.5855%" y="1269" width="0.0777%" height="15" fill="rgb(216,23,50)" fg:x="28849" fg:w="37"/><text x="60.8355%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (7 samples, 0.01%)</title><rect x="60.6905%" y="1269" width="0.0147%" height="15" fill="rgb(224,219,20)" fg:x="28899" fg:w="7"/><text x="60.9405%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (15 samples, 0.03%)</title><rect x="60.7094%" y="1269" width="0.0315%" height="15" fill="rgb(222,156,15)" fg:x="28908" fg:w="15"/><text x="60.9594%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (9 samples, 0.02%)</title><rect x="60.7220%" y="1253" width="0.0189%" height="15" fill="rgb(231,97,17)" fg:x="28914" fg:w="9"/><text x="60.9720%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (40 samples, 0.08%)</title><rect x="60.6674%" y="1301" width="0.0840%" height="15" fill="rgb(218,70,48)" fg:x="28888" fg:w="40"/><text x="60.9174%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (33 samples, 0.07%)</title><rect x="60.6821%" y="1285" width="0.0693%" height="15" fill="rgb(212,196,52)" fg:x="28895" fg:w="33"/><text x="60.9321%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (15 samples, 0.03%)</title><rect x="61.0076%" y="1269" width="0.0315%" height="15" fill="rgb(243,203,18)" fg:x="29050" fg:w="15"/><text x="61.2576%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (15 samples, 0.03%)</title><rect x="61.0391%" y="1269" width="0.0315%" height="15" fill="rgb(252,125,41)" fg:x="29065" fg:w="15"/><text x="61.2891%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (19 samples, 0.04%)</title><rect x="61.0706%" y="1269" width="0.0399%" height="15" fill="rgb(223,180,33)" fg:x="29080" fg:w="19"/><text x="61.3206%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (12 samples, 0.03%)</title><rect x="61.0853%" y="1253" width="0.0252%" height="15" fill="rgb(254,159,46)" fg:x="29087" fg:w="12"/><text x="61.3353%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_factor (701 samples, 1.47%)</title><rect x="59.6510%" y="1317" width="1.4722%" height="15" fill="rgb(254,38,10)" fg:x="28404" fg:w="701"/><text x="59.9010%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_tokens (177 samples, 0.37%)</title><rect x="60.7514%" y="1301" width="0.3717%" height="15" fill="rgb(208,217,32)" fg:x="28928" fg:w="177"/><text x="61.0014%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (65 samples, 0.14%)</title><rect x="60.9866%" y="1285" width="0.1365%" height="15" fill="rgb(221,120,13)" fg:x="29040" fg:w="65"/><text x="61.2366%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_version (5 samples, 0.01%)</title><rect x="61.1231%" y="1317" width="0.0105%" height="15" fill="rgb(246,54,52)" fg:x="29105" fg:w="5"/><text x="61.3731%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_table_and_joins (991 samples, 2.08%)</title><rect x="59.0566%" y="1333" width="2.0812%" height="15" fill="rgb(242,34,25)" fg:x="28121" fg:w="991"/><text x="59.3066%" y="1343.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_comma_separated_with_trailing_commas (2,665 samples, 5.60%)</title><rect x="55.5663%" y="1349" width="5.5967%" height="15" fill="rgb(247,209,9)" fg:x="26459" fg:w="2665"/><text x="55.8163%" y="1359.50">sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_infix (6 samples, 0.01%)</title><rect x="61.1630%" y="1349" width="0.0126%" height="15" fill="rgb(228,71,26)" fg:x="29124" fg:w="6"/><text x="61.4130%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (13 samples, 0.03%)</title><rect x="61.2617%" y="1333" width="0.0273%" height="15" fill="rgb(222,145,49)" fg:x="29171" fg:w="13"/><text x="61.5117%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (85 samples, 0.18%)</title><rect x="61.3079%" y="1333" width="0.1785%" height="15" fill="rgb(218,121,17)" fg:x="29193" fg:w="85"/><text x="61.5579%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="61.4990%" y="1333" width="0.0126%" height="15" fill="rgb(244,50,7)" fg:x="29284" fg:w="6"/><text x="61.7490%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (5 samples, 0.01%)</title><rect x="61.5116%" y="1333" width="0.0105%" height="15" fill="rgb(246,229,37)" fg:x="29290" fg:w="5"/><text x="61.7616%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (8 samples, 0.02%)</title><rect x="61.5242%" y="1333" width="0.0168%" height="15" fill="rgb(225,18,5)" fg:x="29296" fg:w="8"/><text x="61.7742%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="61.5494%" y="1317" width="0.0168%" height="15" fill="rgb(213,204,8)" fg:x="29308" fg:w="8"/><text x="61.7994%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (32 samples, 0.07%)</title><rect x="61.5410%" y="1333" width="0.0672%" height="15" fill="rgb(238,103,6)" fg:x="29304" fg:w="32"/><text x="61.7910%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (19 samples, 0.04%)</title><rect x="61.5683%" y="1317" width="0.0399%" height="15" fill="rgb(222,25,35)" fg:x="29317" fg:w="19"/><text x="61.8183%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (14 samples, 0.03%)</title><rect x="61.5788%" y="1301" width="0.0294%" height="15" fill="rgb(213,203,35)" fg:x="29322" fg:w="14"/><text x="61.8288%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`rack_get_thread_index (8 samples, 0.02%)</title><rect x="61.6986%" y="1301" width="0.0168%" height="15" fill="rgb(221,79,53)" fg:x="29379" fg:w="8"/><text x="61.9486%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (8 samples, 0.02%)</title><rect x="61.7154%" y="1301" width="0.0168%" height="15" fill="rgb(243,200,35)" fg:x="29387" fg:w="8"/><text x="61.9654%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`set_tiny_meta_header_in_use (11 samples, 0.02%)</title><rect x="61.7679%" y="1285" width="0.0231%" height="15" fill="rgb(248,60,25)" fg:x="29412" fg:w="11"/><text x="62.0179%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_tiny_check_and_zero_inline_meta_from_freelist (5 samples, 0.01%)</title><rect x="61.8813%" y="1269" width="0.0105%" height="15" fill="rgb(227,53,46)" fg:x="29466" fg:w="5"/><text x="62.1313%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (114 samples, 0.24%)</title><rect x="61.6629%" y="1317" width="0.2394%" height="15" fill="rgb(216,120,32)" fg:x="29362" fg:w="114"/><text x="61.9129%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (81 samples, 0.17%)</title><rect x="61.7322%" y="1301" width="0.1701%" height="15" fill="rgb(220,134,1)" fg:x="29395" fg:w="81"/><text x="61.9822%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (53 samples, 0.11%)</title><rect x="61.7910%" y="1285" width="0.1113%" height="15" fill="rgb(237,168,5)" fg:x="29423" fg:w="53"/><text x="62.0410%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (5 samples, 0.01%)</title><rect x="61.8918%" y="1269" width="0.0105%" height="15" fill="rgb(231,100,33)" fg:x="29471" fg:w="5"/><text x="62.1418%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (23 samples, 0.05%)</title><rect x="61.9065%" y="1317" width="0.0483%" height="15" fill="rgb(236,177,47)" fg:x="29478" fg:w="23"/><text x="62.1565%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="62.0199%" y="1301" width="0.0147%" height="15" fill="rgb(235,7,49)" fg:x="29532" fg:w="7"/><text x="62.2699%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="62.0346%" y="1301" width="0.0126%" height="15" fill="rgb(232,119,22)" fg:x="29539" fg:w="6"/><text x="62.2846%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="62.0472%" y="1301" width="0.0126%" height="15" fill="rgb(254,73,53)" fg:x="29545" fg:w="6"/><text x="62.2972%" y="1311.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (62 samples, 0.13%)</title><rect x="62.0703%" y="1301" width="0.1302%" height="15" fill="rgb(251,35,20)" fg:x="29556" fg:w="62"/><text x="62.3203%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (7 samples, 0.01%)</title><rect x="62.2110%" y="1301" width="0.0147%" height="15" fill="rgb(241,119,20)" fg:x="29623" fg:w="7"/><text x="62.4610%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::tokenizer::Token&gt; (12 samples, 0.03%)</title><rect x="62.2341%" y="1301" width="0.0252%" height="15" fill="rgb(207,102,14)" fg:x="29634" fg:w="12"/><text x="62.4841%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (30 samples, 0.06%)</title><rect x="62.2593%" y="1301" width="0.0630%" height="15" fill="rgb(248,201,50)" fg:x="29646" fg:w="30"/><text x="62.5093%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (20 samples, 0.04%)</title><rect x="62.2803%" y="1285" width="0.0420%" height="15" fill="rgb(222,185,44)" fg:x="29656" fg:w="20"/><text x="62.5303%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (12 samples, 0.03%)</title><rect x="62.2971%" y="1269" width="0.0252%" height="15" fill="rgb(218,107,18)" fg:x="29664" fg:w="12"/><text x="62.5471%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`set_tiny_meta_header_in_use (8 samples, 0.02%)</title><rect x="62.3475%" y="1253" width="0.0168%" height="15" fill="rgb(237,177,39)" fg:x="29688" fg:w="8"/><text x="62.5975%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (37 samples, 0.08%)</title><rect x="62.3391%" y="1285" width="0.0777%" height="15" fill="rgb(246,69,6)" fg:x="29684" fg:w="37"/><text x="62.5891%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (36 samples, 0.08%)</title><rect x="62.3412%" y="1269" width="0.0756%" height="15" fill="rgb(234,208,37)" fg:x="29685" fg:w="36"/><text x="62.5912%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (25 samples, 0.05%)</title><rect x="62.3643%" y="1253" width="0.0525%" height="15" fill="rgb(225,4,6)" fg:x="29696" fg:w="25"/><text x="62.6143%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="62.4441%" y="1269" width="0.0147%" height="15" fill="rgb(233,45,0)" fg:x="29734" fg:w="7"/><text x="62.6941%" y="1279.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (19 samples, 0.04%)</title><rect x="62.4630%" y="1269" width="0.0399%" height="15" fill="rgb(226,136,5)" fg:x="29743" fg:w="19"/><text x="62.7130%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="62.5134%" y="1253" width="0.0147%" height="15" fill="rgb(211,91,47)" fg:x="29767" fg:w="7"/><text x="62.7634%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::dialect::Dialect::get_next_precedence_default (25 samples, 0.05%)</title><rect x="62.5113%" y="1269" width="0.0525%" height="15" fill="rgb(242,88,51)" fg:x="29766" fg:w="25"/><text x="62.7613%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::peek_token (17 samples, 0.04%)</title><rect x="62.5281%" y="1253" width="0.0357%" height="15" fill="rgb(230,91,28)" fg:x="29774" fg:w="17"/><text x="62.7781%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (13 samples, 0.03%)</title><rect x="62.5365%" y="1237" width="0.0273%" height="15" fill="rgb(254,186,29)" fg:x="29778" fg:w="13"/><text x="62.7865%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="62.6184%" y="1253" width="0.0126%" height="15" fill="rgb(238,6,4)" fg:x="29817" fg:w="6"/><text x="62.8684%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="62.6688%" y="1221" width="0.0105%" height="15" fill="rgb(221,151,16)" fg:x="29841" fg:w="5"/><text x="62.9188%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="62.6856%" y="1221" width="0.0105%" height="15" fill="rgb(251,143,52)" fg:x="29849" fg:w="5"/><text x="62.9356%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (12 samples, 0.03%)</title><rect x="62.7507%" y="1189" width="0.0252%" height="15" fill="rgb(206,90,15)" fg:x="29880" fg:w="12"/><text x="63.0007%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (11 samples, 0.02%)</title><rect x="62.7780%" y="1173" width="0.0231%" height="15" fill="rgb(218,35,8)" fg:x="29893" fg:w="11"/><text x="63.0280%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (6 samples, 0.01%)</title><rect x="62.7885%" y="1157" width="0.0126%" height="15" fill="rgb(239,215,6)" fg:x="29898" fg:w="6"/><text x="63.0385%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="62.7906%" y="1141" width="0.0105%" height="15" fill="rgb(245,116,39)" fg:x="29899" fg:w="5"/><text x="63.0406%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (13 samples, 0.03%)</title><rect x="62.7759%" y="1189" width="0.0273%" height="15" fill="rgb(242,65,28)" fg:x="29892" fg:w="13"/><text x="63.0259%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="62.8200%" y="1157" width="0.0126%" height="15" fill="rgb(252,132,53)" fg:x="29913" fg:w="6"/><text x="63.0700%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (9 samples, 0.02%)</title><rect x="62.8620%" y="1077" width="0.0189%" height="15" fill="rgb(224,159,50)" fg:x="29933" fg:w="9"/><text x="63.1120%" y="1087.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (18 samples, 0.04%)</title><rect x="62.8473%" y="1093" width="0.0378%" height="15" fill="rgb(224,93,4)" fg:x="29926" fg:w="18"/><text x="63.0973%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (20 samples, 0.04%)</title><rect x="62.8452%" y="1109" width="0.0420%" height="15" fill="rgb(208,81,34)" fg:x="29925" fg:w="20"/><text x="63.0952%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (28 samples, 0.06%)</title><rect x="62.8326%" y="1157" width="0.0588%" height="15" fill="rgb(233,92,54)" fg:x="29919" fg:w="28"/><text x="63.0826%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (24 samples, 0.05%)</title><rect x="62.8410%" y="1141" width="0.0504%" height="15" fill="rgb(237,21,14)" fg:x="29923" fg:w="24"/><text x="63.0910%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (22 samples, 0.05%)</title><rect x="62.8452%" y="1125" width="0.0462%" height="15" fill="rgb(249,128,51)" fg:x="29925" fg:w="22"/><text x="63.0952%" y="1135.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="62.9103%" y="1141" width="0.0105%" height="15" fill="rgb(223,129,24)" fg:x="29956" fg:w="5"/><text x="63.1603%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (57 samples, 0.12%)</title><rect x="62.8032%" y="1189" width="0.1197%" height="15" fill="rgb(231,168,25)" fg:x="29905" fg:w="57"/><text x="63.0532%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (55 samples, 0.12%)</title><rect x="62.8074%" y="1173" width="0.1155%" height="15" fill="rgb(224,39,20)" fg:x="29907" fg:w="55"/><text x="63.0574%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (11 samples, 0.02%)</title><rect x="62.8998%" y="1157" width="0.0231%" height="15" fill="rgb(225,152,53)" fg:x="29951" fg:w="11"/><text x="63.1498%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (5 samples, 0.01%)</title><rect x="62.9271%" y="1173" width="0.0105%" height="15" fill="rgb(252,17,24)" fg:x="29964" fg:w="5"/><text x="63.1771%" y="1183.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="62.9502%" y="1157" width="0.0126%" height="15" fill="rgb(250,114,30)" fg:x="29975" fg:w="6"/><text x="63.2002%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (20 samples, 0.04%)</title><rect x="62.9229%" y="1189" width="0.0420%" height="15" fill="rgb(229,5,4)" fg:x="29962" fg:w="20"/><text x="63.1729%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (13 samples, 0.03%)</title><rect x="62.9376%" y="1173" width="0.0273%" height="15" fill="rgb(225,176,49)" fg:x="29969" fg:w="13"/><text x="63.1876%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (157 samples, 0.33%)</title><rect x="62.6541%" y="1253" width="0.3297%" height="15" fill="rgb(224,221,49)" fg:x="29834" fg:w="157"/><text x="62.9041%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (155 samples, 0.33%)</title><rect x="62.6583%" y="1237" width="0.3255%" height="15" fill="rgb(253,169,27)" fg:x="29836" fg:w="155"/><text x="62.9083%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (136 samples, 0.29%)</title><rect x="62.6982%" y="1221" width="0.2856%" height="15" fill="rgb(211,206,16)" fg:x="29855" fg:w="136"/><text x="62.9482%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (121 samples, 0.25%)</title><rect x="62.7297%" y="1205" width="0.2541%" height="15" fill="rgb(244,87,35)" fg:x="29870" fg:w="121"/><text x="62.9797%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="63.0216%" y="1221" width="0.0105%" height="15" fill="rgb(246,28,10)" fg:x="30009" fg:w="5"/><text x="63.2716%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (223 samples, 0.47%)</title><rect x="62.5701%" y="1269" width="0.4683%" height="15" fill="rgb(229,12,44)" fg:x="29794" fg:w="223"/><text x="62.8201%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (26 samples, 0.05%)</title><rect x="62.9838%" y="1253" width="0.0546%" height="15" fill="rgb(210,145,37)" fg:x="29991" fg:w="26"/><text x="63.2338%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="63.0195%" y="1237" width="0.0189%" height="15" fill="rgb(227,112,52)" fg:x="30008" fg:w="9"/><text x="63.2695%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_infix (338 samples, 0.71%)</title><rect x="62.3307%" y="1301" width="0.7098%" height="15" fill="rgb(238,155,34)" fg:x="29680" fg:w="338"/><text x="62.5807%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (291 samples, 0.61%)</title><rect x="62.4294%" y="1285" width="0.6111%" height="15" fill="rgb(239,226,36)" fg:x="29727" fg:w="291"/><text x="62.6794%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (7 samples, 0.01%)</title><rect x="63.0405%" y="1301" width="0.0147%" height="15" fill="rgb(230,16,23)" fg:x="30018" fg:w="7"/><text x="63.2905%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (6 samples, 0.01%)</title><rect x="63.1413%" y="1285" width="0.0126%" height="15" fill="rgb(236,171,36)" fg:x="30066" fg:w="6"/><text x="63.3913%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (24 samples, 0.05%)</title><rect x="63.1539%" y="1285" width="0.0504%" height="15" fill="rgb(221,22,14)" fg:x="30072" fg:w="24"/><text x="63.4039%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="63.2043%" y="1285" width="0.0168%" height="15" fill="rgb(242,43,11)" fg:x="30096" fg:w="8"/><text x="63.4543%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (8 samples, 0.02%)</title><rect x="63.2211%" y="1285" width="0.0168%" height="15" fill="rgb(232,69,23)" fg:x="30104" fg:w="8"/><text x="63.4711%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="63.2862%" y="1221" width="0.0147%" height="15" fill="rgb(216,180,54)" fg:x="30135" fg:w="7"/><text x="63.5362%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (5 samples, 0.01%)</title><rect x="63.3408%" y="1141" width="0.0105%" height="15" fill="rgb(216,5,24)" fg:x="30161" fg:w="5"/><text x="63.5908%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="63.3555%" y="1125" width="0.0210%" height="15" fill="rgb(225,89,9)" fg:x="30168" fg:w="10"/><text x="63.6055%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (18 samples, 0.04%)</title><rect x="63.3513%" y="1141" width="0.0378%" height="15" fill="rgb(243,75,33)" fg:x="30166" fg:w="18"/><text x="63.6013%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (38 samples, 0.08%)</title><rect x="63.3240%" y="1157" width="0.0798%" height="15" fill="rgb(247,141,45)" fg:x="30153" fg:w="38"/><text x="63.5740%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="63.3891%" y="1141" width="0.0147%" height="15" fill="rgb(232,177,36)" fg:x="30184" fg:w="7"/><text x="63.6391%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (42 samples, 0.09%)</title><rect x="63.3198%" y="1173" width="0.0882%" height="15" fill="rgb(219,125,36)" fg:x="30151" fg:w="42"/><text x="63.5698%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (52 samples, 0.11%)</title><rect x="63.3051%" y="1205" width="0.1092%" height="15" fill="rgb(227,94,9)" fg:x="30144" fg:w="52"/><text x="63.5551%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (47 samples, 0.10%)</title><rect x="63.3156%" y="1189" width="0.0987%" height="15" fill="rgb(240,34,52)" fg:x="30149" fg:w="47"/><text x="63.5656%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (55 samples, 0.12%)</title><rect x="63.3009%" y="1221" width="0.1155%" height="15" fill="rgb(216,45,12)" fg:x="30142" fg:w="55"/><text x="63.5509%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="63.4311%" y="1205" width="0.0105%" height="15" fill="rgb(246,21,19)" fg:x="30204" fg:w="5"/><text x="63.6811%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (85 samples, 0.18%)</title><rect x="63.2757%" y="1253" width="0.1785%" height="15" fill="rgb(213,98,42)" fg:x="30130" fg:w="85"/><text x="63.5257%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (84 samples, 0.18%)</title><rect x="63.2778%" y="1237" width="0.1764%" height="15" fill="rgb(250,136,47)" fg:x="30131" fg:w="84"/><text x="63.5278%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (15 samples, 0.03%)</title><rect x="63.4227%" y="1221" width="0.0315%" height="15" fill="rgb(251,124,27)" fg:x="30200" fg:w="15"/><text x="63.6727%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (96 samples, 0.20%)</title><rect x="63.2568%" y="1285" width="0.2016%" height="15" fill="rgb(229,180,14)" fg:x="30121" fg:w="96"/><text x="63.5068%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (89 samples, 0.19%)</title><rect x="63.2715%" y="1269" width="0.1869%" height="15" fill="rgb(245,216,25)" fg:x="30128" fg:w="89"/><text x="63.5215%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="63.4647%" y="1269" width="0.0126%" height="15" fill="rgb(251,43,5)" fg:x="30220" fg:w="6"/><text x="63.7147%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::data_type::DataType&gt; (11 samples, 0.02%)</title><rect x="63.4584%" y="1285" width="0.0231%" height="15" fill="rgb(250,128,24)" fg:x="30217" fg:w="11"/><text x="63.7084%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="63.5508%" y="1253" width="0.0105%" height="15" fill="rgb(217,117,27)" fg:x="30261" fg:w="5"/><text x="63.8008%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="63.6453%" y="1237" width="0.0105%" height="15" fill="rgb(245,147,4)" fg:x="30306" fg:w="5"/><text x="63.8953%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (17 samples, 0.04%)</title><rect x="63.6894%" y="1221" width="0.0357%" height="15" fill="rgb(242,201,35)" fg:x="30327" fg:w="17"/><text x="63.9394%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (7 samples, 0.01%)</title><rect x="63.7398%" y="1205" width="0.0147%" height="15" fill="rgb(218,181,1)" fg:x="30351" fg:w="7"/><text x="63.9898%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (15 samples, 0.03%)</title><rect x="63.7251%" y="1221" width="0.0315%" height="15" fill="rgb(222,6,29)" fg:x="30344" fg:w="15"/><text x="63.9751%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="63.7734%" y="1189" width="0.0105%" height="15" fill="rgb(208,186,3)" fg:x="30367" fg:w="5"/><text x="64.0234%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_pointer_size (7 samples, 0.01%)</title><rect x="63.8448%" y="1109" width="0.0147%" height="15" fill="rgb(216,36,26)" fg:x="30401" fg:w="7"/><text x="64.0948%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="63.8658%" y="1093" width="0.0189%" height="15" fill="rgb(248,201,23)" fg:x="30411" fg:w="9"/><text x="64.1158%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (5 samples, 0.01%)</title><rect x="63.8847%" y="1093" width="0.0105%" height="15" fill="rgb(251,170,31)" fg:x="30420" fg:w="5"/><text x="64.1347%" y="1103.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (21 samples, 0.04%)</title><rect x="63.8595%" y="1109" width="0.0441%" height="15" fill="rgb(207,110,25)" fg:x="30408" fg:w="21"/><text x="64.1095%" y="1119.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (46 samples, 0.10%)</title><rect x="63.8196%" y="1141" width="0.0966%" height="15" fill="rgb(250,54,15)" fg:x="30389" fg:w="46"/><text x="64.0696%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (39 samples, 0.08%)</title><rect x="63.8343%" y="1125" width="0.0819%" height="15" fill="rgb(227,68,33)" fg:x="30396" fg:w="39"/><text x="64.0843%" y="1135.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="63.9036%" y="1109" width="0.0126%" height="15" fill="rgb(238,34,41)" fg:x="30429" fg:w="6"/><text x="64.1536%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (63 samples, 0.13%)</title><rect x="63.8007%" y="1173" width="0.1323%" height="15" fill="rgb(220,11,15)" fg:x="30380" fg:w="63"/><text x="64.0507%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (57 samples, 0.12%)</title><rect x="63.8133%" y="1157" width="0.1197%" height="15" fill="rgb(246,111,35)" fg:x="30386" fg:w="57"/><text x="64.0633%" y="1167.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (8 samples, 0.02%)</title><rect x="63.9162%" y="1141" width="0.0168%" height="15" fill="rgb(209,88,53)" fg:x="30435" fg:w="8"/><text x="64.1662%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (73 samples, 0.15%)</title><rect x="63.7839%" y="1189" width="0.1533%" height="15" fill="rgb(231,185,47)" fg:x="30372" fg:w="73"/><text x="64.0339%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (6 samples, 0.01%)</title><rect x="63.9414%" y="1189" width="0.0126%" height="15" fill="rgb(233,154,1)" fg:x="30447" fg:w="6"/><text x="64.1914%" y="1199.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="63.9646%" y="1173" width="0.0105%" height="15" fill="rgb(225,15,46)" fg:x="30458" fg:w="5"/><text x="64.2146%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="63.9751%" y="1173" width="0.0105%" height="15" fill="rgb(211,135,41)" fg:x="30463" fg:w="5"/><text x="64.2251%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral::write_prefix (8 samples, 0.02%)</title><rect x="63.9919%" y="1173" width="0.0168%" height="15" fill="rgb(208,54,0)" fg:x="30471" fg:w="8"/><text x="64.2419%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (121 samples, 0.25%)</title><rect x="63.7566%" y="1221" width="0.2541%" height="15" fill="rgb(244,136,14)" fg:x="30359" fg:w="121"/><text x="64.0066%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (120 samples, 0.25%)</title><rect x="63.7587%" y="1205" width="0.2520%" height="15" fill="rgb(241,56,14)" fg:x="30360" fg:w="120"/><text x="64.0087%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (27 samples, 0.06%)</title><rect x="63.9541%" y="1189" width="0.0567%" height="15" fill="rgb(205,80,24)" fg:x="30453" fg:w="27"/><text x="64.2041%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (5 samples, 0.01%)</title><rect x="64.0171%" y="1205" width="0.0105%" height="15" fill="rgb(220,57,4)" fg:x="30483" fg:w="5"/><text x="64.2671%" y="1215.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="64.0591%" y="1189" width="0.0147%" height="15" fill="rgb(226,193,50)" fg:x="30503" fg:w="7"/><text x="64.3091%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (33 samples, 0.07%)</title><rect x="64.0108%" y="1221" width="0.0693%" height="15" fill="rgb(231,168,22)" fg:x="30480" fg:w="33"/><text x="64.2608%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (17 samples, 0.04%)</title><rect x="64.0444%" y="1205" width="0.0357%" height="15" fill="rgb(254,215,14)" fg:x="30496" fg:w="17"/><text x="64.2944%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (5 samples, 0.01%)</title><rect x="64.0801%" y="1221" width="0.0105%" height="15" fill="rgb(211,115,16)" fg:x="30513" fg:w="5"/><text x="64.3301%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (260 samples, 0.55%)</title><rect x="63.5655%" y="1253" width="0.5460%" height="15" fill="rgb(236,210,16)" fg:x="30268" fg:w="260"/><text x="63.8155%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (214 samples, 0.45%)</title><rect x="63.6621%" y="1237" width="0.4494%" height="15" fill="rgb(221,94,12)" fg:x="30314" fg:w="214"/><text x="63.9121%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (6 samples, 0.01%)</title><rect x="64.1284%" y="1237" width="0.0126%" height="15" fill="rgb(235,218,49)" fg:x="30536" fg:w="6"/><text x="64.3784%" y="1247.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (6 samples, 0.01%)</title><rect x="64.1557%" y="1221" width="0.0126%" height="15" fill="rgb(217,114,14)" fg:x="30549" fg:w="6"/><text x="64.4057%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="64.1683%" y="1221" width="0.0147%" height="15" fill="rgb(216,145,22)" fg:x="30555" fg:w="7"/><text x="64.4183%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (8 samples, 0.02%)</title><rect x="64.1830%" y="1221" width="0.0168%" height="15" fill="rgb(217,112,39)" fg:x="30562" fg:w="8"/><text x="64.4330%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (6 samples, 0.01%)</title><rect x="64.2082%" y="1205" width="0.0126%" height="15" fill="rgb(225,85,32)" fg:x="30574" fg:w="6"/><text x="64.4582%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (5 samples, 0.01%)</title><rect x="64.2208%" y="1205" width="0.0105%" height="15" fill="rgb(245,209,47)" fg:x="30580" fg:w="5"/><text x="64.4708%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (17 samples, 0.04%)</title><rect x="64.1998%" y="1221" width="0.0357%" height="15" fill="rgb(218,220,15)" fg:x="30570" fg:w="17"/><text x="64.4498%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_object_name (63 samples, 0.13%)</title><rect x="64.1116%" y="1253" width="0.1323%" height="15" fill="rgb(222,202,31)" fg:x="30528" fg:w="63"/><text x="64.3616%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_identifier (49 samples, 0.10%)</title><rect x="64.1410%" y="1237" width="0.1029%" height="15" fill="rgb(243,203,4)" fg:x="30542" fg:w="49"/><text x="64.3910%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (352 samples, 0.74%)</title><rect x="63.5067%" y="1269" width="0.7392%" height="15" fill="rgb(237,92,17)" fg:x="30240" fg:w="352"/><text x="63.7567%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (365 samples, 0.77%)</title><rect x="63.4815%" y="1285" width="0.7665%" height="15" fill="rgb(231,119,7)" fg:x="30228" fg:w="365"/><text x="63.7315%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_expr_prefix_by_unreserved_word (11 samples, 0.02%)</title><rect x="64.2565%" y="1285" width="0.0231%" height="15" fill="rgb(237,82,41)" fg:x="30597" fg:w="11"/><text x="64.5065%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="64.2922%" y="1269" width="0.0210%" height="15" fill="rgb(226,81,48)" fg:x="30614" fg:w="10"/><text x="64.5422%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (7 samples, 0.01%)</title><rect x="64.3132%" y="1269" width="0.0147%" height="15" fill="rgb(234,70,51)" fg:x="30624" fg:w="7"/><text x="64.5632%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (6 samples, 0.01%)</title><rect x="64.3342%" y="1253" width="0.0126%" height="15" fill="rgb(251,86,4)" fg:x="30634" fg:w="6"/><text x="64.5842%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (5 samples, 0.01%)</title><rect x="64.3363%" y="1237" width="0.0105%" height="15" fill="rgb(244,144,28)" fg:x="30635" fg:w="5"/><text x="64.5863%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (33 samples, 0.07%)</title><rect x="64.2796%" y="1285" width="0.0693%" height="15" fill="rgb(232,161,39)" fg:x="30608" fg:w="33"/><text x="64.5296%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="64.3300%" y="1269" width="0.0189%" height="15" fill="rgb(247,34,51)" fg:x="30632" fg:w="9"/><text x="64.5800%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (622 samples, 1.31%)</title><rect x="63.0552%" y="1301" width="1.3063%" height="15" fill="rgb(225,132,2)" fg:x="30025" fg:w="622"/><text x="63.3052%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_infix (1,318 samples, 2.77%)</title><rect x="61.6082%" y="1333" width="2.7679%" height="15" fill="rgb(209,159,44)" fg:x="29336" fg:w="1318"/><text x="61.8582%" y="1343.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,147 samples, 2.41%)</title><rect x="61.9674%" y="1317" width="2.4088%" height="15" fill="rgb(251,214,1)" fg:x="29507" fg:w="1147"/><text x="62.2174%" y="1327.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_keyword (5 samples, 0.01%)</title><rect x="64.3762%" y="1333" width="0.0105%" height="15" fill="rgb(247,84,47)" fg:x="30654" fg:w="5"/><text x="64.6262%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="64.4413%" y="1317" width="0.0105%" height="15" fill="rgb(240,111,43)" fg:x="30685" fg:w="5"/><text x="64.6913%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (10 samples, 0.02%)</title><rect x="64.4518%" y="1317" width="0.0210%" height="15" fill="rgb(215,214,35)" fg:x="30690" fg:w="10"/><text x="64.7018%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="64.4959%" y="1301" width="0.0147%" height="15" fill="rgb(248,207,23)" fg:x="30711" fg:w="7"/><text x="64.7459%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (9 samples, 0.02%)</title><rect x="64.5337%" y="1285" width="0.0189%" height="15" fill="rgb(214,186,4)" fg:x="30729" fg:w="9"/><text x="64.7837%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="64.5526%" y="1285" width="0.0105%" height="15" fill="rgb(220,133,22)" fg:x="30738" fg:w="5"/><text x="64.8026%" y="1295.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (23 samples, 0.05%)</title><rect x="64.6324%" y="1253" width="0.0483%" height="15" fill="rgb(239,134,19)" fg:x="30776" fg:w="23"/><text x="64.8824%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="64.6912%" y="1221" width="0.0105%" height="15" fill="rgb(250,140,9)" fg:x="30804" fg:w="5"/><text x="64.9412%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (13 samples, 0.03%)</title><rect x="64.6891%" y="1237" width="0.0273%" height="15" fill="rgb(225,59,14)" fg:x="30803" fg:w="13"/><text x="64.9391%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (20 samples, 0.04%)</title><rect x="64.6807%" y="1253" width="0.0420%" height="15" fill="rgb(214,152,51)" fg:x="30799" fg:w="20"/><text x="64.9307%" y="1263.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="64.7563%" y="1221" width="0.0168%" height="15" fill="rgb(251,227,43)" fg:x="30835" fg:w="8"/><text x="65.0063%" y="1231.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="64.8214%" y="1125" width="0.0105%" height="15" fill="rgb(241,96,17)" fg:x="30866" fg:w="5"/><text x="65.0714%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc (7 samples, 0.01%)</title><rect x="64.8319%" y="1125" width="0.0147%" height="15" fill="rgb(234,198,43)" fg:x="30871" fg:w="7"/><text x="65.0819%" y="1135.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (21 samples, 0.04%)</title><rect x="64.8109%" y="1141" width="0.0441%" height="15" fill="rgb(220,108,29)" fg:x="30861" fg:w="21"/><text x="65.0609%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (34 samples, 0.07%)</title><rect x="64.8004%" y="1157" width="0.0714%" height="15" fill="rgb(226,163,33)" fg:x="30856" fg:w="34"/><text x="65.0504%" y="1167.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (8 samples, 0.02%)</title><rect x="64.8550%" y="1141" width="0.0168%" height="15" fill="rgb(205,194,45)" fg:x="30882" fg:w="8"/><text x="65.1050%" y="1151.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (39 samples, 0.08%)</title><rect x="64.7941%" y="1173" width="0.0819%" height="15" fill="rgb(206,143,44)" fg:x="30853" fg:w="39"/><text x="65.0441%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (58 samples, 0.12%)</title><rect x="64.7731%" y="1221" width="0.1218%" height="15" fill="rgb(236,136,36)" fg:x="30843" fg:w="58"/><text x="65.0231%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (52 samples, 0.11%)</title><rect x="64.7857%" y="1205" width="0.1092%" height="15" fill="rgb(249,172,42)" fg:x="30849" fg:w="52"/><text x="65.0357%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (48 samples, 0.10%)</title><rect x="64.7941%" y="1189" width="0.1008%" height="15" fill="rgb(216,139,23)" fg:x="30853" fg:w="48"/><text x="65.0441%" y="1199.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_size (9 samples, 0.02%)</title><rect x="64.8760%" y="1173" width="0.0189%" height="15" fill="rgb(207,166,20)" fg:x="30892" fg:w="9"/><text x="65.1260%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral (14 samples, 0.03%)</title><rect x="64.9096%" y="1221" width="0.0294%" height="15" fill="rgb(210,209,22)" fg:x="30908" fg:w="14"/><text x="65.1596%" y="1231.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (7 samples, 0.01%)</title><rect x="64.9411%" y="1205" width="0.0147%" height="15" fill="rgb(232,118,20)" fg:x="30923" fg:w="7"/><text x="65.1911%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad_integral::write_prefix (8 samples, 0.02%)</title><rect x="64.9684%" y="1205" width="0.0168%" height="15" fill="rgb(238,113,42)" fg:x="30936" fg:w="8"/><text x="65.2184%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Location as core::fmt::Display&gt;::fmt (126 samples, 0.26%)</title><rect x="64.7227%" y="1253" width="0.2646%" height="15" fill="rgb(231,42,5)" fg:x="30819" fg:w="126"/><text x="64.9727%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (123 samples, 0.26%)</title><rect x="64.7290%" y="1237" width="0.2583%" height="15" fill="rgb(243,166,24)" fg:x="30822" fg:w="123"/><text x="64.9790%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::num::imp::_&lt;impl core::fmt::Display for u64&gt;::fmt (23 samples, 0.05%)</title><rect x="64.9390%" y="1221" width="0.0483%" height="15" fill="rgb(237,226,12)" fg:x="30922" fg:w="23"/><text x="65.1890%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (5 samples, 0.01%)</title><rect x="64.9999%" y="1237" width="0.0105%" height="15" fill="rgb(229,133,24)" fg:x="30951" fg:w="5"/><text x="65.2499%" y="1247.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="65.0314%" y="1221" width="0.0105%" height="15" fill="rgb(238,33,43)" fg:x="30966" fg:w="5"/><text x="65.2814%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::fmt::Display&gt;::fmt (31 samples, 0.07%)</title><rect x="64.9873%" y="1253" width="0.0651%" height="15" fill="rgb(227,59,38)" fg:x="30945" fg:w="31"/><text x="65.2373%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (17 samples, 0.04%)</title><rect x="65.0167%" y="1237" width="0.0357%" height="15" fill="rgb(230,97,0)" fg:x="30959" fg:w="17"/><text x="65.2667%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (5 samples, 0.01%)</title><rect x="65.0587%" y="1253" width="0.0105%" height="15" fill="rgb(250,173,50)" fg:x="30979" fg:w="5"/><text x="65.3087%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::fmt::format::format_inner (245 samples, 0.51%)</title><rect x="64.5652%" y="1285" width="0.5145%" height="15" fill="rgb(240,15,50)" fg:x="30744" fg:w="245"/><text x="64.8152%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (224 samples, 0.47%)</title><rect x="64.6093%" y="1269" width="0.4704%" height="15" fill="rgb(221,93,22)" fg:x="30765" fg:w="224"/><text x="64.8593%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type (281 samples, 0.59%)</title><rect x="64.4959%" y="1317" width="0.5901%" height="15" fill="rgb(245,180,53)" fg:x="30711" fg:w="281"/><text x="64.7459%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_data_type_helper (270 samples, 0.57%)</title><rect x="64.5190%" y="1301" width="0.5670%" height="15" fill="rgb(231,88,51)" fg:x="30722" fg:w="270"/><text x="64.7690%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="65.0965%" y="1301" width="0.0105%" height="15" fill="rgb(240,58,21)" fg:x="30997" fg:w="5"/><text x="65.3465%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (5 samples, 0.01%)</title><rect x="65.1175%" y="1285" width="0.0105%" height="15" fill="rgb(237,21,10)" fg:x="31007" fg:w="5"/><text x="65.3675%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_value (30 samples, 0.06%)</title><rect x="65.0881%" y="1317" width="0.0630%" height="15" fill="rgb(218,43,11)" fg:x="30993" fg:w="30"/><text x="65.3381%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::tokenizer::Token as core::clone::Clone&gt;::clone (16 samples, 0.03%)</title><rect x="65.1175%" y="1301" width="0.0336%" height="15" fill="rgb(218,221,29)" fg:x="31007" fg:w="16"/><text x="65.3675%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::clone::Clone&gt;::clone (9 samples, 0.02%)</title><rect x="65.1322%" y="1285" width="0.0189%" height="15" fill="rgb(214,118,42)" fg:x="31014" fg:w="9"/><text x="65.3822%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (6 samples, 0.01%)</title><rect x="65.1385%" y="1269" width="0.0126%" height="15" fill="rgb(251,200,26)" fg:x="31017" fg:w="6"/><text x="65.3885%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_prefix (365 samples, 0.77%)</title><rect x="64.3867%" y="1333" width="0.7665%" height="15" fill="rgb(237,101,39)" fg:x="30659" fg:w="365"/><text x="64.6367%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_subexpr (1,893 samples, 3.98%)</title><rect x="61.1945%" y="1349" width="3.9755%" height="15" fill="rgb(251,117,11)" fg:x="29139" fg:w="1893"/><text x="61.4445%" y="1359.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query_body (5,198 samples, 10.92%)</title><rect x="54.2600%" y="1381" width="10.9163%" height="15" fill="rgb(216,223,23)" fg:x="25837" fg:w="5198"/><text x="54.5100%" y="1391.50">sqlparser_bench-..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_select (4,878 samples, 10.24%)</title><rect x="54.9321%" y="1365" width="10.2442%" height="15" fill="rgb(251,54,12)" fg:x="26157" fg:w="4878"/><text x="55.1821%" y="1375.50">sqlparser_bench..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_query (7,112 samples, 14.94%)</title><rect x="50.2468%" y="1397" width="14.9358%" height="15" fill="rgb(254,176,54)" fg:x="23926" fg:w="7112"/><text x="50.4968%" y="1407.50">sqlparser_bench-959bc52..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_statements (7,412 samples, 15.57%)</title><rect x="49.6272%" y="1429" width="15.5659%" height="15" fill="rgb(210,32,8)" fg:x="23631" fg:w="7412"/><text x="49.8772%" y="1439.50">sqlparser_bench-959bc526..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_statement (7,260 samples, 15.25%)</title><rect x="49.9464%" y="1413" width="15.2467%" height="15" fill="rgb(235,52,38)" fg:x="23783" fg:w="7260"/><text x="50.1964%" y="1423.50">sqlparser_bench-959bc52..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::next_token (136 samples, 0.29%)</title><rect x="65.2561%" y="1397" width="0.2856%" height="15" fill="rgb(231,4,44)" fg:x="31073" fg:w="136"/><text x="65.5061%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_identifier_or_keyword (26 samples, 0.05%)</title><rect x="65.5417%" y="1397" width="0.0546%" height="15" fill="rgb(249,2,32)" fg:x="31209" fg:w="26"/><text x="65.7917%" y="1407.50"></text></g><g><title>libsystem_malloc.dylib`_free (121 samples, 0.25%)</title><rect x="66.3608%" y="1381" width="0.2541%" height="15" fill="rgb(224,65,26)" fg:x="31599" fg:w="121"/><text x="66.6108%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (33 samples, 0.07%)</title><rect x="66.6149%" y="1381" width="0.0693%" height="15" fill="rgb(250,73,40)" fg:x="31720" fg:w="33"/><text x="66.8649%" y="1391.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (5 samples, 0.01%)</title><rect x="66.6842%" y="1381" width="0.0105%" height="15" fill="rgb(253,177,16)" fg:x="31753" fg:w="5"/><text x="66.9342%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::iter::traits::collect::FromIterator&lt;char&gt;&gt;::from_iter (18 samples, 0.04%)</title><rect x="66.6989%" y="1381" width="0.0378%" height="15" fill="rgb(217,32,34)" fg:x="31760" fg:w="18"/><text x="66.9489%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::generic::GenericDialect as sqlparser::dialect::Dialect&gt;::is_delimited_identifier_start (10 samples, 0.02%)</title><rect x="66.7367%" y="1381" width="0.0210%" height="15" fill="rgb(212,7,10)" fg:x="31778" fg:w="10"/><text x="66.9867%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_start (7 samples, 0.01%)</title><rect x="66.7577%" y="1381" width="0.0147%" height="15" fill="rgb(245,89,8)" fg:x="31788" fg:w="7"/><text x="67.0077%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (15 samples, 0.03%)</title><rect x="66.7724%" y="1381" width="0.0315%" height="15" fill="rgb(237,16,53)" fg:x="31795" fg:w="15"/><text x="67.0224%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (6 samples, 0.01%)</title><rect x="66.8039%" y="1381" width="0.0126%" height="15" fill="rgb(250,204,30)" fg:x="31810" fg:w="6"/><text x="67.0539%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_dealloc (5 samples, 0.01%)</title><rect x="66.8165%" y="1381" width="0.0105%" height="15" fill="rgb(208,77,27)" fg:x="31816" fg:w="5"/><text x="67.0665%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (11 samples, 0.02%)</title><rect x="66.8816%" y="1365" width="0.0231%" height="15" fill="rgb(250,204,28)" fg:x="31847" fg:w="11"/><text x="67.1316%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (5 samples, 0.01%)</title><rect x="67.0643%" y="1301" width="0.0105%" height="15" fill="rgb(244,63,21)" fg:x="31934" fg:w="5"/><text x="67.3143%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`free_medium (5 samples, 0.01%)</title><rect x="67.0748%" y="1301" width="0.0105%" height="15" fill="rgb(236,85,44)" fg:x="31939" fg:w="5"/><text x="67.3248%" y="1311.50"></text></g><g><title>libsystem_kernel.dylib`madvise (5 samples, 0.01%)</title><rect x="67.0748%" y="1285" width="0.0105%" height="15" fill="rgb(215,98,4)" fg:x="31939" fg:w="5"/><text x="67.3248%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (5 samples, 0.01%)</title><rect x="67.1336%" y="1269" width="0.0105%" height="15" fill="rgb(235,38,11)" fg:x="31967" fg:w="5"/><text x="67.3836%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (33 samples, 0.07%)</title><rect x="67.0916%" y="1301" width="0.0693%" height="15" fill="rgb(254,186,25)" fg:x="31947" fg:w="33"/><text x="67.3416%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (27 samples, 0.06%)</title><rect x="67.1042%" y="1285" width="0.0567%" height="15" fill="rgb(225,55,31)" fg:x="31953" fg:w="27"/><text x="67.3542%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (8 samples, 0.02%)</title><rect x="67.1441%" y="1269" width="0.0168%" height="15" fill="rgb(211,15,21)" fg:x="31972" fg:w="8"/><text x="67.3941%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`small_try_realloc_in_place (12 samples, 0.03%)</title><rect x="67.1777%" y="1301" width="0.0252%" height="15" fill="rgb(215,187,41)" fg:x="31988" fg:w="12"/><text x="67.4277%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_add_ptr (5 samples, 0.01%)</title><rect x="67.2533%" y="1253" width="0.0105%" height="15" fill="rgb(248,69,32)" fg:x="32024" fg:w="5"/><text x="67.5033%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (38 samples, 0.08%)</title><rect x="67.2029%" y="1301" width="0.0798%" height="15" fill="rgb(252,102,52)" fg:x="32000" fg:w="38"/><text x="67.4529%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_should_clear (27 samples, 0.06%)</title><rect x="67.2260%" y="1285" width="0.0567%" height="15" fill="rgb(253,140,32)" fg:x="32011" fg:w="27"/><text x="67.4760%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`small_malloc_from_free_list (23 samples, 0.05%)</title><rect x="67.2344%" y="1269" width="0.0483%" height="15" fill="rgb(216,56,42)" fg:x="32015" fg:w="23"/><text x="67.4844%" y="1279.50"></text></g><g><title>libsystem_malloc.dylib`small_free_list_remove_ptr_no_clear (8 samples, 0.02%)</title><rect x="67.2659%" y="1253" width="0.0168%" height="15" fill="rgb(216,184,14)" fg:x="32030" fg:w="8"/><text x="67.5159%" y="1263.50"></text></g><g><title>libsystem_malloc.dylib`szone_size (9 samples, 0.02%)</title><rect x="67.2827%" y="1301" width="0.0189%" height="15" fill="rgb(237,187,27)" fg:x="32038" fg:w="9"/><text x="67.5327%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`tiny_size (8 samples, 0.02%)</title><rect x="67.2848%" y="1285" width="0.0168%" height="15" fill="rgb(219,65,3)" fg:x="32039" fg:w="8"/><text x="67.5348%" y="1295.50"></text></g><g><title>libsystem_malloc.dylib`tiny_try_realloc_in_place (24 samples, 0.05%)</title><rect x="67.3058%" y="1301" width="0.0504%" height="15" fill="rgb(245,83,25)" fg:x="32049" fg:w="24"/><text x="67.5558%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`szone_realloc (166 samples, 0.35%)</title><rect x="67.0286%" y="1317" width="0.3486%" height="15" fill="rgb(214,205,45)" fg:x="31917" fg:w="166"/><text x="67.2786%" y="1327.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (10 samples, 0.02%)</title><rect x="67.3562%" y="1301" width="0.0210%" height="15" fill="rgb(241,20,18)" fg:x="32073" fg:w="10"/><text x="67.6062%" y="1311.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (223 samples, 0.47%)</title><rect x="66.9908%" y="1333" width="0.4683%" height="15" fill="rgb(232,163,23)" fg:x="31899" fg:w="223"/><text x="67.2408%" y="1343.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (36 samples, 0.08%)</title><rect x="67.3835%" y="1317" width="0.0756%" height="15" fill="rgb(214,5,46)" fg:x="32086" fg:w="36"/><text x="67.6335%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_realloc (6 samples, 0.01%)</title><rect x="67.4633%" y="1333" width="0.0126%" height="15" fill="rgb(229,78,17)" fg:x="32124" fg:w="6"/><text x="67.7133%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`szone_realloc (10 samples, 0.02%)</title><rect x="67.4780%" y="1333" width="0.0210%" height="15" fill="rgb(248,89,10)" fg:x="32131" fg:w="10"/><text x="67.7280%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (297 samples, 0.62%)</title><rect x="66.9467%" y="1349" width="0.6237%" height="15" fill="rgb(248,54,15)" fg:x="31878" fg:w="297"/><text x="67.1967%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`szone_size (34 samples, 0.07%)</title><rect x="67.4990%" y="1333" width="0.0714%" height="15" fill="rgb(223,116,6)" fg:x="32141" fg:w="34"/><text x="67.7490%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`tiny_size (33 samples, 0.07%)</title><rect x="67.5011%" y="1317" width="0.0693%" height="15" fill="rgb(205,125,38)" fg:x="32142" fg:w="33"/><text x="67.7511%" y="1327.50"></text></g><g><title>libsystem_malloc.dylib`szone_malloc_should_clear (39 samples, 0.08%)</title><rect x="67.5788%" y="1349" width="0.0819%" height="15" fill="rgb(251,78,38)" fg:x="32179" fg:w="39"/><text x="67.8288%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_should_clear (31 samples, 0.07%)</title><rect x="67.5956%" y="1333" width="0.0651%" height="15" fill="rgb(253,78,28)" fg:x="32187" fg:w="31"/><text x="67.8456%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`tiny_malloc_from_free_list (21 samples, 0.04%)</title><rect x="67.6166%" y="1317" width="0.0441%" height="15" fill="rgb(209,120,3)" fg:x="32197" fg:w="21"/><text x="67.8666%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (401 samples, 0.84%)</title><rect x="66.8270%" y="1381" width="0.8421%" height="15" fill="rgb(238,229,9)" fg:x="31821" fg:w="401"/><text x="67.0770%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (358 samples, 0.75%)</title><rect x="66.9173%" y="1365" width="0.7518%" height="15" fill="rgb(253,159,18)" fg:x="31864" fg:w="358"/><text x="67.1673%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::State::next (14 samples, 0.03%)</title><rect x="67.6859%" y="1381" width="0.0294%" height="15" fill="rgb(244,42,34)" fg:x="32230" fg:w="14"/><text x="67.9359%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::State::peek (27 samples, 0.06%)</title><rect x="67.7153%" y="1381" width="0.0567%" height="15" fill="rgb(224,8,7)" fg:x="32244" fg:w="27"/><text x="67.9653%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::consume_and_return (18 samples, 0.04%)</title><rect x="67.7741%" y="1381" width="0.0378%" height="15" fill="rgb(210,201,45)" fg:x="32272" fg:w="18"/><text x="68.0241%" y="1391.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (7 samples, 0.01%)</title><rect x="68.6646%" y="1365" width="0.0147%" height="15" fill="rgb(252,185,21)" fg:x="32696" fg:w="7"/><text x="68.9146%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (21 samples, 0.04%)</title><rect x="68.6793%" y="1365" width="0.0441%" height="15" fill="rgb(223,131,1)" fg:x="32703" fg:w="21"/><text x="68.9293%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memcmp (42 samples, 0.09%)</title><rect x="68.7234%" y="1365" width="0.0882%" height="15" fill="rgb(245,141,16)" fg:x="32724" fg:w="42"/><text x="68.9734%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (14 samples, 0.03%)</title><rect x="68.8116%" y="1365" width="0.0294%" height="15" fill="rgb(229,55,45)" fg:x="32766" fg:w="14"/><text x="69.0616%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_part (11 samples, 0.02%)</title><rect x="68.8410%" y="1365" width="0.0231%" height="15" fill="rgb(208,92,15)" fg:x="32780" fg:w="11"/><text x="69.0910%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcmp (15 samples, 0.03%)</title><rect x="68.8683%" y="1365" width="0.0315%" height="15" fill="rgb(234,185,47)" fg:x="32793" fg:w="15"/><text x="69.1183%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (12 samples, 0.03%)</title><rect x="68.9271%" y="1349" width="0.0252%" height="15" fill="rgb(253,104,50)" fg:x="32821" fg:w="12"/><text x="69.1771%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (36 samples, 0.08%)</title><rect x="68.9040%" y="1365" width="0.0756%" height="15" fill="rgb(205,70,7)" fg:x="32810" fg:w="36"/><text x="69.1540%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (10 samples, 0.02%)</title><rect x="68.9586%" y="1349" width="0.0210%" height="15" fill="rgb(240,178,43)" fg:x="32836" fg:w="10"/><text x="69.2086%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (10 samples, 0.02%)</title><rect x="68.9586%" y="1333" width="0.0210%" height="15" fill="rgb(214,112,2)" fg:x="32836" fg:w="10"/><text x="69.2086%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Token::make_word (18 samples, 0.04%)</title><rect x="68.9922%" y="1365" width="0.0378%" height="15" fill="rgb(206,46,17)" fg:x="32852" fg:w="18"/><text x="69.2422%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (6 samples, 0.01%)</title><rect x="69.0174%" y="1349" width="0.0126%" height="15" fill="rgb(225,220,16)" fg:x="32864" fg:w="6"/><text x="69.2674%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="69.0804%" y="1349" width="0.0105%" height="15" fill="rgb(238,65,40)" fg:x="32894" fg:w="5"/><text x="69.3304%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (10 samples, 0.02%)</title><rect x="69.0909%" y="1349" width="0.0210%" height="15" fill="rgb(230,151,21)" fg:x="32899" fg:w="10"/><text x="69.3409%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (8 samples, 0.02%)</title><rect x="69.1119%" y="1349" width="0.0168%" height="15" fill="rgb(218,58,49)" fg:x="32909" fg:w="8"/><text x="69.3619%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::next_token (641 samples, 1.35%)</title><rect x="67.8119%" y="1381" width="1.3462%" height="15" fill="rgb(219,179,14)" fg:x="32290" fg:w="641"/><text x="68.0619%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (61 samples, 0.13%)</title><rect x="69.0300%" y="1365" width="0.1281%" height="15" fill="rgb(223,72,1)" fg:x="32870" fg:w="61"/><text x="69.2800%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (14 samples, 0.03%)</title><rect x="69.1287%" y="1349" width="0.0294%" height="15" fill="rgb(238,126,10)" fg:x="32917" fg:w="14"/><text x="69.3787%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (7 samples, 0.01%)</title><rect x="69.1434%" y="1333" width="0.0147%" height="15" fill="rgb(224,206,38)" fg:x="32924" fg:w="7"/><text x="69.3934%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_free (37 samples, 0.08%)</title><rect x="69.2862%" y="1365" width="0.0777%" height="15" fill="rgb(212,201,54)" fg:x="32992" fg:w="37"/><text x="69.5362%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (32 samples, 0.07%)</title><rect x="69.3639%" y="1365" width="0.0672%" height="15" fill="rgb(218,154,48)" fg:x="33029" fg:w="32"/><text x="69.6139%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (214 samples, 0.45%)</title><rect x="69.4311%" y="1365" width="0.4494%" height="15" fill="rgb(232,93,24)" fg:x="33061" fg:w="214"/><text x="69.6811%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memcmp (527 samples, 1.11%)</title><rect x="69.8805%" y="1365" width="1.1067%" height="15" fill="rgb(245,30,21)" fg:x="33275" fg:w="527"/><text x="70.1305%" y="1375.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (89 samples, 0.19%)</title><rect x="70.9873%" y="1365" width="0.1869%" height="15" fill="rgb(242,148,29)" fg:x="33802" fg:w="89"/><text x="71.2373%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (37 samples, 0.08%)</title><rect x="71.3296%" y="1333" width="0.0777%" height="15" fill="rgb(244,153,54)" fg:x="33965" fg:w="37"/><text x="71.5796%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (8 samples, 0.02%)</title><rect x="71.4094%" y="1333" width="0.0168%" height="15" fill="rgb(252,87,22)" fg:x="34003" fg:w="8"/><text x="71.6594%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (136 samples, 0.29%)</title><rect x="71.2729%" y="1349" width="0.2856%" height="15" fill="rgb(210,51,29)" fg:x="33938" fg:w="136"/><text x="71.5229%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (63 samples, 0.13%)</title><rect x="71.4262%" y="1333" width="0.1323%" height="15" fill="rgb(242,136,47)" fg:x="34011" fg:w="63"/><text x="71.6762%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (48 samples, 0.10%)</title><rect x="71.4577%" y="1317" width="0.1008%" height="15" fill="rgb(238,68,4)" fg:x="34026" fg:w="48"/><text x="71.7077%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::iter::traits::collect::FromIterator&lt;char&gt;&gt;::from_iter (201 samples, 0.42%)</title><rect x="71.1742%" y="1365" width="0.4221%" height="15" fill="rgb(242,161,30)" fg:x="33891" fg:w="201"/><text x="71.4242%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (18 samples, 0.04%)</title><rect x="71.5585%" y="1349" width="0.0378%" height="15" fill="rgb(218,58,44)" fg:x="34074" fg:w="18"/><text x="71.8085%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::dialect::mssql::MsSqlDialect as sqlparser::dialect::Dialect&gt;::is_identifier_part (105 samples, 0.22%)</title><rect x="71.5963%" y="1365" width="0.2205%" height="15" fill="rgb(252,125,32)" fg:x="34092" fg:w="105"/><text x="71.8463%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$free (23 samples, 0.05%)</title><rect x="71.8168%" y="1365" width="0.0483%" height="15" fill="rgb(219,178,0)" fg:x="34197" fg:w="23"/><text x="72.0668%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (8 samples, 0.02%)</title><rect x="71.8651%" y="1365" width="0.0168%" height="15" fill="rgb(213,152,7)" fg:x="34220" fg:w="8"/><text x="72.1151%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcmp (176 samples, 0.37%)</title><rect x="71.8819%" y="1365" width="0.3696%" height="15" fill="rgb(249,109,34)" fg:x="34228" fg:w="176"/><text x="72.1319%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (18 samples, 0.04%)</title><rect x="72.2515%" y="1365" width="0.0378%" height="15" fill="rgb(232,96,21)" fg:x="34404" fg:w="18"/><text x="72.5015%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (6 samples, 0.01%)</title><rect x="72.2893%" y="1365" width="0.0126%" height="15" fill="rgb(228,27,39)" fg:x="34422" fg:w="6"/><text x="72.5393%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (10 samples, 0.02%)</title><rect x="72.3040%" y="1365" width="0.0210%" height="15" fill="rgb(211,182,52)" fg:x="34429" fg:w="10"/><text x="72.5540%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (18 samples, 0.04%)</title><rect x="72.3250%" y="1365" width="0.0378%" height="15" fill="rgb(234,178,38)" fg:x="34439" fg:w="18"/><text x="72.5750%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (27 samples, 0.06%)</title><rect x="72.3628%" y="1365" width="0.0567%" height="15" fill="rgb(221,111,3)" fg:x="34457" fg:w="27"/><text x="72.6128%" y="1375.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (37 samples, 0.08%)</title><rect x="72.5812%" y="1349" width="0.0777%" height="15" fill="rgb(228,175,21)" fg:x="34561" fg:w="37"/><text x="72.8312%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (57 samples, 0.12%)</title><rect x="72.6589%" y="1349" width="0.1197%" height="15" fill="rgb(228,174,43)" fg:x="34598" fg:w="57"/><text x="72.9089%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_allocate_outlined (9 samples, 0.02%)</title><rect x="72.7597%" y="1333" width="0.0189%" height="15" fill="rgb(211,191,0)" fg:x="34646" fg:w="9"/><text x="73.0097%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (8 samples, 0.02%)</title><rect x="72.7786%" y="1349" width="0.0168%" height="15" fill="rgb(253,117,3)" fg:x="34655" fg:w="8"/><text x="73.0286%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (9 samples, 0.02%)</title><rect x="72.7954%" y="1349" width="0.0189%" height="15" fill="rgb(241,127,19)" fg:x="34663" fg:w="9"/><text x="73.0454%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Token::make_word (300 samples, 0.63%)</title><rect x="72.4195%" y="1365" width="0.6300%" height="15" fill="rgb(218,103,12)" fg:x="34484" fg:w="300"/><text x="72.6695%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::str::_&lt;impl str&gt;::to_uppercase (111 samples, 0.23%)</title><rect x="72.8164%" y="1349" width="0.2331%" height="15" fill="rgb(236,214,43)" fg:x="34673" fg:w="111"/><text x="73.0664%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (57 samples, 0.12%)</title><rect x="72.9298%" y="1333" width="0.1197%" height="15" fill="rgb(244,144,19)" fg:x="34727" fg:w="57"/><text x="73.1798%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (68 samples, 0.14%)</title><rect x="73.5809%" y="1349" width="0.1428%" height="15" fill="rgb(246,188,10)" fg:x="35037" fg:w="68"/><text x="73.8309%" y="1359.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_malloc (31 samples, 0.07%)</title><rect x="73.7783%" y="1333" width="0.0651%" height="15" fill="rgb(212,193,33)" fg:x="35131" fg:w="31"/><text x="74.0283%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$malloc (5 samples, 0.01%)</title><rect x="73.8434%" y="1333" width="0.0105%" height="15" fill="rgb(241,51,29)" fg:x="35162" fg:w="5"/><text x="74.0934%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`__rdl_alloc (15 samples, 0.03%)</title><rect x="73.8539%" y="1333" width="0.0315%" height="15" fill="rgb(211,58,19)" fg:x="35167" fg:w="15"/><text x="74.1039%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVec&lt;T,A&gt;::grow_one (149 samples, 0.31%)</title><rect x="73.7237%" y="1349" width="0.3129%" height="15" fill="rgb(229,111,26)" fg:x="35105" fg:w="149"/><text x="73.9737%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (72 samples, 0.15%)</title><rect x="73.8854%" y="1333" width="0.1512%" height="15" fill="rgb(213,115,40)" fg:x="35182" fg:w="72"/><text x="74.1354%" y="1343.50"></text></g><g><title>libsystem_malloc.dylib`nanov2_malloc_type (55 samples, 0.12%)</title><rect x="73.9211%" y="1317" width="0.1155%" height="15" fill="rgb(209,56,44)" fg:x="35199" fg:w="55"/><text x="74.1711%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (10 samples, 0.02%)</title><rect x="74.0366%" y="1349" width="0.0210%" height="15" fill="rgb(230,108,32)" fg:x="35254" fg:w="10"/><text x="74.2866%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (7 samples, 0.01%)</title><rect x="74.0429%" y="1333" width="0.0147%" height="15" fill="rgb(216,165,31)" fg:x="35257" fg:w="7"/><text x="74.2929%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_identifier_or_keyword (2,345 samples, 4.92%)</title><rect x="69.1581%" y="1381" width="4.9247%" height="15" fill="rgb(218,122,21)" fg:x="32931" fg:w="2345"/><text x="69.4081%" y="1391.50">sqlpar..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (492 samples, 1.03%)</title><rect x="73.0495%" y="1365" width="1.0332%" height="15" fill="rgb(223,224,47)" fg:x="34784" fg:w="492"/><text x="73.2995%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (12 samples, 0.03%)</title><rect x="74.0576%" y="1349" width="0.0252%" height="15" fill="rgb(238,102,44)" fg:x="35264" fg:w="12"/><text x="74.3076%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_with_location (4,225 samples, 8.87%)</title><rect x="65.2477%" y="1413" width="8.8729%" height="15" fill="rgb(236,46,40)" fg:x="31069" fg:w="4225"/><text x="65.4977%" y="1423.50">sqlparser_ben..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_with_location_into_buf (4,059 samples, 8.52%)</title><rect x="65.5963%" y="1397" width="8.5243%" height="15" fill="rgb(247,202,50)" fg:x="31235" fg:w="4059"/><text x="65.8463%" y="1407.50">sqlparser_be..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_word (18 samples, 0.04%)</title><rect x="74.0828%" y="1381" width="0.0378%" height="15" fill="rgb(209,99,20)" fg:x="35276" fg:w="18"/><text x="74.3328%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::try_with_sql (4,258 samples, 8.94%)</title><rect x="65.1931%" y="1429" width="8.9422%" height="15" fill="rgb(252,27,34)" fg:x="31043" fg:w="4258"/><text x="65.4431%" y="1439.50">sqlparser_ben..</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::tokenizer::Tokenizer::tokenize_with_location_into_buf (7 samples, 0.01%)</title><rect x="74.1206%" y="1413" width="0.0147%" height="15" fill="rgb(215,206,23)" fg:x="35294" fg:w="7"/><text x="74.3706%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_sql (12,017 samples, 25.24%)</title><rect x="48.9069%" y="1445" width="25.2368%" height="15" fill="rgb(212,135,36)" fg:x="23288" fg:w="12017"/><text x="49.1569%" y="1455.50">sqlparser_bench-959bc5267970ca34`sqlpars..</text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::bencher::Bencher&lt;M&gt;::iter (16,292 samples, 34.21%)</title><rect x="39.9374%" y="1461" width="34.2147%" height="15" fill="rgb(240,189,1)" fg:x="19017" fg:w="16292"/><text x="40.1874%" y="1471.50">sqlparser_bench-959bc5267970ca34`criterion::bencher::Be..</text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::benchmark_group::BenchmarkGroup&lt;M&gt;::bench_function (35,307 samples, 74.15%)</title><rect x="0.0063%" y="1525" width="74.1479%" height="15" fill="rgb(242,56,20)" fg:x="3" fg:w="35307"/><text x="0.2563%" y="1535.50">sqlparser_bench-959bc5267970ca34`criterion::benchmark_group::BenchmarkGroup&lt;M&gt;::bench_function</text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::common (35,307 samples, 74.15%)</title><rect x="0.0063%" y="1509" width="74.1479%" height="15" fill="rgb(247,132,33)" fg:x="3" fg:w="35307"/><text x="0.2563%" y="1519.50">sqlparser_bench-959bc5267970ca34`criterion::analysis::common</text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::routine::Routine::sample (35,254 samples, 74.04%)</title><rect x="0.1176%" y="1493" width="74.0366%" height="15" fill="rgb(208,149,11)" fg:x="56" fg:w="35254"/><text x="0.3676%" y="1503.50">sqlparser_bench-959bc5267970ca34`criterion::routine::Routine::sample</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;criterion::routine::Function&lt;M,F,T&gt; as criterion::routine::Routine&lt;M,T&gt;&gt;::warm_up (16,308 samples, 34.25%)</title><rect x="39.9059%" y="1477" width="34.2483%" height="15" fill="rgb(211,33,11)" fg:x="19002" fg:w="16308"/><text x="40.1559%" y="1487.50">sqlparser_bench-959bc5267970ca34`&lt;criterion::routine::Fu..</text></g><g><title>dyld`start (35,315 samples, 74.16%)</title><rect x="0.0000%" y="1621" width="74.1647%" height="15" fill="rgb(221,29,38)" fg:x="0" fg:w="35315"/><text x="0.2500%" y="1631.50">dyld`start</text></g><g><title>sqlparser_bench-959bc5267970ca34`main (35,314 samples, 74.16%)</title><rect x="0.0021%" y="1605" width="74.1626%" height="15" fill="rgb(206,182,49)" fg:x="1" fg:w="35314"/><text x="0.2521%" y="1615.50">sqlparser_bench-959bc5267970ca34`main</text></g><g><title>sqlparser_bench-959bc5267970ca34`std::rt::lang_start_internal (35,314 samples, 74.16%)</title><rect x="0.0021%" y="1589" width="74.1626%" height="15" fill="rgb(216,140,1)" fg:x="1" fg:w="35314"/><text x="0.2521%" y="1599.50">sqlparser_bench-959bc5267970ca34`std::rt::lang_start_internal</text></g><g><title>sqlparser_bench-959bc5267970ca34`std::rt::lang_start::_{{closure}} (35,314 samples, 74.16%)</title><rect x="0.0021%" y="1573" width="74.1626%" height="15" fill="rgb(232,57,40)" fg:x="1" fg:w="35314"/><text x="0.2521%" y="1583.50">sqlparser_bench-959bc5267970ca34`std::rt::lang_start::_{{closure}}</text></g><g><title>sqlparser_bench-959bc5267970ca34`std::sys::backtrace::__rust_begin_short_backtrace (35,314 samples, 74.16%)</title><rect x="0.0021%" y="1557" width="74.1626%" height="15" fill="rgb(224,186,18)" fg:x="1" fg:w="35314"/><text x="0.2521%" y="1567.50">sqlparser_bench-959bc5267970ca34`std::sys::backtrace::__rust_begin_short_backtrace</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser_bench::main (35,314 samples, 74.16%)</title><rect x="0.0021%" y="1541" width="74.1626%" height="15" fill="rgb(215,121,11)" fg:x="1" fg:w="35314"/><text x="0.2521%" y="1551.50">sqlparser_bench-959bc5267970ca34`sqlparser_bench::main</text></g><g><title>sqlparser_bench-959bc5267970ca34`sqlparser::parser::Parser::parse_sql (5 samples, 0.01%)</title><rect x="74.1542%" y="1525" width="0.0105%" height="15" fill="rgb(245,147,10)" fg:x="35310" fg:w="5"/><text x="74.4042%" y="1535.50"></text></g><g><title>libsystem_kernel.dylib`swtch_pri (133 samples, 0.28%)</title><rect x="74.1710%" y="1509" width="0.2793%" height="15" fill="rgb(238,153,13)" fg:x="35318" fg:w="133"/><text x="74.4210%" y="1519.50"></text></g><g><title>libsystem_m.dylib`exp (23 samples, 0.05%)</title><rect x="74.4734%" y="1477" width="0.0483%" height="15" fill="rgb(233,108,0)" fg:x="35462" fg:w="23"/><text x="74.7234%" y="1487.50"></text></g><g><title>libsystem_m.dylib`exp (43 samples, 0.09%)</title><rect x="74.5574%" y="1445" width="0.0903%" height="15" fill="rgb(212,157,17)" fg:x="35502" fg:w="43"/><text x="74.8074%" y="1455.50"></text></g><g><title>libsystem_m.dylib`exp (47 samples, 0.10%)</title><rect x="74.6813%" y="1413" width="0.0987%" height="15" fill="rgb(225,213,38)" fg:x="35561" fg:w="47"/><text x="74.9313%" y="1423.50"></text></g><g><title>libsystem_m.dylib`exp (46 samples, 0.10%)</title><rect x="74.8136%" y="1381" width="0.0966%" height="15" fill="rgb(248,16,11)" fg:x="35624" fg:w="46"/><text x="75.0636%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (6 samples, 0.01%)</title><rect x="74.9102%" y="1381" width="0.0126%" height="15" fill="rgb(241,33,4)" fg:x="35670" fg:w="6"/><text x="75.1602%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (6 samples, 0.01%)</title><rect x="74.9102%" y="1365" width="0.0126%" height="15" fill="rgb(222,26,43)" fg:x="35670" fg:w="6"/><text x="75.1602%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (6 samples, 0.01%)</title><rect x="74.9102%" y="1349" width="0.0126%" height="15" fill="rgb(243,29,36)" fg:x="35670" fg:w="6"/><text x="75.1602%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="74.9102%" y="1333" width="0.0126%" height="15" fill="rgb(241,9,27)" fg:x="35670" fg:w="6"/><text x="75.1602%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="74.9102%" y="1317" width="0.0126%" height="15" fill="rgb(205,117,26)" fg:x="35670" fg:w="6"/><text x="75.1602%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (8 samples, 0.02%)</title><rect x="74.9270%" y="1365" width="0.0168%" height="15" fill="rgb(209,80,39)" fg:x="35678" fg:w="8"/><text x="75.1770%" y="1375.50"></text></g><g><title>libsystem_m.dylib`exp (57 samples, 0.12%)</title><rect x="74.9690%" y="1349" width="0.1197%" height="15" fill="rgb(239,155,6)" fg:x="35698" fg:w="57"/><text x="75.2190%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (10 samples, 0.02%)</title><rect x="75.0929%" y="1301" width="0.0210%" height="15" fill="rgb(212,104,12)" fg:x="35757" fg:w="10"/><text x="75.3429%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (10 samples, 0.02%)</title><rect x="75.0929%" y="1285" width="0.0210%" height="15" fill="rgb(234,204,3)" fg:x="35757" fg:w="10"/><text x="75.3429%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="75.1013%" y="1269" width="0.0126%" height="15" fill="rgb(251,218,7)" fg:x="35761" fg:w="6"/><text x="75.3513%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (12 samples, 0.03%)</title><rect x="75.0908%" y="1317" width="0.0252%" height="15" fill="rgb(221,81,32)" fg:x="35756" fg:w="12"/><text x="75.3408%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (13 samples, 0.03%)</title><rect x="75.0908%" y="1349" width="0.0273%" height="15" fill="rgb(214,152,26)" fg:x="35756" fg:w="13"/><text x="75.3408%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (13 samples, 0.03%)</title><rect x="75.0908%" y="1333" width="0.0273%" height="15" fill="rgb(223,22,3)" fg:x="35756" fg:w="13"/><text x="75.3408%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="75.1181%" y="1333" width="0.0126%" height="15" fill="rgb(207,174,7)" fg:x="35769" fg:w="6"/><text x="75.3681%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (37 samples, 0.08%)</title><rect x="75.1454%" y="1317" width="0.0777%" height="15" fill="rgb(224,19,52)" fg:x="35782" fg:w="37"/><text x="75.3954%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="75.2252%" y="1285" width="0.0105%" height="15" fill="rgb(228,24,14)" fg:x="35820" fg:w="5"/><text x="75.4752%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="75.2252%" y="1269" width="0.0105%" height="15" fill="rgb(230,153,43)" fg:x="35820" fg:w="5"/><text x="75.4752%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="75.2252%" y="1253" width="0.0105%" height="15" fill="rgb(231,106,12)" fg:x="35820" fg:w="5"/><text x="75.4752%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="75.2252%" y="1237" width="0.0105%" height="15" fill="rgb(215,92,2)" fg:x="35820" fg:w="5"/><text x="75.4752%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (7 samples, 0.01%)</title><rect x="75.2252%" y="1317" width="0.0147%" height="15" fill="rgb(249,143,25)" fg:x="35820" fg:w="7"/><text x="75.4752%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (7 samples, 0.01%)</title><rect x="75.2252%" y="1301" width="0.0147%" height="15" fill="rgb(252,7,35)" fg:x="35820" fg:w="7"/><text x="75.4752%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="75.2420%" y="1301" width="0.0105%" height="15" fill="rgb(216,69,40)" fg:x="35828" fg:w="5"/><text x="75.4920%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (40 samples, 0.08%)</title><rect x="75.2714%" y="1285" width="0.0840%" height="15" fill="rgb(240,36,33)" fg:x="35842" fg:w="40"/><text x="75.5214%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::resamples::Resamples&lt;A&gt;::next (16 samples, 0.03%)</title><rect x="75.4163%" y="1253" width="0.0336%" height="15" fill="rgb(231,128,14)" fg:x="35911" fg:w="16"/><text x="75.6663%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (108 samples, 0.23%)</title><rect x="75.3722%" y="1269" width="0.2268%" height="15" fill="rgb(245,143,14)" fg:x="35890" fg:w="108"/><text x="75.6222%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (71 samples, 0.15%)</title><rect x="75.4499%" y="1253" width="0.1491%" height="15" fill="rgb(222,130,28)" fg:x="35927" fg:w="71"/><text x="75.6999%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (17 samples, 0.04%)</title><rect x="75.6033%" y="1253" width="0.0357%" height="15" fill="rgb(212,10,48)" fg:x="36000" fg:w="17"/><text x="75.8533%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (17 samples, 0.04%)</title><rect x="75.6033%" y="1237" width="0.0357%" height="15" fill="rgb(254,118,45)" fg:x="36000" fg:w="17"/><text x="75.8533%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (17 samples, 0.04%)</title><rect x="75.6033%" y="1221" width="0.0357%" height="15" fill="rgb(228,6,45)" fg:x="36000" fg:w="17"/><text x="75.8533%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="75.6285%" y="1205" width="0.0105%" height="15" fill="rgb(241,18,35)" fg:x="36012" fg:w="5"/><text x="75.8785%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (32 samples, 0.07%)</title><rect x="75.5991%" y="1269" width="0.0672%" height="15" fill="rgb(227,214,53)" fg:x="35998" fg:w="32"/><text x="75.8491%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (13 samples, 0.03%)</title><rect x="75.6390%" y="1253" width="0.0273%" height="15" fill="rgb(224,107,51)" fg:x="36017" fg:w="13"/><text x="75.8890%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (13 samples, 0.03%)</title><rect x="75.6390%" y="1237" width="0.0273%" height="15" fill="rgb(248,60,28)" fg:x="36017" fg:w="13"/><text x="75.8890%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="75.6537%" y="1221" width="0.0126%" height="15" fill="rgb(249,101,23)" fg:x="36024" fg:w="6"/><text x="75.9037%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::bivariate::resamples::Resamples&lt;X,Y&gt;::next (30 samples, 0.06%)</title><rect x="75.6663%" y="1269" width="0.0630%" height="15" fill="rgb(228,51,19)" fg:x="36030" fg:w="30"/><text x="75.9163%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (224 samples, 0.47%)</title><rect x="75.3554%" y="1285" width="0.4704%" height="15" fill="rgb(213,20,6)" fg:x="35882" fg:w="224"/><text x="75.6054%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (45 samples, 0.09%)</title><rect x="75.7314%" y="1269" width="0.0945%" height="15" fill="rgb(212,124,10)" fg:x="36061" fg:w="45"/><text x="75.9814%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (7 samples, 0.01%)</title><rect x="75.8280%" y="1253" width="0.0147%" height="15" fill="rgb(248,3,40)" fg:x="36107" fg:w="7"/><text x="76.0780%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="75.8280%" y="1237" width="0.0147%" height="15" fill="rgb(223,178,23)" fg:x="36107" fg:w="7"/><text x="76.0780%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="75.8280%" y="1221" width="0.0147%" height="15" fill="rgb(240,132,45)" fg:x="36107" fg:w="7"/><text x="76.0780%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="75.8322%" y="1205" width="0.0105%" height="15" fill="rgb(245,164,36)" fg:x="36109" fg:w="5"/><text x="76.0822%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (283 samples, 0.59%)</title><rect x="75.2525%" y="1301" width="0.5943%" height="15" fill="rgb(231,188,53)" fg:x="35833" fg:w="283"/><text x="75.5025%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (9 samples, 0.02%)</title><rect x="75.8280%" y="1285" width="0.0189%" height="15" fill="rgb(237,198,39)" fg:x="36107" fg:w="9"/><text x="76.0780%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (9 samples, 0.02%)</title><rect x="75.8280%" y="1269" width="0.0189%" height="15" fill="rgb(223,120,35)" fg:x="36107" fg:w="9"/><text x="76.0780%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (12 samples, 0.03%)</title><rect x="75.8490%" y="1285" width="0.0252%" height="15" fill="rgb(253,107,49)" fg:x="36117" fg:w="12"/><text x="76.0990%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (61 samples, 0.13%)</title><rect x="75.8994%" y="1269" width="0.1281%" height="15" fill="rgb(216,44,31)" fg:x="36141" fg:w="61"/><text x="76.1494%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (16 samples, 0.03%)</title><rect x="76.0359%" y="1237" width="0.0336%" height="15" fill="rgb(253,87,21)" fg:x="36206" fg:w="16"/><text x="76.2859%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (12 samples, 0.03%)</title><rect x="76.0443%" y="1221" width="0.0252%" height="15" fill="rgb(226,18,2)" fg:x="36210" fg:w="12"/><text x="76.2943%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="76.0443%" y="1205" width="0.0252%" height="15" fill="rgb(216,8,46)" fg:x="36210" fg:w="12"/><text x="76.2943%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="76.0527%" y="1189" width="0.0168%" height="15" fill="rgb(226,140,39)" fg:x="36214" fg:w="8"/><text x="76.3027%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (35 samples, 0.07%)</title><rect x="76.0275%" y="1253" width="0.0735%" height="15" fill="rgb(221,194,54)" fg:x="36202" fg:w="35"/><text x="76.2775%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (15 samples, 0.03%)</title><rect x="76.0695%" y="1237" width="0.0315%" height="15" fill="rgb(213,92,11)" fg:x="36222" fg:w="15"/><text x="76.3195%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (15 samples, 0.03%)</title><rect x="76.0695%" y="1221" width="0.0315%" height="15" fill="rgb(229,162,46)" fg:x="36222" fg:w="15"/><text x="76.3195%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (13 samples, 0.03%)</title><rect x="76.0737%" y="1205" width="0.0273%" height="15" fill="rgb(214,111,36)" fg:x="36224" fg:w="13"/><text x="76.3237%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (41 samples, 0.09%)</title><rect x="76.0275%" y="1269" width="0.0861%" height="15" fill="rgb(207,6,21)" fg:x="36202" fg:w="41"/><text x="76.2775%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (5 samples, 0.01%)</title><rect x="76.1031%" y="1253" width="0.0105%" height="15" fill="rgb(213,127,38)" fg:x="36238" fg:w="5"/><text x="76.3531%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="76.1157%" y="1237" width="0.0105%" height="15" fill="rgb(238,118,32)" fg:x="36244" fg:w="5"/><text x="76.3657%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="76.1157%" y="1221" width="0.0105%" height="15" fill="rgb(240,139,39)" fg:x="36244" fg:w="5"/><text x="76.3657%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (134 samples, 0.28%)</title><rect x="75.8469%" y="1301" width="0.2814%" height="15" fill="rgb(235,10,37)" fg:x="36116" fg:w="134"/><text x="76.0969%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (121 samples, 0.25%)</title><rect x="75.8742%" y="1285" width="0.2541%" height="15" fill="rgb(249,171,38)" fg:x="36129" fg:w="121"/><text x="76.1242%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (6 samples, 0.01%)</title><rect x="76.1157%" y="1269" width="0.0126%" height="15" fill="rgb(242,144,32)" fg:x="36244" fg:w="6"/><text x="76.3657%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (6 samples, 0.01%)</title><rect x="76.1157%" y="1253" width="0.0126%" height="15" fill="rgb(217,117,21)" fg:x="36244" fg:w="6"/><text x="76.3657%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="76.1283%" y="1237" width="0.0168%" height="15" fill="rgb(249,87,1)" fg:x="36250" fg:w="8"/><text x="76.3783%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="76.1283%" y="1221" width="0.0168%" height="15" fill="rgb(248,196,48)" fg:x="36250" fg:w="8"/><text x="76.3783%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.1451%" y="1173" width="0.0105%" height="15" fill="rgb(251,206,33)" fg:x="36258" fg:w="5"/><text x="76.3951%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.1451%" y="1157" width="0.0105%" height="15" fill="rgb(232,141,28)" fg:x="36258" fg:w="5"/><text x="76.3951%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (492 samples, 1.03%)</title><rect x="75.1307%" y="1333" width="1.0332%" height="15" fill="rgb(209,167,14)" fg:x="35775" fg:w="492"/><text x="75.3807%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (440 samples, 0.92%)</title><rect x="75.2399%" y="1317" width="0.9240%" height="15" fill="rgb(225,11,50)" fg:x="35827" fg:w="440"/><text x="75.4899%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (17 samples, 0.04%)</title><rect x="76.1283%" y="1301" width="0.0357%" height="15" fill="rgb(209,50,20)" fg:x="36250" fg:w="17"/><text x="76.3783%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (17 samples, 0.04%)</title><rect x="76.1283%" y="1285" width="0.0357%" height="15" fill="rgb(212,17,46)" fg:x="36250" fg:w="17"/><text x="76.3783%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="76.1283%" y="1269" width="0.0357%" height="15" fill="rgb(216,101,39)" fg:x="36250" fg:w="17"/><text x="76.3783%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="76.1283%" y="1253" width="0.0357%" height="15" fill="rgb(212,228,48)" fg:x="36250" fg:w="17"/><text x="76.3783%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="76.1451%" y="1237" width="0.0189%" height="15" fill="rgb(250,6,50)" fg:x="36258" fg:w="9"/><text x="76.3951%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="76.1451%" y="1221" width="0.0189%" height="15" fill="rgb(250,160,48)" fg:x="36258" fg:w="9"/><text x="76.3951%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="76.1451%" y="1205" width="0.0189%" height="15" fill="rgb(244,216,33)" fg:x="36258" fg:w="9"/><text x="76.3951%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="76.1451%" y="1189" width="0.0189%" height="15" fill="rgb(207,157,5)" fg:x="36258" fg:w="9"/><text x="76.3951%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="76.1745%" y="1301" width="0.0315%" height="15" fill="rgb(228,199,8)" fg:x="36272" fg:w="15"/><text x="76.4245%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (7 samples, 0.01%)</title><rect x="76.2060%" y="1301" width="0.0147%" height="15" fill="rgb(227,80,20)" fg:x="36287" fg:w="7"/><text x="76.4560%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (7 samples, 0.01%)</title><rect x="76.2060%" y="1285" width="0.0147%" height="15" fill="rgb(222,9,33)" fg:x="36287" fg:w="7"/><text x="76.4560%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (7 samples, 0.01%)</title><rect x="76.2060%" y="1269" width="0.0147%" height="15" fill="rgb(239,44,28)" fg:x="36287" fg:w="7"/><text x="76.4560%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="76.2060%" y="1253" width="0.0147%" height="15" fill="rgb(249,187,43)" fg:x="36287" fg:w="7"/><text x="76.4560%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="76.2060%" y="1237" width="0.0147%" height="15" fill="rgb(216,141,28)" fg:x="36287" fg:w="7"/><text x="76.4560%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (11 samples, 0.02%)</title><rect x="76.2270%" y="1285" width="0.0231%" height="15" fill="rgb(230,154,53)" fg:x="36297" fg:w="11"/><text x="76.4770%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (70 samples, 0.15%)</title><rect x="76.2921%" y="1269" width="0.1470%" height="15" fill="rgb(227,82,4)" fg:x="36328" fg:w="70"/><text x="76.5421%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (12 samples, 0.03%)</title><rect x="76.4412%" y="1237" width="0.0252%" height="15" fill="rgb(220,107,16)" fg:x="36399" fg:w="12"/><text x="76.6912%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (12 samples, 0.03%)</title><rect x="76.4412%" y="1221" width="0.0252%" height="15" fill="rgb(207,187,2)" fg:x="36399" fg:w="12"/><text x="76.6912%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="76.4412%" y="1205" width="0.0252%" height="15" fill="rgb(210,162,52)" fg:x="36399" fg:w="12"/><text x="76.6912%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="76.4496%" y="1189" width="0.0168%" height="15" fill="rgb(217,216,49)" fg:x="36403" fg:w="8"/><text x="76.6996%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (24 samples, 0.05%)</title><rect x="76.4391%" y="1253" width="0.0504%" height="15" fill="rgb(218,146,49)" fg:x="36398" fg:w="24"/><text x="76.6891%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (11 samples, 0.02%)</title><rect x="76.4664%" y="1237" width="0.0231%" height="15" fill="rgb(216,55,40)" fg:x="36411" fg:w="11"/><text x="76.7164%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (11 samples, 0.02%)</title><rect x="76.4664%" y="1221" width="0.0231%" height="15" fill="rgb(208,196,21)" fg:x="36411" fg:w="11"/><text x="76.7164%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="76.4748%" y="1205" width="0.0147%" height="15" fill="rgb(242,117,42)" fg:x="36415" fg:w="7"/><text x="76.7248%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (31 samples, 0.07%)</title><rect x="76.4391%" y="1269" width="0.0651%" height="15" fill="rgb(210,11,23)" fg:x="36398" fg:w="31"/><text x="76.6891%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (5 samples, 0.01%)</title><rect x="76.4937%" y="1253" width="0.0105%" height="15" fill="rgb(217,110,2)" fg:x="36424" fg:w="5"/><text x="76.7437%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (126 samples, 0.26%)</title><rect x="76.2501%" y="1285" width="0.2646%" height="15" fill="rgb(229,77,54)" fg:x="36308" fg:w="126"/><text x="76.5001%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="76.5042%" y="1269" width="0.0105%" height="15" fill="rgb(218,53,16)" fg:x="36429" fg:w="5"/><text x="76.7542%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="76.5042%" y="1253" width="0.0105%" height="15" fill="rgb(215,38,13)" fg:x="36429" fg:w="5"/><text x="76.7542%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (9 samples, 0.02%)</title><rect x="76.5210%" y="1269" width="0.0189%" height="15" fill="rgb(235,42,18)" fg:x="36437" fg:w="9"/><text x="76.7710%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (62 samples, 0.13%)</title><rect x="76.5819%" y="1253" width="0.1302%" height="15" fill="rgb(219,66,54)" fg:x="36466" fg:w="62"/><text x="76.8319%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (14 samples, 0.03%)</title><rect x="76.7163%" y="1221" width="0.0294%" height="15" fill="rgb(222,205,4)" fg:x="36530" fg:w="14"/><text x="76.9663%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (12 samples, 0.03%)</title><rect x="76.7205%" y="1205" width="0.0252%" height="15" fill="rgb(227,213,46)" fg:x="36532" fg:w="12"/><text x="76.9705%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="76.7205%" y="1189" width="0.0252%" height="15" fill="rgb(250,145,42)" fg:x="36532" fg:w="12"/><text x="76.9705%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="76.7331%" y="1173" width="0.0126%" height="15" fill="rgb(219,15,2)" fg:x="36538" fg:w="6"/><text x="76.9831%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (33 samples, 0.07%)</title><rect x="76.7121%" y="1237" width="0.0693%" height="15" fill="rgb(231,181,52)" fg:x="36528" fg:w="33"/><text x="76.9621%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (17 samples, 0.04%)</title><rect x="76.7457%" y="1221" width="0.0357%" height="15" fill="rgb(235,1,42)" fg:x="36544" fg:w="17"/><text x="76.9957%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (17 samples, 0.04%)</title><rect x="76.7457%" y="1205" width="0.0357%" height="15" fill="rgb(249,88,27)" fg:x="36544" fg:w="17"/><text x="76.9957%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="76.7562%" y="1189" width="0.0252%" height="15" fill="rgb(235,145,16)" fg:x="36549" fg:w="12"/><text x="77.0062%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (38 samples, 0.08%)</title><rect x="76.7121%" y="1253" width="0.0798%" height="15" fill="rgb(237,114,19)" fg:x="36528" fg:w="38"/><text x="76.9621%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (5 samples, 0.01%)</title><rect x="76.7814%" y="1237" width="0.0105%" height="15" fill="rgb(238,51,50)" fg:x="36561" fg:w="5"/><text x="77.0314%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (137 samples, 0.29%)</title><rect x="76.5147%" y="1285" width="0.2877%" height="15" fill="rgb(205,194,25)" fg:x="36434" fg:w="137"/><text x="76.7647%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (125 samples, 0.26%)</title><rect x="76.5399%" y="1269" width="0.2625%" height="15" fill="rgb(215,203,17)" fg:x="36446" fg:w="125"/><text x="76.7899%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="76.7919%" y="1253" width="0.0105%" height="15" fill="rgb(233,112,49)" fg:x="36566" fg:w="5"/><text x="77.0419%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="76.7919%" y="1237" width="0.0105%" height="15" fill="rgb(241,130,26)" fg:x="36566" fg:w="5"/><text x="77.0419%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="76.7919%" y="1221" width="0.0105%" height="15" fill="rgb(252,223,19)" fg:x="36566" fg:w="5"/><text x="77.0419%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="76.7919%" y="1205" width="0.0105%" height="15" fill="rgb(211,95,25)" fg:x="36566" fg:w="5"/><text x="77.0419%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="76.7919%" y="1189" width="0.0105%" height="15" fill="rgb(251,182,27)" fg:x="36566" fg:w="5"/><text x="77.0419%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (311 samples, 0.65%)</title><rect x="76.1640%" y="1333" width="0.6531%" height="15" fill="rgb(238,24,4)" fg:x="36267" fg:w="311"/><text x="76.4140%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (309 samples, 0.65%)</title><rect x="76.1682%" y="1317" width="0.6489%" height="15" fill="rgb(224,220,25)" fg:x="36269" fg:w="309"/><text x="76.4182%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (284 samples, 0.60%)</title><rect x="76.2207%" y="1301" width="0.5964%" height="15" fill="rgb(239,133,26)" fg:x="36294" fg:w="284"/><text x="76.4707%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="76.8024%" y="1285" width="0.0147%" height="15" fill="rgb(211,94,48)" fg:x="36571" fg:w="7"/><text x="77.0524%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="76.8024%" y="1269" width="0.0147%" height="15" fill="rgb(239,87,6)" fg:x="36571" fg:w="7"/><text x="77.0524%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="76.8024%" y="1253" width="0.0147%" height="15" fill="rgb(227,62,0)" fg:x="36571" fg:w="7"/><text x="77.0524%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8066%" y="1237" width="0.0105%" height="15" fill="rgb(211,226,4)" fg:x="36573" fg:w="5"/><text x="77.0566%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="76.8276%" y="1173" width="0.0126%" height="15" fill="rgb(253,38,52)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="76.8276%" y="1157" width="0.0126%" height="15" fill="rgb(229,126,40)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="76.8276%" y="1141" width="0.0126%" height="15" fill="rgb(229,165,44)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="76.8276%" y="1125" width="0.0126%" height="15" fill="rgb(247,95,47)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="76.8276%" y="1109" width="0.0126%" height="15" fill="rgb(216,140,30)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (6 samples, 0.01%)</title><rect x="76.8276%" y="1093" width="0.0126%" height="15" fill="rgb(246,214,8)" fg:x="36583" fg:w="6"/><text x="77.0776%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="76.8276%" y="1205" width="0.0147%" height="15" fill="rgb(227,224,15)" fg:x="36583" fg:w="7"/><text x="77.0776%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="76.8276%" y="1189" width="0.0147%" height="15" fill="rgb(233,175,4)" fg:x="36583" fg:w="7"/><text x="77.0776%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="76.8276%" y="1237" width="0.0294%" height="15" fill="rgb(221,66,45)" fg:x="36583" fg:w="14"/><text x="77.0776%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="76.8276%" y="1221" width="0.0294%" height="15" fill="rgb(221,178,18)" fg:x="36583" fg:w="14"/><text x="77.0776%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="76.8465%" y="1205" width="0.0105%" height="15" fill="rgb(213,81,29)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="76.8465%" y="1189" width="0.0105%" height="15" fill="rgb(220,89,49)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8465%" y="1173" width="0.0105%" height="15" fill="rgb(227,60,33)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8465%" y="1157" width="0.0105%" height="15" fill="rgb(205,113,12)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8465%" y="1141" width="0.0105%" height="15" fill="rgb(211,32,1)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8465%" y="1125" width="0.0105%" height="15" fill="rgb(246,2,12)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8465%" y="1109" width="0.0105%" height="15" fill="rgb(243,37,27)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8465%" y="1093" width="0.0105%" height="15" fill="rgb(248,211,31)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8465%" y="1077" width="0.0105%" height="15" fill="rgb(242,146,47)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8465%" y="1061" width="0.0105%" height="15" fill="rgb(206,70,20)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8465%" y="1045" width="0.0105%" height="15" fill="rgb(215,10,51)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="76.8465%" y="1029" width="0.0105%" height="15" fill="rgb(243,178,53)" fg:x="36592" fg:w="5"/><text x="77.0965%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="76.8213%" y="1269" width="0.0462%" height="15" fill="rgb(233,221,20)" fg:x="36580" fg:w="22"/><text x="77.0713%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="76.8276%" y="1253" width="0.0399%" height="15" fill="rgb(218,95,35)" fg:x="36583" fg:w="19"/><text x="77.0776%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="76.8570%" y="1237" width="0.0105%" height="15" fill="rgb(229,13,5)" fg:x="36597" fg:w="5"/><text x="77.1070%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="76.8570%" y="1221" width="0.0105%" height="15" fill="rgb(252,164,30)" fg:x="36597" fg:w="5"/><text x="77.1070%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="76.8801%" y="1205" width="0.0210%" height="15" fill="rgb(232,68,36)" fg:x="36608" fg:w="10"/><text x="77.1301%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="76.8801%" y="1189" width="0.0210%" height="15" fill="rgb(219,59,54)" fg:x="36608" fg:w="10"/><text x="77.1301%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="76.8822%" y="1173" width="0.0189%" height="15" fill="rgb(250,92,33)" fg:x="36609" fg:w="9"/><text x="77.1322%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="76.8843%" y="1157" width="0.0168%" height="15" fill="rgb(229,162,54)" fg:x="36610" fg:w="8"/><text x="77.1343%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="76.8843%" y="1141" width="0.0168%" height="15" fill="rgb(244,114,52)" fg:x="36610" fg:w="8"/><text x="77.1343%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="76.8843%" y="1125" width="0.0168%" height="15" fill="rgb(212,211,43)" fg:x="36610" fg:w="8"/><text x="77.1343%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="76.8843%" y="1109" width="0.0168%" height="15" fill="rgb(226,147,8)" fg:x="36610" fg:w="8"/><text x="77.1343%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="76.8864%" y="1093" width="0.0147%" height="15" fill="rgb(226,23,13)" fg:x="36611" fg:w="7"/><text x="77.1364%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="76.8864%" y="1077" width="0.0147%" height="15" fill="rgb(240,63,4)" fg:x="36611" fg:w="7"/><text x="77.1364%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="76.8864%" y="1061" width="0.0147%" height="15" fill="rgb(221,1,32)" fg:x="36611" fg:w="7"/><text x="77.1364%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="76.8864%" y="1045" width="0.0147%" height="15" fill="rgb(242,117,10)" fg:x="36611" fg:w="7"/><text x="77.1364%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="76.9032%" y="1109" width="0.0126%" height="15" fill="rgb(249,172,44)" fg:x="36619" fg:w="6"/><text x="77.1532%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="76.9032%" y="1093" width="0.0126%" height="15" fill="rgb(244,46,45)" fg:x="36619" fg:w="6"/><text x="77.1532%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (943 samples, 1.98%)</title><rect x="74.9438%" y="1365" width="1.9804%" height="15" fill="rgb(206,43,17)" fg:x="35686" fg:w="943"/><text x="75.1938%" y="1375.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (860 samples, 1.81%)</title><rect x="75.1181%" y="1349" width="1.8061%" height="15" fill="rgb(239,218,39)" fg:x="35769" fg:w="860"/><text x="75.3681%" y="1359.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (51 samples, 0.11%)</title><rect x="76.8171%" y="1333" width="0.1071%" height="15" fill="rgb(208,169,54)" fg:x="36578" fg:w="51"/><text x="77.0671%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (50 samples, 0.11%)</title><rect x="76.8192%" y="1317" width="0.1050%" height="15" fill="rgb(247,25,42)" fg:x="36579" fg:w="50"/><text x="77.0692%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (50 samples, 0.11%)</title><rect x="76.8192%" y="1301" width="0.1050%" height="15" fill="rgb(226,23,31)" fg:x="36579" fg:w="50"/><text x="77.0692%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (49 samples, 0.10%)</title><rect x="76.8213%" y="1285" width="0.1029%" height="15" fill="rgb(247,16,28)" fg:x="36580" fg:w="49"/><text x="77.0713%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (24 samples, 0.05%)</title><rect x="76.8738%" y="1269" width="0.0504%" height="15" fill="rgb(231,147,38)" fg:x="36605" fg:w="24"/><text x="77.1238%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (24 samples, 0.05%)</title><rect x="76.8738%" y="1253" width="0.0504%" height="15" fill="rgb(253,81,48)" fg:x="36605" fg:w="24"/><text x="77.1238%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="76.8738%" y="1237" width="0.0504%" height="15" fill="rgb(249,222,43)" fg:x="36605" fg:w="24"/><text x="77.1238%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (24 samples, 0.05%)</title><rect x="76.8738%" y="1221" width="0.0504%" height="15" fill="rgb(221,3,27)" fg:x="36605" fg:w="24"/><text x="77.1238%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="76.9011%" y="1205" width="0.0231%" height="15" fill="rgb(228,180,5)" fg:x="36618" fg:w="11"/><text x="77.1511%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="76.9011%" y="1189" width="0.0231%" height="15" fill="rgb(227,131,42)" fg:x="36618" fg:w="11"/><text x="77.1511%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="76.9011%" y="1173" width="0.0231%" height="15" fill="rgb(212,3,39)" fg:x="36618" fg:w="11"/><text x="77.1511%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="76.9032%" y="1157" width="0.0210%" height="15" fill="rgb(226,45,5)" fg:x="36619" fg:w="10"/><text x="77.1532%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="76.9032%" y="1141" width="0.0210%" height="15" fill="rgb(215,167,45)" fg:x="36619" fg:w="10"/><text x="77.1532%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="76.9032%" y="1125" width="0.0210%" height="15" fill="rgb(250,218,53)" fg:x="36619" fg:w="10"/><text x="77.1532%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="76.9242%" y="1349" width="0.0126%" height="15" fill="rgb(207,140,0)" fg:x="36629" fg:w="6"/><text x="77.1742%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (35 samples, 0.07%)</title><rect x="76.9536%" y="1333" width="0.0735%" height="15" fill="rgb(238,133,51)" fg:x="36643" fg:w="35"/><text x="77.2036%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (11 samples, 0.02%)</title><rect x="77.0271%" y="1301" width="0.0231%" height="15" fill="rgb(218,203,53)" fg:x="36678" fg:w="11"/><text x="77.2771%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (10 samples, 0.02%)</title><rect x="77.0292%" y="1285" width="0.0210%" height="15" fill="rgb(226,184,25)" fg:x="36679" fg:w="10"/><text x="77.2792%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (10 samples, 0.02%)</title><rect x="77.0292%" y="1269" width="0.0210%" height="15" fill="rgb(231,121,21)" fg:x="36679" fg:w="10"/><text x="77.2792%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (9 samples, 0.02%)</title><rect x="77.0313%" y="1253" width="0.0189%" height="15" fill="rgb(251,14,34)" fg:x="36680" fg:w="9"/><text x="77.2813%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (12 samples, 0.03%)</title><rect x="77.0271%" y="1333" width="0.0252%" height="15" fill="rgb(249,193,11)" fg:x="36678" fg:w="12"/><text x="77.2771%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (12 samples, 0.03%)</title><rect x="77.0271%" y="1317" width="0.0252%" height="15" fill="rgb(220,172,37)" fg:x="36678" fg:w="12"/><text x="77.2771%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="77.0565%" y="1317" width="0.0126%" height="15" fill="rgb(231,229,43)" fg:x="36692" fg:w="6"/><text x="77.3065%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (37 samples, 0.08%)</title><rect x="77.0775%" y="1301" width="0.0777%" height="15" fill="rgb(250,161,5)" fg:x="36702" fg:w="37"/><text x="77.3275%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (8 samples, 0.02%)</title><rect x="77.1552%" y="1301" width="0.0168%" height="15" fill="rgb(218,225,18)" fg:x="36739" fg:w="8"/><text x="77.4052%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (8 samples, 0.02%)</title><rect x="77.1552%" y="1285" width="0.0168%" height="15" fill="rgb(245,45,42)" fg:x="36739" fg:w="8"/><text x="77.4052%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (8 samples, 0.02%)</title><rect x="77.1552%" y="1269" width="0.0168%" height="15" fill="rgb(211,115,1)" fg:x="36739" fg:w="8"/><text x="77.4052%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="77.1552%" y="1253" width="0.0168%" height="15" fill="rgb(248,133,52)" fg:x="36739" fg:w="8"/><text x="77.4052%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="77.1552%" y="1237" width="0.0168%" height="15" fill="rgb(238,100,21)" fg:x="36739" fg:w="8"/><text x="77.4052%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (7 samples, 0.01%)</title><rect x="77.1741%" y="1285" width="0.0147%" height="15" fill="rgb(247,144,11)" fg:x="36748" fg:w="7"/><text x="77.4241%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (57 samples, 0.12%)</title><rect x="77.2098%" y="1269" width="0.1197%" height="15" fill="rgb(206,164,16)" fg:x="36765" fg:w="57"/><text x="77.4598%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (15 samples, 0.03%)</title><rect x="77.3337%" y="1237" width="0.0315%" height="15" fill="rgb(222,34,3)" fg:x="36824" fg:w="15"/><text x="77.5837%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (12 samples, 0.03%)</title><rect x="77.3400%" y="1221" width="0.0252%" height="15" fill="rgb(248,82,4)" fg:x="36827" fg:w="12"/><text x="77.5900%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="77.3400%" y="1205" width="0.0252%" height="15" fill="rgb(228,81,46)" fg:x="36827" fg:w="12"/><text x="77.5900%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="77.3526%" y="1189" width="0.0126%" height="15" fill="rgb(227,67,47)" fg:x="36833" fg:w="6"/><text x="77.6026%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (30 samples, 0.06%)</title><rect x="77.3295%" y="1253" width="0.0630%" height="15" fill="rgb(215,93,53)" fg:x="36822" fg:w="30"/><text x="77.5795%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (13 samples, 0.03%)</title><rect x="77.3652%" y="1237" width="0.0273%" height="15" fill="rgb(248,194,39)" fg:x="36839" fg:w="13"/><text x="77.6152%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="77.3673%" y="1221" width="0.0252%" height="15" fill="rgb(215,5,19)" fg:x="36840" fg:w="12"/><text x="77.6173%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="77.3757%" y="1205" width="0.0168%" height="15" fill="rgb(226,215,51)" fg:x="36844" fg:w="8"/><text x="77.6257%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (34 samples, 0.07%)</title><rect x="77.3295%" y="1269" width="0.0714%" height="15" fill="rgb(225,56,26)" fg:x="36822" fg:w="34"/><text x="77.5795%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (105 samples, 0.22%)</title><rect x="77.1888%" y="1285" width="0.2205%" height="15" fill="rgb(222,75,29)" fg:x="36755" fg:w="105"/><text x="77.4388%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (8 samples, 0.02%)</title><rect x="77.4114%" y="1269" width="0.0168%" height="15" fill="rgb(236,139,6)" fg:x="36861" fg:w="8"/><text x="77.6614%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (55 samples, 0.12%)</title><rect x="77.4618%" y="1253" width="0.1155%" height="15" fill="rgb(223,137,36)" fg:x="36885" fg:w="55"/><text x="77.7118%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (14 samples, 0.03%)</title><rect x="77.5794%" y="1221" width="0.0294%" height="15" fill="rgb(226,99,2)" fg:x="36941" fg:w="14"/><text x="77.8294%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (14 samples, 0.03%)</title><rect x="77.5794%" y="1205" width="0.0294%" height="15" fill="rgb(206,133,23)" fg:x="36941" fg:w="14"/><text x="77.8294%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (14 samples, 0.03%)</title><rect x="77.5794%" y="1189" width="0.0294%" height="15" fill="rgb(243,173,15)" fg:x="36941" fg:w="14"/><text x="77.8294%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (9 samples, 0.02%)</title><rect x="77.5899%" y="1173" width="0.0189%" height="15" fill="rgb(228,69,28)" fg:x="36946" fg:w="9"/><text x="77.8399%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (24 samples, 0.05%)</title><rect x="77.5773%" y="1237" width="0.0504%" height="15" fill="rgb(212,51,22)" fg:x="36940" fg:w="24"/><text x="77.8273%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (9 samples, 0.02%)</title><rect x="77.6088%" y="1221" width="0.0189%" height="15" fill="rgb(227,113,0)" fg:x="36955" fg:w="9"/><text x="77.8588%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (9 samples, 0.02%)</title><rect x="77.6088%" y="1205" width="0.0189%" height="15" fill="rgb(252,84,27)" fg:x="36955" fg:w="9"/><text x="77.8588%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="77.6130%" y="1189" width="0.0147%" height="15" fill="rgb(223,145,39)" fg:x="36957" fg:w="7"/><text x="77.8630%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (31 samples, 0.07%)</title><rect x="77.5773%" y="1253" width="0.0651%" height="15" fill="rgb(239,219,30)" fg:x="36940" fg:w="31"/><text x="77.8273%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (6 samples, 0.01%)</title><rect x="77.6298%" y="1237" width="0.0126%" height="15" fill="rgb(224,196,39)" fg:x="36965" fg:w="6"/><text x="77.8798%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (115 samples, 0.24%)</title><rect x="77.4093%" y="1285" width="0.2415%" height="15" fill="rgb(205,35,43)" fg:x="36860" fg:w="115"/><text x="77.6593%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (106 samples, 0.22%)</title><rect x="77.4282%" y="1269" width="0.2226%" height="15" fill="rgb(228,201,21)" fg:x="36869" fg:w="106"/><text x="77.6782%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (278 samples, 0.58%)</title><rect x="77.0691%" y="1317" width="0.5838%" height="15" fill="rgb(237,118,16)" fg:x="36698" fg:w="278"/><text x="77.3191%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (229 samples, 0.48%)</title><rect x="77.1720%" y="1301" width="0.4809%" height="15" fill="rgb(241,17,19)" fg:x="36747" fg:w="229"/><text x="77.4220%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="77.6529%" y="1301" width="0.0126%" height="15" fill="rgb(214,10,25)" fg:x="36976" fg:w="6"/><text x="77.9029%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (37 samples, 0.08%)</title><rect x="77.6760%" y="1285" width="0.0777%" height="15" fill="rgb(238,37,29)" fg:x="36987" fg:w="37"/><text x="77.9260%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="77.7579%" y="1269" width="0.0126%" height="15" fill="rgb(253,83,25)" fg:x="37026" fg:w="6"/><text x="78.0079%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (56 samples, 0.12%)</title><rect x="77.7915%" y="1253" width="0.1176%" height="15" fill="rgb(234,192,12)" fg:x="37042" fg:w="56"/><text x="78.0415%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (13 samples, 0.03%)</title><rect x="77.9134%" y="1221" width="0.0273%" height="15" fill="rgb(241,216,45)" fg:x="37100" fg:w="13"/><text x="78.1634%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (12 samples, 0.03%)</title><rect x="77.9155%" y="1205" width="0.0252%" height="15" fill="rgb(242,22,33)" fg:x="37101" fg:w="12"/><text x="78.1655%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="77.9155%" y="1189" width="0.0252%" height="15" fill="rgb(231,105,49)" fg:x="37101" fg:w="12"/><text x="78.1655%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="77.9302%" y="1173" width="0.0105%" height="15" fill="rgb(218,204,15)" fg:x="37108" fg:w="5"/><text x="78.1802%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (29 samples, 0.06%)</title><rect x="77.9113%" y="1237" width="0.0609%" height="15" fill="rgb(235,138,41)" fg:x="37099" fg:w="29"/><text x="78.1613%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (15 samples, 0.03%)</title><rect x="77.9407%" y="1221" width="0.0315%" height="15" fill="rgb(246,0,9)" fg:x="37113" fg:w="15"/><text x="78.1907%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (14 samples, 0.03%)</title><rect x="77.9428%" y="1205" width="0.0294%" height="15" fill="rgb(210,74,4)" fg:x="37114" fg:w="14"/><text x="78.1928%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="77.9596%" y="1189" width="0.0126%" height="15" fill="rgb(250,60,41)" fg:x="37122" fg:w="6"/><text x="78.2096%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (32 samples, 0.07%)</title><rect x="77.9092%" y="1253" width="0.0672%" height="15" fill="rgb(220,115,12)" fg:x="37098" fg:w="32"/><text x="78.1592%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (103 samples, 0.22%)</title><rect x="77.7705%" y="1269" width="0.2163%" height="15" fill="rgb(237,100,13)" fg:x="37032" fg:w="103"/><text x="78.0205%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="77.9764%" y="1253" width="0.0105%" height="15" fill="rgb(213,55,26)" fg:x="37130" fg:w="5"/><text x="78.2264%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="77.9764%" y="1237" width="0.0105%" height="15" fill="rgb(216,17,4)" fg:x="37130" fg:w="5"/><text x="78.2264%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="77.9911%" y="1253" width="0.0126%" height="15" fill="rgb(220,153,47)" fg:x="37137" fg:w="6"/><text x="78.2411%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (52 samples, 0.11%)</title><rect x="78.0226%" y="1237" width="0.1092%" height="15" fill="rgb(215,131,9)" fg:x="37152" fg:w="52"/><text x="78.2726%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (10 samples, 0.02%)</title><rect x="78.1402%" y="1205" width="0.0210%" height="15" fill="rgb(233,46,42)" fg:x="37208" fg:w="10"/><text x="78.3902%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (9 samples, 0.02%)</title><rect x="78.1423%" y="1189" width="0.0189%" height="15" fill="rgb(226,86,7)" fg:x="37209" fg:w="9"/><text x="78.3923%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (9 samples, 0.02%)</title><rect x="78.1423%" y="1173" width="0.0189%" height="15" fill="rgb(239,226,21)" fg:x="37209" fg:w="9"/><text x="78.3923%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="78.1465%" y="1157" width="0.0147%" height="15" fill="rgb(244,137,22)" fg:x="37211" fg:w="7"/><text x="78.3965%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (18 samples, 0.04%)</title><rect x="78.1339%" y="1221" width="0.0378%" height="15" fill="rgb(211,139,35)" fg:x="37205" fg:w="18"/><text x="78.3839%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="78.1612%" y="1205" width="0.0105%" height="15" fill="rgb(214,62,50)" fg:x="37218" fg:w="5"/><text x="78.4112%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="78.1612%" y="1189" width="0.0105%" height="15" fill="rgb(212,113,44)" fg:x="37218" fg:w="5"/><text x="78.4112%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (23 samples, 0.05%)</title><rect x="78.1318%" y="1237" width="0.0483%" height="15" fill="rgb(226,150,43)" fg:x="37204" fg:w="23"/><text x="78.3818%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (10 samples, 0.02%)</title><rect x="78.1801%" y="1205" width="0.0210%" height="15" fill="rgb(250,71,37)" fg:x="37227" fg:w="10"/><text x="78.4301%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="78.1843%" y="1189" width="0.0168%" height="15" fill="rgb(219,76,19)" fg:x="37229" fg:w="8"/><text x="78.4343%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="78.1843%" y="1173" width="0.0168%" height="15" fill="rgb(250,39,11)" fg:x="37229" fg:w="8"/><text x="78.4343%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="78.1885%" y="1157" width="0.0126%" height="15" fill="rgb(230,64,31)" fg:x="37231" fg:w="6"/><text x="78.4385%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (104 samples, 0.22%)</title><rect x="77.9869%" y="1269" width="0.2184%" height="15" fill="rgb(208,222,23)" fg:x="37135" fg:w="104"/><text x="78.2369%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (96 samples, 0.20%)</title><rect x="78.0037%" y="1253" width="0.2016%" height="15" fill="rgb(227,125,18)" fg:x="37143" fg:w="96"/><text x="78.2537%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (12 samples, 0.03%)</title><rect x="78.1801%" y="1237" width="0.0252%" height="15" fill="rgb(234,210,9)" fg:x="37227" fg:w="12"/><text x="78.4301%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (12 samples, 0.03%)</title><rect x="78.1801%" y="1221" width="0.0252%" height="15" fill="rgb(217,127,24)" fg:x="37227" fg:w="12"/><text x="78.4301%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="78.2074%" y="1205" width="0.0168%" height="15" fill="rgb(239,141,48)" fg:x="37240" fg:w="8"/><text x="78.4574%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="78.2095%" y="1189" width="0.0147%" height="15" fill="rgb(227,109,8)" fg:x="37241" fg:w="7"/><text x="78.4595%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (276 samples, 0.58%)</title><rect x="77.6529%" y="1317" width="0.5796%" height="15" fill="rgb(235,184,23)" fg:x="36976" fg:w="276"/><text x="77.9029%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (270 samples, 0.57%)</title><rect x="77.6655%" y="1301" width="0.5670%" height="15" fill="rgb(227,226,48)" fg:x="36982" fg:w="270"/><text x="77.9155%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (228 samples, 0.48%)</title><rect x="77.7537%" y="1285" width="0.4788%" height="15" fill="rgb(206,150,11)" fg:x="37024" fg:w="228"/><text x="78.0037%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="78.2053%" y="1269" width="0.0273%" height="15" fill="rgb(254,2,33)" fg:x="37239" fg:w="13"/><text x="78.4553%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="78.2053%" y="1253" width="0.0273%" height="15" fill="rgb(243,160,20)" fg:x="37239" fg:w="13"/><text x="78.4553%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="78.2053%" y="1237" width="0.0273%" height="15" fill="rgb(218,208,30)" fg:x="37239" fg:w="13"/><text x="78.4553%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="78.2074%" y="1221" width="0.0252%" height="15" fill="rgb(224,120,49)" fg:x="37240" fg:w="12"/><text x="78.4574%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.2347%" y="1221" width="0.0105%" height="15" fill="rgb(246,12,2)" fg:x="37253" fg:w="5"/><text x="78.4847%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="78.2326%" y="1253" width="0.0210%" height="15" fill="rgb(236,117,3)" fg:x="37252" fg:w="10"/><text x="78.4826%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="78.2347%" y="1237" width="0.0189%" height="15" fill="rgb(216,128,52)" fg:x="37253" fg:w="9"/><text x="78.4847%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="78.2536%" y="1253" width="0.0168%" height="15" fill="rgb(246,145,19)" fg:x="37262" fg:w="8"/><text x="78.5036%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="78.2536%" y="1237" width="0.0168%" height="15" fill="rgb(222,11,46)" fg:x="37262" fg:w="8"/><text x="78.5036%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="78.2536%" y="1221" width="0.0168%" height="15" fill="rgb(245,82,36)" fg:x="37262" fg:w="8"/><text x="78.5036%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.2704%" y="1189" width="0.0105%" height="15" fill="rgb(250,73,51)" fg:x="37270" fg:w="5"/><text x="78.5204%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.2704%" y="1173" width="0.0105%" height="15" fill="rgb(221,189,23)" fg:x="37270" fg:w="5"/><text x="78.5204%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (653 samples, 1.37%)</title><rect x="76.9242%" y="1365" width="1.3714%" height="15" fill="rgb(210,33,7)" fg:x="36629" fg:w="653"/><text x="77.1742%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (647 samples, 1.36%)</title><rect x="76.9368%" y="1349" width="1.3588%" height="15" fill="rgb(210,107,22)" fg:x="36635" fg:w="647"/><text x="77.1868%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (592 samples, 1.24%)</title><rect x="77.0523%" y="1333" width="1.2433%" height="15" fill="rgb(222,116,37)" fg:x="36690" fg:w="592"/><text x="77.3023%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (30 samples, 0.06%)</title><rect x="78.2326%" y="1317" width="0.0630%" height="15" fill="rgb(254,17,48)" fg:x="37252" fg:w="30"/><text x="78.4826%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (30 samples, 0.06%)</title><rect x="78.2326%" y="1301" width="0.0630%" height="15" fill="rgb(224,36,32)" fg:x="37252" fg:w="30"/><text x="78.4826%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (30 samples, 0.06%)</title><rect x="78.2326%" y="1285" width="0.0630%" height="15" fill="rgb(232,90,46)" fg:x="37252" fg:w="30"/><text x="78.4826%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="78.2326%" y="1269" width="0.0630%" height="15" fill="rgb(241,66,40)" fg:x="37252" fg:w="30"/><text x="78.4826%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="78.2704%" y="1253" width="0.0252%" height="15" fill="rgb(249,184,29)" fg:x="37270" fg:w="12"/><text x="78.5204%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="78.2704%" y="1237" width="0.0252%" height="15" fill="rgb(231,181,1)" fg:x="37270" fg:w="12"/><text x="78.5204%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="78.2704%" y="1221" width="0.0252%" height="15" fill="rgb(224,94,2)" fg:x="37270" fg:w="12"/><text x="78.5204%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="78.2704%" y="1205" width="0.0252%" height="15" fill="rgb(229,170,15)" fg:x="37270" fg:w="12"/><text x="78.5204%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="78.2809%" y="1189" width="0.0147%" height="15" fill="rgb(240,127,35)" fg:x="37275" fg:w="7"/><text x="78.5309%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="78.2809%" y="1173" width="0.0147%" height="15" fill="rgb(248,196,34)" fg:x="37275" fg:w="7"/><text x="78.5309%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.2809%" y="1157" width="0.0147%" height="15" fill="rgb(236,137,7)" fg:x="37275" fg:w="7"/><text x="78.5309%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="78.2809%" y="1141" width="0.0147%" height="15" fill="rgb(235,127,16)" fg:x="37275" fg:w="7"/><text x="78.5309%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="78.2830%" y="1125" width="0.0126%" height="15" fill="rgb(250,192,54)" fg:x="37276" fg:w="6"/><text x="78.5330%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="78.2830%" y="1109" width="0.0126%" height="15" fill="rgb(218,98,20)" fg:x="37276" fg:w="6"/><text x="78.5330%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.2830%" y="1093" width="0.0126%" height="15" fill="rgb(230,176,47)" fg:x="37276" fg:w="6"/><text x="78.5330%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.2851%" y="1077" width="0.0105%" height="15" fill="rgb(244,2,33)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="78.2851%" y="1061" width="0.0105%" height="15" fill="rgb(231,100,17)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="78.2851%" y="1045" width="0.0105%" height="15" fill="rgb(245,23,12)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.2851%" y="1029" width="0.0105%" height="15" fill="rgb(249,55,22)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.2851%" y="1013" width="0.0105%" height="15" fill="rgb(207,134,9)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.2851%" y="997" width="0.0105%" height="15" fill="rgb(218,134,0)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.2851%" y="981" width="0.0105%" height="15" fill="rgb(213,212,33)" fg:x="37277" fg:w="5"/><text x="78.5351%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::bivariate::resamples::Resamples&lt;X,Y&gt;::next (5 samples, 0.01%)</title><rect x="78.3334%" y="1109" width="0.0105%" height="15" fill="rgb(252,106,18)" fg:x="37300" fg:w="5"/><text x="78.5834%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="78.3229%" y="1173" width="0.0273%" height="15" fill="rgb(208,126,42)" fg:x="37295" fg:w="13"/><text x="78.5729%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="78.3271%" y="1157" width="0.0231%" height="15" fill="rgb(246,175,29)" fg:x="37297" fg:w="11"/><text x="78.5771%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="78.3271%" y="1141" width="0.0231%" height="15" fill="rgb(215,13,50)" fg:x="37297" fg:w="11"/><text x="78.5771%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (11 samples, 0.02%)</title><rect x="78.3271%" y="1125" width="0.0231%" height="15" fill="rgb(216,172,15)" fg:x="37297" fg:w="11"/><text x="78.5771%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="78.3166%" y="1205" width="0.0462%" height="15" fill="rgb(212,103,13)" fg:x="37292" fg:w="22"/><text x="78.5666%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="78.3229%" y="1189" width="0.0399%" height="15" fill="rgb(231,171,36)" fg:x="37295" fg:w="19"/><text x="78.5729%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="78.3628%" y="1205" width="0.0147%" height="15" fill="rgb(250,123,20)" fg:x="37314" fg:w="7"/><text x="78.6128%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.3628%" y="1189" width="0.0147%" height="15" fill="rgb(212,53,50)" fg:x="37314" fg:w="7"/><text x="78.6128%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.3649%" y="1173" width="0.0126%" height="15" fill="rgb(243,54,12)" fg:x="37315" fg:w="6"/><text x="78.6149%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="78.3103%" y="1237" width="0.0714%" height="15" fill="rgb(234,101,34)" fg:x="37289" fg:w="34"/><text x="78.5603%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (32 samples, 0.07%)</title><rect x="78.3145%" y="1221" width="0.0672%" height="15" fill="rgb(254,67,22)" fg:x="37291" fg:w="32"/><text x="78.5645%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="78.3817%" y="1237" width="0.0294%" height="15" fill="rgb(250,35,47)" fg:x="37323" fg:w="14"/><text x="78.6317%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="78.3817%" y="1221" width="0.0294%" height="15" fill="rgb(226,126,38)" fg:x="37323" fg:w="14"/><text x="78.6317%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="78.3901%" y="1205" width="0.0210%" height="15" fill="rgb(216,138,53)" fg:x="37327" fg:w="10"/><text x="78.6401%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="78.3985%" y="1189" width="0.0126%" height="15" fill="rgb(246,199,43)" fg:x="37331" fg:w="6"/><text x="78.6485%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.3985%" y="1173" width="0.0126%" height="15" fill="rgb(232,125,11)" fg:x="37331" fg:w="6"/><text x="78.6485%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (55 samples, 0.12%)</title><rect x="78.3103%" y="1269" width="0.1155%" height="15" fill="rgb(218,219,45)" fg:x="37289" fg:w="55"/><text x="78.5603%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (55 samples, 0.12%)</title><rect x="78.3103%" y="1253" width="0.1155%" height="15" fill="rgb(216,102,54)" fg:x="37289" fg:w="55"/><text x="78.5603%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="78.4111%" y="1237" width="0.0147%" height="15" fill="rgb(250,228,7)" fg:x="37337" fg:w="7"/><text x="78.6611%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="78.4111%" y="1221" width="0.0147%" height="15" fill="rgb(226,125,25)" fg:x="37337" fg:w="7"/><text x="78.6611%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.4111%" y="1205" width="0.0147%" height="15" fill="rgb(224,165,27)" fg:x="37337" fg:w="7"/><text x="78.6611%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.4132%" y="1189" width="0.0126%" height="15" fill="rgb(233,86,3)" fg:x="37338" fg:w="6"/><text x="78.6632%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.4132%" y="1173" width="0.0126%" height="15" fill="rgb(228,116,20)" fg:x="37338" fg:w="6"/><text x="78.6632%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.4132%" y="1157" width="0.0126%" height="15" fill="rgb(209,192,17)" fg:x="37338" fg:w="6"/><text x="78.6632%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="78.4153%" y="1141" width="0.0105%" height="15" fill="rgb(224,88,34)" fg:x="37339" fg:w="5"/><text x="78.6653%" y="1151.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="78.4258%" y="1237" width="0.0105%" height="15" fill="rgb(233,38,6)" fg:x="37344" fg:w="5"/><text x="78.6758%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="78.4405%" y="1221" width="0.0168%" height="15" fill="rgb(212,59,30)" fg:x="37351" fg:w="8"/><text x="78.6905%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.4468%" y="1205" width="0.0105%" height="15" fill="rgb(213,80,3)" fg:x="37354" fg:w="5"/><text x="78.6968%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="78.4573%" y="1221" width="0.0147%" height="15" fill="rgb(251,178,7)" fg:x="37359" fg:w="7"/><text x="78.7073%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.4573%" y="1205" width="0.0147%" height="15" fill="rgb(213,154,26)" fg:x="37359" fg:w="7"/><text x="78.7073%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.4594%" y="1189" width="0.0126%" height="15" fill="rgb(238,165,49)" fg:x="37360" fg:w="6"/><text x="78.7094%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="78.4615%" y="1173" width="0.0105%" height="15" fill="rgb(248,91,46)" fg:x="37361" fg:w="5"/><text x="78.7115%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.4615%" y="1157" width="0.0105%" height="15" fill="rgb(244,21,52)" fg:x="37361" fg:w="5"/><text x="78.7115%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (24 samples, 0.05%)</title><rect x="78.4258%" y="1269" width="0.0504%" height="15" fill="rgb(247,122,20)" fg:x="37344" fg:w="24"/><text x="78.6758%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="78.4258%" y="1253" width="0.0504%" height="15" fill="rgb(218,27,9)" fg:x="37344" fg:w="24"/><text x="78.6758%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="78.4363%" y="1237" width="0.0399%" height="15" fill="rgb(246,7,6)" fg:x="37349" fg:w="19"/><text x="78.6863%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.4825%" y="1173" width="0.0126%" height="15" fill="rgb(227,135,54)" fg:x="37371" fg:w="6"/><text x="78.7325%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.4846%" y="1157" width="0.0105%" height="15" fill="rgb(247,14,11)" fg:x="37372" fg:w="5"/><text x="78.7346%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="78.4783%" y="1205" width="0.0273%" height="15" fill="rgb(206,149,34)" fg:x="37369" fg:w="13"/><text x="78.7283%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="78.4825%" y="1189" width="0.0231%" height="15" fill="rgb(227,228,4)" fg:x="37371" fg:w="11"/><text x="78.7325%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (104 samples, 0.22%)</title><rect x="78.3019%" y="1301" width="0.2184%" height="15" fill="rgb(238,218,28)" fg:x="37285" fg:w="104"/><text x="78.5519%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (100 samples, 0.21%)</title><rect x="78.3103%" y="1285" width="0.2100%" height="15" fill="rgb(252,86,40)" fg:x="37289" fg:w="100"/><text x="78.5603%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (21 samples, 0.04%)</title><rect x="78.4762%" y="1269" width="0.0441%" height="15" fill="rgb(251,225,11)" fg:x="37368" fg:w="21"/><text x="78.7262%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (21 samples, 0.04%)</title><rect x="78.4762%" y="1253" width="0.0441%" height="15" fill="rgb(206,46,49)" fg:x="37368" fg:w="21"/><text x="78.7262%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="78.4762%" y="1237" width="0.0441%" height="15" fill="rgb(245,128,24)" fg:x="37368" fg:w="21"/><text x="78.7262%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="78.4783%" y="1221" width="0.0420%" height="15" fill="rgb(219,177,34)" fg:x="37369" fg:w="20"/><text x="78.7283%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="78.5098%" y="1205" width="0.0105%" height="15" fill="rgb(218,60,48)" fg:x="37384" fg:w="5"/><text x="78.7598%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.5245%" y="1221" width="0.0105%" height="15" fill="rgb(221,11,5)" fg:x="37391" fg:w="5"/><text x="78.7745%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="78.5224%" y="1253" width="0.0252%" height="15" fill="rgb(220,148,13)" fg:x="37390" fg:w="12"/><text x="78.7724%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="78.5245%" y="1237" width="0.0231%" height="15" fill="rgb(210,16,3)" fg:x="37391" fg:w="11"/><text x="78.7745%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="78.5350%" y="1221" width="0.0126%" height="15" fill="rgb(236,80,2)" fg:x="37396" fg:w="6"/><text x="78.7850%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.5350%" y="1205" width="0.0126%" height="15" fill="rgb(239,129,19)" fg:x="37396" fg:w="6"/><text x="78.7850%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.5497%" y="1205" width="0.0105%" height="15" fill="rgb(220,106,35)" fg:x="37403" fg:w="5"/><text x="78.7997%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.5497%" y="1189" width="0.0105%" height="15" fill="rgb(252,139,45)" fg:x="37403" fg:w="5"/><text x="78.7997%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="78.5476%" y="1253" width="0.0147%" height="15" fill="rgb(229,8,36)" fg:x="37402" fg:w="7"/><text x="78.7976%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.5476%" y="1237" width="0.0147%" height="15" fill="rgb(230,126,33)" fg:x="37402" fg:w="7"/><text x="78.7976%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.5497%" y="1221" width="0.0126%" height="15" fill="rgb(239,140,21)" fg:x="37403" fg:w="6"/><text x="78.7997%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="78.5644%" y="1189" width="0.0105%" height="15" fill="rgb(254,104,9)" fg:x="37410" fg:w="5"/><text x="78.8144%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.5644%" y="1173" width="0.0105%" height="15" fill="rgb(239,52,14)" fg:x="37410" fg:w="5"/><text x="78.8144%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.5791%" y="1125" width="0.0126%" height="15" fill="rgb(208,227,44)" fg:x="37417" fg:w="6"/><text x="78.8291%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="78.5791%" y="1109" width="0.0126%" height="15" fill="rgb(246,18,19)" fg:x="37417" fg:w="6"/><text x="78.8291%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (35 samples, 0.07%)</title><rect x="78.5203%" y="1301" width="0.0735%" height="15" fill="rgb(235,228,25)" fg:x="37389" fg:w="35"/><text x="78.7703%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (35 samples, 0.07%)</title><rect x="78.5203%" y="1285" width="0.0735%" height="15" fill="rgb(240,156,20)" fg:x="37389" fg:w="35"/><text x="78.7703%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (34 samples, 0.07%)</title><rect x="78.5224%" y="1269" width="0.0714%" height="15" fill="rgb(224,8,20)" fg:x="37390" fg:w="34"/><text x="78.7724%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (15 samples, 0.03%)</title><rect x="78.5623%" y="1253" width="0.0315%" height="15" fill="rgb(214,12,52)" fg:x="37409" fg:w="15"/><text x="78.8123%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (15 samples, 0.03%)</title><rect x="78.5623%" y="1237" width="0.0315%" height="15" fill="rgb(211,220,47)" fg:x="37409" fg:w="15"/><text x="78.8123%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="78.5623%" y="1221" width="0.0315%" height="15" fill="rgb(250,173,5)" fg:x="37409" fg:w="15"/><text x="78.8123%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="78.5644%" y="1205" width="0.0294%" height="15" fill="rgb(250,125,52)" fg:x="37410" fg:w="14"/><text x="78.8144%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="78.5770%" y="1189" width="0.0168%" height="15" fill="rgb(209,133,18)" fg:x="37416" fg:w="8"/><text x="78.8270%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="78.5770%" y="1173" width="0.0168%" height="15" fill="rgb(216,173,22)" fg:x="37416" fg:w="8"/><text x="78.8270%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="78.5770%" y="1157" width="0.0168%" height="15" fill="rgb(205,3,22)" fg:x="37416" fg:w="8"/><text x="78.8270%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="78.5791%" y="1141" width="0.0147%" height="15" fill="rgb(248,22,20)" fg:x="37417" fg:w="7"/><text x="78.8291%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="78.6043%" y="1173" width="0.0126%" height="15" fill="rgb(233,6,29)" fg:x="37429" fg:w="6"/><text x="78.8543%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.6064%" y="1157" width="0.0105%" height="15" fill="rgb(240,22,54)" fg:x="37430" fg:w="5"/><text x="78.8564%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="78.6022%" y="1205" width="0.0168%" height="15" fill="rgb(231,133,32)" fg:x="37428" fg:w="8"/><text x="78.8522%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="78.6043%" y="1189" width="0.0147%" height="15" fill="rgb(248,193,4)" fg:x="37429" fg:w="7"/><text x="78.8543%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="78.5980%" y="1237" width="0.0252%" height="15" fill="rgb(211,178,46)" fg:x="37426" fg:w="12"/><text x="78.8480%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="78.6022%" y="1221" width="0.0210%" height="15" fill="rgb(224,5,42)" fg:x="37428" fg:w="10"/><text x="78.8522%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="78.6253%" y="1173" width="0.0147%" height="15" fill="rgb(239,176,25)" fg:x="37439" fg:w="7"/><text x="78.8753%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="78.6295%" y="1157" width="0.0105%" height="15" fill="rgb(245,187,50)" fg:x="37441" fg:w="5"/><text x="78.8795%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (1,836 samples, 3.86%)</title><rect x="74.7947%" y="1397" width="3.8558%" height="15" fill="rgb(248,24,15)" fg:x="35615" fg:w="1836"/><text x="75.0447%" y="1407.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (1,775 samples, 3.73%)</title><rect x="74.9228%" y="1381" width="3.7277%" height="15" fill="rgb(205,166,13)" fg:x="35676" fg:w="1775"/><text x="75.1728%" y="1391.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (169 samples, 0.35%)</title><rect x="78.2956%" y="1365" width="0.3549%" height="15" fill="rgb(208,114,23)" fg:x="37282" fg:w="169"/><text x="78.5456%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (168 samples, 0.35%)</title><rect x="78.2977%" y="1349" width="0.3528%" height="15" fill="rgb(239,127,18)" fg:x="37283" fg:w="168"/><text x="78.5477%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (168 samples, 0.35%)</title><rect x="78.2977%" y="1333" width="0.3528%" height="15" fill="rgb(219,154,28)" fg:x="37283" fg:w="168"/><text x="78.5477%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (166 samples, 0.35%)</title><rect x="78.3019%" y="1317" width="0.3486%" height="15" fill="rgb(225,157,23)" fg:x="37285" fg:w="166"/><text x="78.5519%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (27 samples, 0.06%)</title><rect x="78.5938%" y="1301" width="0.0567%" height="15" fill="rgb(219,8,6)" fg:x="37424" fg:w="27"/><text x="78.8438%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (27 samples, 0.06%)</title><rect x="78.5938%" y="1285" width="0.0567%" height="15" fill="rgb(212,47,6)" fg:x="37424" fg:w="27"/><text x="78.8438%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (27 samples, 0.06%)</title><rect x="78.5938%" y="1269" width="0.0567%" height="15" fill="rgb(224,190,4)" fg:x="37424" fg:w="27"/><text x="78.8438%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="78.5980%" y="1253" width="0.0525%" height="15" fill="rgb(239,183,29)" fg:x="37426" fg:w="25"/><text x="78.8480%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="78.6253%" y="1237" width="0.0252%" height="15" fill="rgb(213,57,7)" fg:x="37439" fg:w="12"/><text x="78.8753%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="78.6253%" y="1221" width="0.0252%" height="15" fill="rgb(216,148,1)" fg:x="37439" fg:w="12"/><text x="78.8753%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="78.6253%" y="1205" width="0.0252%" height="15" fill="rgb(236,182,29)" fg:x="37439" fg:w="12"/><text x="78.8753%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="78.6253%" y="1189" width="0.0252%" height="15" fill="rgb(244,120,48)" fg:x="37439" fg:w="12"/><text x="78.8753%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="78.6547%" y="1381" width="0.0105%" height="15" fill="rgb(206,71,34)" fg:x="37453" fg:w="5"/><text x="78.9047%" y="1391.50"></text></g><g><title>libsystem_m.dylib`exp (33 samples, 0.07%)</title><rect x="78.6862%" y="1365" width="0.0693%" height="15" fill="rgb(242,32,6)" fg:x="37468" fg:w="33"/><text x="78.9362%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (6 samples, 0.01%)</title><rect x="78.7555%" y="1333" width="0.0126%" height="15" fill="rgb(241,35,3)" fg:x="37501" fg:w="6"/><text x="79.0055%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="78.7555%" y="1317" width="0.0126%" height="15" fill="rgb(222,62,19)" fg:x="37501" fg:w="6"/><text x="79.0055%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="78.7555%" y="1301" width="0.0126%" height="15" fill="rgb(223,110,41)" fg:x="37501" fg:w="6"/><text x="79.0055%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (10 samples, 0.02%)</title><rect x="78.7555%" y="1365" width="0.0210%" height="15" fill="rgb(208,224,4)" fg:x="37501" fg:w="10"/><text x="79.0055%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (10 samples, 0.02%)</title><rect x="78.7555%" y="1349" width="0.0210%" height="15" fill="rgb(241,137,19)" fg:x="37501" fg:w="10"/><text x="79.0055%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (13 samples, 0.03%)</title><rect x="78.7786%" y="1349" width="0.0273%" height="15" fill="rgb(244,24,17)" fg:x="37512" fg:w="13"/><text x="79.0286%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (32 samples, 0.07%)</title><rect x="78.8143%" y="1333" width="0.0672%" height="15" fill="rgb(245,178,49)" fg:x="37529" fg:w="32"/><text x="79.0643%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (6 samples, 0.01%)</title><rect x="78.8836%" y="1301" width="0.0126%" height="15" fill="rgb(219,160,38)" fg:x="37562" fg:w="6"/><text x="79.1336%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="78.8857%" y="1285" width="0.0105%" height="15" fill="rgb(228,137,14)" fg:x="37563" fg:w="5"/><text x="79.1357%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="78.8857%" y="1269" width="0.0105%" height="15" fill="rgb(237,134,11)" fg:x="37563" fg:w="5"/><text x="79.1357%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (7 samples, 0.01%)</title><rect x="78.8836%" y="1333" width="0.0147%" height="15" fill="rgb(211,126,44)" fg:x="37562" fg:w="7"/><text x="79.1336%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (7 samples, 0.01%)</title><rect x="78.8836%" y="1317" width="0.0147%" height="15" fill="rgb(226,171,33)" fg:x="37562" fg:w="7"/><text x="79.1336%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (21 samples, 0.04%)</title><rect x="78.9193%" y="1301" width="0.0441%" height="15" fill="rgb(253,99,13)" fg:x="37579" fg:w="21"/><text x="79.1693%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (6 samples, 0.01%)</title><rect x="78.9634%" y="1269" width="0.0126%" height="15" fill="rgb(244,48,7)" fg:x="37600" fg:w="6"/><text x="79.2134%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="78.9634%" y="1253" width="0.0126%" height="15" fill="rgb(244,217,54)" fg:x="37600" fg:w="6"/><text x="79.2134%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="78.9655%" y="1237" width="0.0105%" height="15" fill="rgb(224,15,18)" fg:x="37601" fg:w="5"/><text x="79.2155%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (7 samples, 0.01%)</title><rect x="78.9634%" y="1301" width="0.0147%" height="15" fill="rgb(244,99,12)" fg:x="37600" fg:w="7"/><text x="79.2134%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (7 samples, 0.01%)</title><rect x="78.9634%" y="1285" width="0.0147%" height="15" fill="rgb(233,226,8)" fg:x="37600" fg:w="7"/><text x="79.2134%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="78.9781%" y="1285" width="0.0126%" height="15" fill="rgb(229,211,3)" fg:x="37607" fg:w="6"/><text x="79.2281%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (27 samples, 0.06%)</title><rect x="79.0033%" y="1269" width="0.0567%" height="15" fill="rgb(216,140,21)" fg:x="37619" fg:w="27"/><text x="79.2533%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (9 samples, 0.02%)</title><rect x="79.0621%" y="1237" width="0.0189%" height="15" fill="rgb(234,122,30)" fg:x="37647" fg:w="9"/><text x="79.3121%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="79.0684%" y="1221" width="0.0126%" height="15" fill="rgb(236,25,46)" fg:x="37650" fg:w="6"/><text x="79.3184%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="79.0684%" y="1205" width="0.0126%" height="15" fill="rgb(217,52,54)" fg:x="37650" fg:w="6"/><text x="79.3184%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (21 samples, 0.04%)</title><rect x="79.0600%" y="1269" width="0.0441%" height="15" fill="rgb(222,29,26)" fg:x="37646" fg:w="21"/><text x="79.3100%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (20 samples, 0.04%)</title><rect x="79.0621%" y="1253" width="0.0420%" height="15" fill="rgb(216,177,29)" fg:x="37647" fg:w="20"/><text x="79.3121%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (11 samples, 0.02%)</title><rect x="79.0810%" y="1237" width="0.0231%" height="15" fill="rgb(247,136,51)" fg:x="37656" fg:w="11"/><text x="79.3310%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (11 samples, 0.02%)</title><rect x="79.0810%" y="1221" width="0.0231%" height="15" fill="rgb(231,47,47)" fg:x="37656" fg:w="11"/><text x="79.3310%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (55 samples, 0.12%)</title><rect x="78.9907%" y="1285" width="0.1155%" height="15" fill="rgb(211,192,36)" fg:x="37613" fg:w="55"/><text x="79.2407%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (7 samples, 0.01%)</title><rect x="79.1083%" y="1269" width="0.0147%" height="15" fill="rgb(229,156,32)" fg:x="37669" fg:w="7"/><text x="79.3583%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (31 samples, 0.07%)</title><rect x="79.1293%" y="1253" width="0.0651%" height="15" fill="rgb(248,213,20)" fg:x="37679" fg:w="31"/><text x="79.3793%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (10 samples, 0.02%)</title><rect x="79.2028%" y="1221" width="0.0210%" height="15" fill="rgb(217,64,7)" fg:x="37714" fg:w="10"/><text x="79.4528%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="79.2112%" y="1205" width="0.0126%" height="15" fill="rgb(232,142,8)" fg:x="37718" fg:w="6"/><text x="79.4612%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="79.2112%" y="1189" width="0.0126%" height="15" fill="rgb(224,92,44)" fg:x="37718" fg:w="6"/><text x="79.4612%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="79.2112%" y="1173" width="0.0126%" height="15" fill="rgb(214,169,17)" fg:x="37718" fg:w="6"/><text x="79.4612%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (19 samples, 0.04%)</title><rect x="79.1944%" y="1253" width="0.0399%" height="15" fill="rgb(210,59,37)" fg:x="37710" fg:w="19"/><text x="79.4444%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (19 samples, 0.04%)</title><rect x="79.1944%" y="1237" width="0.0399%" height="15" fill="rgb(214,116,48)" fg:x="37710" fg:w="19"/><text x="79.4444%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="79.2238%" y="1221" width="0.0105%" height="15" fill="rgb(244,191,6)" fg:x="37724" fg:w="5"/><text x="79.4738%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="79.2238%" y="1205" width="0.0105%" height="15" fill="rgb(241,50,52)" fg:x="37724" fg:w="5"/><text x="79.4738%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="79.2238%" y="1189" width="0.0105%" height="15" fill="rgb(236,75,39)" fg:x="37724" fg:w="5"/><text x="79.4738%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (159 samples, 0.33%)</title><rect x="78.9025%" y="1317" width="0.3339%" height="15" fill="rgb(236,99,0)" fg:x="37571" fg:w="159"/><text x="79.1525%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (123 samples, 0.26%)</title><rect x="78.9781%" y="1301" width="0.2583%" height="15" fill="rgb(207,202,15)" fg:x="37607" fg:w="123"/><text x="79.2281%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (62 samples, 0.13%)</title><rect x="79.1062%" y="1285" width="0.1302%" height="15" fill="rgb(233,207,14)" fg:x="37668" fg:w="62"/><text x="79.3562%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (54 samples, 0.11%)</title><rect x="79.1230%" y="1269" width="0.1134%" height="15" fill="rgb(226,27,51)" fg:x="37676" fg:w="54"/><text x="79.3730%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (30 samples, 0.06%)</title><rect x="79.2511%" y="1285" width="0.0630%" height="15" fill="rgb(206,104,42)" fg:x="37737" fg:w="30"/><text x="79.5011%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (38 samples, 0.08%)</title><rect x="79.3393%" y="1253" width="0.0798%" height="15" fill="rgb(212,225,4)" fg:x="37779" fg:w="38"/><text x="79.5893%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (5 samples, 0.01%)</title><rect x="79.4191%" y="1221" width="0.0105%" height="15" fill="rgb(233,96,42)" fg:x="37817" fg:w="5"/><text x="79.6691%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (10 samples, 0.02%)</title><rect x="79.4191%" y="1237" width="0.0210%" height="15" fill="rgb(229,21,32)" fg:x="37817" fg:w="10"/><text x="79.6691%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="79.4296%" y="1221" width="0.0105%" height="15" fill="rgb(226,216,24)" fg:x="37822" fg:w="5"/><text x="79.6796%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (14 samples, 0.03%)</title><rect x="79.4191%" y="1253" width="0.0294%" height="15" fill="rgb(221,163,17)" fg:x="37817" fg:w="14"/><text x="79.6691%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (60 samples, 0.13%)</title><rect x="79.3267%" y="1269" width="0.1260%" height="15" fill="rgb(216,216,42)" fg:x="37773" fg:w="60"/><text x="79.5767%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (31 samples, 0.07%)</title><rect x="79.4674%" y="1237" width="0.0651%" height="15" fill="rgb(240,118,7)" fg:x="37840" fg:w="31"/><text x="79.7174%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (12 samples, 0.03%)</title><rect x="79.5325%" y="1221" width="0.0252%" height="15" fill="rgb(221,67,37)" fg:x="37871" fg:w="12"/><text x="79.7825%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="79.5430%" y="1205" width="0.0147%" height="15" fill="rgb(241,32,44)" fg:x="37876" fg:w="7"/><text x="79.7930%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="79.5430%" y="1189" width="0.0147%" height="15" fill="rgb(235,204,43)" fg:x="37876" fg:w="7"/><text x="79.7930%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="79.5472%" y="1173" width="0.0105%" height="15" fill="rgb(213,116,10)" fg:x="37878" fg:w="5"/><text x="79.7972%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (14 samples, 0.03%)</title><rect x="79.5325%" y="1237" width="0.0294%" height="15" fill="rgb(239,15,48)" fg:x="37871" fg:w="14"/><text x="79.7825%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (54 samples, 0.11%)</title><rect x="79.4527%" y="1269" width="0.1134%" height="15" fill="rgb(207,123,36)" fg:x="37833" fg:w="54"/><text x="79.7027%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (50 samples, 0.11%)</title><rect x="79.4611%" y="1253" width="0.1050%" height="15" fill="rgb(209,103,30)" fg:x="37837" fg:w="50"/><text x="79.7111%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="79.5661%" y="1173" width="0.0126%" height="15" fill="rgb(238,100,19)" fg:x="37887" fg:w="6"/><text x="79.8161%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="79.5661%" y="1157" width="0.0126%" height="15" fill="rgb(244,30,14)" fg:x="37887" fg:w="6"/><text x="79.8161%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="79.5661%" y="1205" width="0.0189%" height="15" fill="rgb(249,174,6)" fg:x="37887" fg:w="9"/><text x="79.8161%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="79.5661%" y="1189" width="0.0189%" height="15" fill="rgb(235,213,41)" fg:x="37887" fg:w="9"/><text x="79.8161%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (169 samples, 0.35%)</title><rect x="79.2364%" y="1317" width="0.3549%" height="15" fill="rgb(213,118,6)" fg:x="37730" fg:w="169"/><text x="79.4864%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (167 samples, 0.35%)</title><rect x="79.2406%" y="1301" width="0.3507%" height="15" fill="rgb(235,44,51)" fg:x="37732" fg:w="167"/><text x="79.4906%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (129 samples, 0.27%)</title><rect x="79.3204%" y="1285" width="0.2709%" height="15" fill="rgb(217,9,53)" fg:x="37770" fg:w="129"/><text x="79.5704%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="79.5661%" y="1269" width="0.0252%" height="15" fill="rgb(237,172,34)" fg:x="37887" fg:w="12"/><text x="79.8161%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="79.5661%" y="1253" width="0.0252%" height="15" fill="rgb(206,206,11)" fg:x="37887" fg:w="12"/><text x="79.8161%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="79.5661%" y="1237" width="0.0252%" height="15" fill="rgb(214,149,29)" fg:x="37887" fg:w="12"/><text x="79.8161%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="79.5661%" y="1221" width="0.0252%" height="15" fill="rgb(208,123,3)" fg:x="37887" fg:w="12"/><text x="79.8161%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="79.5997%" y="1221" width="0.0105%" height="15" fill="rgb(229,126,4)" fg:x="37903" fg:w="5"/><text x="79.8497%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="79.5997%" y="1205" width="0.0105%" height="15" fill="rgb(222,92,36)" fg:x="37903" fg:w="5"/><text x="79.8497%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="79.6186%" y="1157" width="0.0210%" height="15" fill="rgb(216,39,41)" fg:x="37912" fg:w="10"/><text x="79.8686%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="79.6228%" y="1141" width="0.0168%" height="15" fill="rgb(253,127,28)" fg:x="37914" fg:w="8"/><text x="79.8728%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="79.5976%" y="1253" width="0.0462%" height="15" fill="rgb(249,152,51)" fg:x="37902" fg:w="22"/><text x="79.8476%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="79.5997%" y="1237" width="0.0441%" height="15" fill="rgb(209,123,42)" fg:x="37903" fg:w="21"/><text x="79.8497%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="79.6165%" y="1221" width="0.0273%" height="15" fill="rgb(241,118,22)" fg:x="37911" fg:w="13"/><text x="79.8665%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="79.6165%" y="1205" width="0.0273%" height="15" fill="rgb(208,25,7)" fg:x="37911" fg:w="13"/><text x="79.8665%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="79.6165%" y="1189" width="0.0273%" height="15" fill="rgb(243,144,39)" fg:x="37911" fg:w="13"/><text x="79.8665%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="79.6186%" y="1173" width="0.0252%" height="15" fill="rgb(250,50,5)" fg:x="37912" fg:w="12"/><text x="79.8686%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="79.6438%" y="1253" width="0.0105%" height="15" fill="rgb(207,67,11)" fg:x="37924" fg:w="5"/><text x="79.8938%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="79.6438%" y="1237" width="0.0105%" height="15" fill="rgb(245,204,40)" fg:x="37924" fg:w="5"/><text x="79.8938%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="79.6438%" y="1221" width="0.0105%" height="15" fill="rgb(238,228,24)" fg:x="37924" fg:w="5"/><text x="79.8938%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="79.6438%" y="1205" width="0.0105%" height="15" fill="rgb(217,116,22)" fg:x="37924" fg:w="5"/><text x="79.8938%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="79.6438%" y="1189" width="0.0105%" height="15" fill="rgb(234,98,12)" fg:x="37924" fg:w="5"/><text x="79.8938%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (408 samples, 0.86%)</title><rect x="78.8059%" y="1349" width="0.8568%" height="15" fill="rgb(242,170,50)" fg:x="37525" fg:w="408"/><text x="79.0559%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (364 samples, 0.76%)</title><rect x="78.8983%" y="1333" width="0.7644%" height="15" fill="rgb(235,7,5)" fg:x="37569" fg:w="364"/><text x="79.1483%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (34 samples, 0.07%)</title><rect x="79.5913%" y="1317" width="0.0714%" height="15" fill="rgb(241,114,28)" fg:x="37899" fg:w="34"/><text x="79.8413%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (34 samples, 0.07%)</title><rect x="79.5913%" y="1301" width="0.0714%" height="15" fill="rgb(246,112,42)" fg:x="37899" fg:w="34"/><text x="79.8413%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="79.5913%" y="1285" width="0.0714%" height="15" fill="rgb(248,228,14)" fg:x="37899" fg:w="34"/><text x="79.8413%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (32 samples, 0.07%)</title><rect x="79.5955%" y="1269" width="0.0672%" height="15" fill="rgb(208,133,18)" fg:x="37901" fg:w="32"/><text x="79.8455%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (8 samples, 0.02%)</title><rect x="79.6627%" y="1333" width="0.0168%" height="15" fill="rgb(207,35,49)" fg:x="37933" fg:w="8"/><text x="79.9127%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (29 samples, 0.06%)</title><rect x="79.6921%" y="1317" width="0.0609%" height="15" fill="rgb(205,68,36)" fg:x="37947" fg:w="29"/><text x="79.9421%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (25 samples, 0.05%)</title><rect x="79.7677%" y="1285" width="0.0525%" height="15" fill="rgb(245,62,40)" fg:x="37983" fg:w="25"/><text x="80.0177%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (10 samples, 0.02%)</title><rect x="79.8202%" y="1253" width="0.0210%" height="15" fill="rgb(228,27,24)" fg:x="38008" fg:w="10"/><text x="80.0702%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="79.8244%" y="1237" width="0.0168%" height="15" fill="rgb(253,19,12)" fg:x="38010" fg:w="8"/><text x="80.0744%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="79.8244%" y="1221" width="0.0168%" height="15" fill="rgb(232,28,20)" fg:x="38010" fg:w="8"/><text x="80.0744%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="79.8307%" y="1205" width="0.0105%" height="15" fill="rgb(218,35,51)" fg:x="38013" fg:w="5"/><text x="80.0807%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (13 samples, 0.03%)</title><rect x="79.8202%" y="1285" width="0.0273%" height="15" fill="rgb(212,90,40)" fg:x="38008" fg:w="13"/><text x="80.0702%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (13 samples, 0.03%)</title><rect x="79.8202%" y="1269" width="0.0273%" height="15" fill="rgb(220,172,12)" fg:x="38008" fg:w="13"/><text x="80.0702%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="79.8706%" y="1253" width="0.0399%" height="15" fill="rgb(226,159,20)" fg:x="38032" fg:w="19"/><text x="80.1206%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (9 samples, 0.02%)</title><rect x="79.9105%" y="1221" width="0.0189%" height="15" fill="rgb(234,205,16)" fg:x="38051" fg:w="9"/><text x="80.1605%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="79.9126%" y="1205" width="0.0168%" height="15" fill="rgb(207,9,39)" fg:x="38052" fg:w="8"/><text x="80.1626%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="79.9126%" y="1189" width="0.0168%" height="15" fill="rgb(249,143,15)" fg:x="38052" fg:w="8"/><text x="80.1626%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="79.9147%" y="1173" width="0.0147%" height="15" fill="rgb(253,133,29)" fg:x="38053" fg:w="7"/><text x="80.1647%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (16 samples, 0.03%)</title><rect x="79.9105%" y="1237" width="0.0336%" height="15" fill="rgb(221,187,0)" fg:x="38051" fg:w="16"/><text x="80.1605%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="79.9294%" y="1221" width="0.0147%" height="15" fill="rgb(205,204,26)" fg:x="38060" fg:w="7"/><text x="80.1794%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="79.9294%" y="1205" width="0.0147%" height="15" fill="rgb(224,68,54)" fg:x="38060" fg:w="7"/><text x="80.1794%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (18 samples, 0.04%)</title><rect x="79.9105%" y="1253" width="0.0378%" height="15" fill="rgb(209,67,4)" fg:x="38051" fg:w="18"/><text x="80.1605%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (46 samples, 0.10%)</title><rect x="79.8538%" y="1269" width="0.0966%" height="15" fill="rgb(228,229,18)" fg:x="38024" fg:w="46"/><text x="80.1038%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="79.9630%" y="1237" width="0.0399%" height="15" fill="rgb(231,89,13)" fg:x="38076" fg:w="19"/><text x="80.2130%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (6 samples, 0.01%)</title><rect x="80.0029%" y="1205" width="0.0126%" height="15" fill="rgb(210,182,18)" fg:x="38095" fg:w="6"/><text x="80.2529%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="80.0029%" y="1189" width="0.0126%" height="15" fill="rgb(240,105,2)" fg:x="38095" fg:w="6"/><text x="80.2529%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="80.0050%" y="1173" width="0.0105%" height="15" fill="rgb(207,170,50)" fg:x="38096" fg:w="5"/><text x="80.2550%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="80.0029%" y="1221" width="0.0231%" height="15" fill="rgb(232,133,24)" fg:x="38095" fg:w="11"/><text x="80.2529%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="80.0155%" y="1205" width="0.0105%" height="15" fill="rgb(235,166,27)" fg:x="38101" fg:w="5"/><text x="80.2655%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="80.0155%" y="1189" width="0.0105%" height="15" fill="rgb(209,19,13)" fg:x="38101" fg:w="5"/><text x="80.2655%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="80.0155%" y="1173" width="0.0105%" height="15" fill="rgb(226,79,39)" fg:x="38101" fg:w="5"/><text x="80.2655%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (13 samples, 0.03%)</title><rect x="80.0029%" y="1237" width="0.0273%" height="15" fill="rgb(222,163,10)" fg:x="38095" fg:w="13"/><text x="80.2529%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (129 samples, 0.27%)</title><rect x="79.7614%" y="1301" width="0.2709%" height="15" fill="rgb(214,44,19)" fg:x="37980" fg:w="129"/><text x="80.0114%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (88 samples, 0.18%)</title><rect x="79.8475%" y="1285" width="0.1848%" height="15" fill="rgb(210,217,13)" fg:x="38021" fg:w="88"/><text x="80.0975%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (39 samples, 0.08%)</title><rect x="79.9504%" y="1269" width="0.0819%" height="15" fill="rgb(237,61,54)" fg:x="38070" fg:w="39"/><text x="80.2004%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (35 samples, 0.07%)</title><rect x="79.9588%" y="1253" width="0.0735%" height="15" fill="rgb(226,184,24)" fg:x="38074" fg:w="35"/><text x="80.2088%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="80.0344%" y="1285" width="0.0105%" height="15" fill="rgb(223,226,4)" fg:x="38110" fg:w="5"/><text x="80.2844%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (25 samples, 0.05%)</title><rect x="80.0512%" y="1269" width="0.0525%" height="15" fill="rgb(210,26,41)" fg:x="38118" fg:w="25"/><text x="80.3012%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="80.1079%" y="1221" width="0.0168%" height="15" fill="rgb(220,221,6)" fg:x="38145" fg:w="8"/><text x="80.3579%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="80.1079%" y="1205" width="0.0168%" height="15" fill="rgb(225,89,49)" fg:x="38145" fg:w="8"/><text x="80.3579%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="80.1142%" y="1189" width="0.0105%" height="15" fill="rgb(218,70,45)" fg:x="38148" fg:w="5"/><text x="80.3642%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (11 samples, 0.02%)</title><rect x="80.1037%" y="1237" width="0.0231%" height="15" fill="rgb(238,166,21)" fg:x="38143" fg:w="11"/><text x="80.3537%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (12 samples, 0.03%)</title><rect x="80.1037%" y="1269" width="0.0252%" height="15" fill="rgb(224,141,44)" fg:x="38143" fg:w="12"/><text x="80.3537%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (12 samples, 0.03%)</title><rect x="80.1037%" y="1253" width="0.0252%" height="15" fill="rgb(230,12,49)" fg:x="38143" fg:w="12"/><text x="80.3537%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (6 samples, 0.01%)</title><rect x="80.1310%" y="1253" width="0.0126%" height="15" fill="rgb(212,174,12)" fg:x="38156" fg:w="6"/><text x="80.3810%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (22 samples, 0.05%)</title><rect x="80.1478%" y="1237" width="0.0462%" height="15" fill="rgb(246,67,9)" fg:x="38164" fg:w="22"/><text x="80.3978%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (6 samples, 0.01%)</title><rect x="80.1961%" y="1205" width="0.0126%" height="15" fill="rgb(239,35,23)" fg:x="38187" fg:w="6"/><text x="80.4461%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="80.1961%" y="1189" width="0.0126%" height="15" fill="rgb(211,167,0)" fg:x="38187" fg:w="6"/><text x="80.4461%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="80.1961%" y="1173" width="0.0126%" height="15" fill="rgb(225,119,45)" fg:x="38187" fg:w="6"/><text x="80.4461%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="80.1940%" y="1221" width="0.0231%" height="15" fill="rgb(210,162,6)" fg:x="38186" fg:w="11"/><text x="80.4440%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (13 samples, 0.03%)</title><rect x="80.1940%" y="1237" width="0.0273%" height="15" fill="rgb(208,118,35)" fg:x="38186" fg:w="13"/><text x="80.4440%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (41 samples, 0.09%)</title><rect x="80.1436%" y="1253" width="0.0861%" height="15" fill="rgb(239,4,53)" fg:x="38162" fg:w="41"/><text x="80.3936%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="80.2403%" y="1221" width="0.0315%" height="15" fill="rgb(213,130,21)" fg:x="38208" fg:w="15"/><text x="80.4903%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (8 samples, 0.02%)</title><rect x="80.2718%" y="1205" width="0.0168%" height="15" fill="rgb(235,148,0)" fg:x="38223" fg:w="8"/><text x="80.5218%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (10 samples, 0.02%)</title><rect x="80.2718%" y="1221" width="0.0210%" height="15" fill="rgb(244,224,18)" fg:x="38223" fg:w="10"/><text x="80.5218%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (35 samples, 0.07%)</title><rect x="80.2297%" y="1253" width="0.0735%" height="15" fill="rgb(211,214,4)" fg:x="38203" fg:w="35"/><text x="80.4797%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (33 samples, 0.07%)</title><rect x="80.2340%" y="1237" width="0.0693%" height="15" fill="rgb(206,119,25)" fg:x="38205" fg:w="33"/><text x="80.4840%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="80.2928%" y="1221" width="0.0105%" height="15" fill="rgb(243,93,47)" fg:x="38233" fg:w="5"/><text x="80.5428%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="80.2928%" y="1205" width="0.0105%" height="15" fill="rgb(224,194,6)" fg:x="38233" fg:w="5"/><text x="80.5428%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="80.2928%" y="1189" width="0.0105%" height="15" fill="rgb(243,229,6)" fg:x="38233" fg:w="5"/><text x="80.5428%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="80.2928%" y="1173" width="0.0105%" height="15" fill="rgb(207,23,50)" fg:x="38233" fg:w="5"/><text x="80.5428%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.3033%" y="1189" width="0.0105%" height="15" fill="rgb(253,192,32)" fg:x="38238" fg:w="5"/><text x="80.5533%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.3033%" y="1173" width="0.0105%" height="15" fill="rgb(213,21,6)" fg:x="38238" fg:w="5"/><text x="80.5533%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="80.3138%" y="1189" width="0.0126%" height="15" fill="rgb(243,151,13)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.3138%" y="1173" width="0.0126%" height="15" fill="rgb(233,165,41)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.3138%" y="1157" width="0.0126%" height="15" fill="rgb(246,176,45)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="80.3138%" y="1141" width="0.0126%" height="15" fill="rgb(217,170,52)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="80.3138%" y="1125" width="0.0126%" height="15" fill="rgb(214,203,54)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.3138%" y="1109" width="0.0126%" height="15" fill="rgb(248,215,49)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.3138%" y="1093" width="0.0126%" height="15" fill="rgb(208,46,10)" fg:x="38243" fg:w="6"/><text x="80.5638%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (142 samples, 0.30%)</title><rect x="80.0323%" y="1301" width="0.2982%" height="15" fill="rgb(254,5,31)" fg:x="38109" fg:w="142"/><text x="80.2823%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (136 samples, 0.29%)</title><rect x="80.0449%" y="1285" width="0.2856%" height="15" fill="rgb(222,104,33)" fg:x="38115" fg:w="136"/><text x="80.2949%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (96 samples, 0.20%)</title><rect x="80.1289%" y="1269" width="0.2016%" height="15" fill="rgb(248,49,16)" fg:x="38155" fg:w="96"/><text x="80.3789%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="80.3033%" y="1253" width="0.0273%" height="15" fill="rgb(232,198,41)" fg:x="38238" fg:w="13"/><text x="80.5533%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="80.3033%" y="1237" width="0.0273%" height="15" fill="rgb(214,125,3)" fg:x="38238" fg:w="13"/><text x="80.5533%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="80.3033%" y="1221" width="0.0273%" height="15" fill="rgb(229,220,28)" fg:x="38238" fg:w="13"/><text x="80.5533%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="80.3033%" y="1205" width="0.0273%" height="15" fill="rgb(222,64,37)" fg:x="38238" fg:w="13"/><text x="80.5533%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.3390%" y="1173" width="0.0147%" height="15" fill="rgb(249,184,13)" fg:x="38255" fg:w="7"/><text x="80.5890%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.3390%" y="1157" width="0.0147%" height="15" fill="rgb(252,176,6)" fg:x="38255" fg:w="7"/><text x="80.5890%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="80.3390%" y="1205" width="0.0294%" height="15" fill="rgb(228,153,7)" fg:x="38255" fg:w="14"/><text x="80.5890%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="80.3390%" y="1189" width="0.0294%" height="15" fill="rgb(242,193,5)" fg:x="38255" fg:w="14"/><text x="80.5890%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="80.3537%" y="1173" width="0.0147%" height="15" fill="rgb(232,140,9)" fg:x="38262" fg:w="7"/><text x="80.6037%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.3537%" y="1157" width="0.0147%" height="15" fill="rgb(213,222,16)" fg:x="38262" fg:w="7"/><text x="80.6037%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.3537%" y="1141" width="0.0147%" height="15" fill="rgb(222,75,50)" fg:x="38262" fg:w="7"/><text x="80.6037%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.3747%" y="1157" width="0.0168%" height="15" fill="rgb(205,180,2)" fg:x="38272" fg:w="8"/><text x="80.6247%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="80.3747%" y="1141" width="0.0168%" height="15" fill="rgb(216,34,7)" fg:x="38272" fg:w="8"/><text x="80.6247%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="80.3684%" y="1205" width="0.0294%" height="15" fill="rgb(253,16,32)" fg:x="38269" fg:w="14"/><text x="80.6184%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="80.3705%" y="1189" width="0.0273%" height="15" fill="rgb(208,97,28)" fg:x="38270" fg:w="13"/><text x="80.6205%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="80.3747%" y="1173" width="0.0231%" height="15" fill="rgb(225,92,11)" fg:x="38272" fg:w="11"/><text x="80.6247%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="80.3348%" y="1237" width="0.0672%" height="15" fill="rgb(243,38,12)" fg:x="38253" fg:w="32"/><text x="80.5848%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="80.3390%" y="1221" width="0.0630%" height="15" fill="rgb(208,139,16)" fg:x="38255" fg:w="30"/><text x="80.5890%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="80.4020%" y="1237" width="0.0168%" height="15" fill="rgb(227,24,9)" fg:x="38285" fg:w="8"/><text x="80.6520%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.4020%" y="1221" width="0.0168%" height="15" fill="rgb(206,62,11)" fg:x="38285" fg:w="8"/><text x="80.6520%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="80.4020%" y="1205" width="0.0168%" height="15" fill="rgb(228,134,27)" fg:x="38285" fg:w="8"/><text x="80.6520%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="80.4083%" y="1189" width="0.0105%" height="15" fill="rgb(205,55,33)" fg:x="38288" fg:w="5"/><text x="80.6583%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="80.4083%" y="1173" width="0.0105%" height="15" fill="rgb(243,75,43)" fg:x="38288" fg:w="5"/><text x="80.6583%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.4083%" y="1157" width="0.0105%" height="15" fill="rgb(223,27,42)" fg:x="38288" fg:w="5"/><text x="80.6583%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.4314%" y="1109" width="0.0168%" height="15" fill="rgb(232,189,33)" fg:x="38299" fg:w="8"/><text x="80.6814%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.4335%" y="1093" width="0.0147%" height="15" fill="rgb(210,9,39)" fg:x="38300" fg:w="7"/><text x="80.6835%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="80.4377%" y="1077" width="0.0105%" height="15" fill="rgb(242,85,26)" fg:x="38302" fg:w="5"/><text x="80.6877%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.4377%" y="1061" width="0.0105%" height="15" fill="rgb(248,44,4)" fg:x="38302" fg:w="5"/><text x="80.6877%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.4377%" y="1045" width="0.0105%" height="15" fill="rgb(250,96,46)" fg:x="38302" fg:w="5"/><text x="80.6877%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (375 samples, 0.79%)</title><rect x="79.6627%" y="1349" width="0.7875%" height="15" fill="rgb(229,116,26)" fg:x="37933" fg:w="375"/><text x="79.9127%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (367 samples, 0.77%)</title><rect x="79.6795%" y="1333" width="0.7707%" height="15" fill="rgb(246,94,34)" fg:x="37941" fg:w="367"/><text x="79.9295%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (332 samples, 0.70%)</title><rect x="79.7530%" y="1317" width="0.6972%" height="15" fill="rgb(251,73,21)" fg:x="37976" fg:w="332"/><text x="80.0030%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (57 samples, 0.12%)</title><rect x="80.3306%" y="1301" width="0.1197%" height="15" fill="rgb(254,121,25)" fg:x="38251" fg:w="57"/><text x="80.5806%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (57 samples, 0.12%)</title><rect x="80.3306%" y="1285" width="0.1197%" height="15" fill="rgb(215,161,49)" fg:x="38251" fg:w="57"/><text x="80.5806%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (57 samples, 0.12%)</title><rect x="80.3306%" y="1269" width="0.1197%" height="15" fill="rgb(221,43,13)" fg:x="38251" fg:w="57"/><text x="80.5806%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (55 samples, 0.12%)</title><rect x="80.3348%" y="1253" width="0.1155%" height="15" fill="rgb(249,5,37)" fg:x="38253" fg:w="55"/><text x="80.5848%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (15 samples, 0.03%)</title><rect x="80.4188%" y="1237" width="0.0315%" height="15" fill="rgb(226,25,44)" fg:x="38293" fg:w="15"/><text x="80.6688%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (15 samples, 0.03%)</title><rect x="80.4188%" y="1221" width="0.0315%" height="15" fill="rgb(238,189,16)" fg:x="38293" fg:w="15"/><text x="80.6688%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="80.4209%" y="1205" width="0.0294%" height="15" fill="rgb(251,186,8)" fg:x="38294" fg:w="14"/><text x="80.6709%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="80.4230%" y="1189" width="0.0273%" height="15" fill="rgb(254,34,31)" fg:x="38295" fg:w="13"/><text x="80.6730%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="80.4314%" y="1173" width="0.0189%" height="15" fill="rgb(225,215,27)" fg:x="38299" fg:w="9"/><text x="80.6814%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="80.4314%" y="1157" width="0.0189%" height="15" fill="rgb(221,192,48)" fg:x="38299" fg:w="9"/><text x="80.6814%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="80.4314%" y="1141" width="0.0189%" height="15" fill="rgb(219,137,20)" fg:x="38299" fg:w="9"/><text x="80.6814%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="80.4314%" y="1125" width="0.0189%" height="15" fill="rgb(219,84,11)" fg:x="38299" fg:w="9"/><text x="80.6814%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.4734%" y="1221" width="0.0168%" height="15" fill="rgb(224,10,23)" fg:x="38319" fg:w="8"/><text x="80.7234%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.4797%" y="1205" width="0.0105%" height="15" fill="rgb(248,22,39)" fg:x="38322" fg:w="5"/><text x="80.7297%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.5028%" y="1173" width="0.0105%" height="15" fill="rgb(212,154,20)" fg:x="38333" fg:w="5"/><text x="80.7528%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="80.4608%" y="1253" width="0.0609%" height="15" fill="rgb(236,199,50)" fg:x="38313" fg:w="29"/><text x="80.7108%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (24 samples, 0.05%)</title><rect x="80.4713%" y="1237" width="0.0504%" height="15" fill="rgb(211,9,17)" fg:x="38318" fg:w="24"/><text x="80.7213%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="80.4902%" y="1221" width="0.0315%" height="15" fill="rgb(243,216,36)" fg:x="38327" fg:w="15"/><text x="80.7402%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="80.4923%" y="1205" width="0.0294%" height="15" fill="rgb(250,2,10)" fg:x="38328" fg:w="14"/><text x="80.7423%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="80.5028%" y="1189" width="0.0189%" height="15" fill="rgb(226,50,48)" fg:x="38333" fg:w="9"/><text x="80.7528%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="80.5238%" y="1205" width="0.0189%" height="15" fill="rgb(243,81,16)" fg:x="38343" fg:w="9"/><text x="80.7738%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.5280%" y="1189" width="0.0147%" height="15" fill="rgb(250,14,2)" fg:x="38345" fg:w="7"/><text x="80.7780%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="80.5427%" y="1205" width="0.0168%" height="15" fill="rgb(233,135,29)" fg:x="38352" fg:w="8"/><text x="80.7927%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.5448%" y="1189" width="0.0147%" height="15" fill="rgb(224,64,43)" fg:x="38353" fg:w="7"/><text x="80.7948%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.5490%" y="1173" width="0.0105%" height="15" fill="rgb(238,84,13)" fg:x="38355" fg:w="5"/><text x="80.7990%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.5742%" y="981" width="0.0147%" height="15" fill="rgb(253,48,26)" fg:x="38367" fg:w="7"/><text x="80.8242%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.5742%" y="965" width="0.0147%" height="15" fill="rgb(205,223,31)" fg:x="38367" fg:w="7"/><text x="80.8242%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="80.5595%" y="1141" width="0.0378%" height="15" fill="rgb(221,41,32)" fg:x="38360" fg:w="18"/><text x="80.8095%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="80.5616%" y="1125" width="0.0357%" height="15" fill="rgb(213,158,31)" fg:x="38361" fg:w="17"/><text x="80.8116%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="80.5742%" y="1109" width="0.0231%" height="15" fill="rgb(245,126,43)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="80.5742%" y="1093" width="0.0231%" height="15" fill="rgb(227,7,22)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="80.5742%" y="1077" width="0.0231%" height="15" fill="rgb(252,90,44)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="80.5742%" y="1061" width="0.0231%" height="15" fill="rgb(253,91,0)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="80.5742%" y="1045" width="0.0231%" height="15" fill="rgb(252,175,49)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="80.5742%" y="1029" width="0.0231%" height="15" fill="rgb(246,150,1)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="80.5742%" y="1013" width="0.0231%" height="15" fill="rgb(241,192,25)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="80.5742%" y="997" width="0.0231%" height="15" fill="rgb(239,187,11)" fg:x="38367" fg:w="11"/><text x="80.8242%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (37 samples, 0.08%)</title><rect x="80.5217%" y="1253" width="0.0777%" height="15" fill="rgb(218,202,51)" fg:x="38342" fg:w="37"/><text x="80.7717%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (37 samples, 0.08%)</title><rect x="80.5217%" y="1237" width="0.0777%" height="15" fill="rgb(225,176,8)" fg:x="38342" fg:w="37"/><text x="80.7717%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (36 samples, 0.08%)</title><rect x="80.5238%" y="1221" width="0.0756%" height="15" fill="rgb(219,122,41)" fg:x="38343" fg:w="36"/><text x="80.7738%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (19 samples, 0.04%)</title><rect x="80.5595%" y="1205" width="0.0399%" height="15" fill="rgb(248,140,20)" fg:x="38360" fg:w="19"/><text x="80.8095%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (19 samples, 0.04%)</title><rect x="80.5595%" y="1189" width="0.0399%" height="15" fill="rgb(245,41,37)" fg:x="38360" fg:w="19"/><text x="80.8095%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="80.5595%" y="1173" width="0.0399%" height="15" fill="rgb(235,82,39)" fg:x="38360" fg:w="19"/><text x="80.8095%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="80.5595%" y="1157" width="0.0399%" height="15" fill="rgb(230,108,42)" fg:x="38360" fg:w="19"/><text x="80.8095%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.5994%" y="1189" width="0.0105%" height="15" fill="rgb(215,150,50)" fg:x="38379" fg:w="5"/><text x="80.8494%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (73 samples, 0.15%)</title><rect x="80.4587%" y="1285" width="0.1533%" height="15" fill="rgb(233,212,5)" fg:x="38312" fg:w="73"/><text x="80.7087%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (72 samples, 0.15%)</title><rect x="80.4608%" y="1269" width="0.1512%" height="15" fill="rgb(245,80,22)" fg:x="38313" fg:w="72"/><text x="80.7108%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="80.5994%" y="1253" width="0.0126%" height="15" fill="rgb(238,129,16)" fg:x="38379" fg:w="6"/><text x="80.8494%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="80.5994%" y="1237" width="0.0126%" height="15" fill="rgb(240,19,0)" fg:x="38379" fg:w="6"/><text x="80.8494%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.5994%" y="1221" width="0.0126%" height="15" fill="rgb(232,42,35)" fg:x="38379" fg:w="6"/><text x="80.8494%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.5994%" y="1205" width="0.0126%" height="15" fill="rgb(223,130,24)" fg:x="38379" fg:w="6"/><text x="80.8494%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.6141%" y="1237" width="0.0105%" height="15" fill="rgb(237,16,22)" fg:x="38386" fg:w="5"/><text x="80.8641%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.6141%" y="1221" width="0.0105%" height="15" fill="rgb(248,192,20)" fg:x="38386" fg:w="5"/><text x="80.8641%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.6267%" y="1189" width="0.0126%" height="15" fill="rgb(233,167,2)" fg:x="38392" fg:w="6"/><text x="80.8767%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.6540%" y="1061" width="0.0168%" height="15" fill="rgb(252,71,44)" fg:x="38405" fg:w="8"/><text x="80.9040%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.6603%" y="1045" width="0.0105%" height="15" fill="rgb(238,37,47)" fg:x="38408" fg:w="5"/><text x="80.9103%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (23 samples, 0.05%)</title><rect x="80.6246%" y="1237" width="0.0483%" height="15" fill="rgb(214,202,54)" fg:x="38391" fg:w="23"/><text x="80.8746%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="80.6267%" y="1221" width="0.0462%" height="15" fill="rgb(254,165,40)" fg:x="38392" fg:w="22"/><text x="80.8767%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (22 samples, 0.05%)</title><rect x="80.6267%" y="1205" width="0.0462%" height="15" fill="rgb(246,173,38)" fg:x="38392" fg:w="22"/><text x="80.8767%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="80.6456%" y="1189" width="0.0273%" height="15" fill="rgb(215,3,27)" fg:x="38401" fg:w="13"/><text x="80.8956%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="80.6456%" y="1173" width="0.0273%" height="15" fill="rgb(239,169,51)" fg:x="38401" fg:w="13"/><text x="80.8956%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="80.6456%" y="1157" width="0.0273%" height="15" fill="rgb(212,5,25)" fg:x="38401" fg:w="13"/><text x="80.8956%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="80.6456%" y="1141" width="0.0273%" height="15" fill="rgb(243,45,17)" fg:x="38401" fg:w="13"/><text x="80.8956%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (10 samples, 0.02%)</title><rect x="80.6519%" y="1125" width="0.0210%" height="15" fill="rgb(242,97,9)" fg:x="38404" fg:w="10"/><text x="80.9019%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (10 samples, 0.02%)</title><rect x="80.6519%" y="1109" width="0.0210%" height="15" fill="rgb(228,71,31)" fg:x="38404" fg:w="10"/><text x="80.9019%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="80.6519%" y="1093" width="0.0210%" height="15" fill="rgb(252,184,16)" fg:x="38404" fg:w="10"/><text x="80.9019%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="80.6540%" y="1077" width="0.0189%" height="15" fill="rgb(236,169,46)" fg:x="38405" fg:w="9"/><text x="80.9040%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (32 samples, 0.07%)</title><rect x="80.6120%" y="1285" width="0.0672%" height="15" fill="rgb(207,17,47)" fg:x="38385" fg:w="32"/><text x="80.8620%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="80.6120%" y="1269" width="0.0672%" height="15" fill="rgb(206,201,28)" fg:x="38385" fg:w="32"/><text x="80.8620%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (31 samples, 0.07%)</title><rect x="80.6141%" y="1253" width="0.0651%" height="15" fill="rgb(224,184,23)" fg:x="38386" fg:w="31"/><text x="80.8641%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.6876%" y="1189" width="0.0105%" height="15" fill="rgb(208,139,48)" fg:x="38421" fg:w="5"/><text x="80.9376%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="80.6834%" y="1221" width="0.0315%" height="15" fill="rgb(208,130,10)" fg:x="38419" fg:w="15"/><text x="80.9334%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="80.6876%" y="1205" width="0.0273%" height="15" fill="rgb(211,213,45)" fg:x="38421" fg:w="13"/><text x="80.9376%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="80.7002%" y="1189" width="0.0147%" height="15" fill="rgb(235,100,30)" fg:x="38427" fg:w="7"/><text x="80.9502%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="80.7002%" y="1173" width="0.0147%" height="15" fill="rgb(206,144,31)" fg:x="38427" fg:w="7"/><text x="80.9502%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.7002%" y="1157" width="0.0147%" height="15" fill="rgb(224,200,26)" fg:x="38427" fg:w="7"/><text x="80.9502%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.7002%" y="1141" width="0.0147%" height="15" fill="rgb(247,104,53)" fg:x="38427" fg:w="7"/><text x="80.9502%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="80.7023%" y="1125" width="0.0126%" height="15" fill="rgb(220,14,17)" fg:x="38428" fg:w="6"/><text x="80.9523%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.7023%" y="1109" width="0.0126%" height="15" fill="rgb(230,140,40)" fg:x="38428" fg:w="6"/><text x="80.9523%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.7023%" y="1093" width="0.0126%" height="15" fill="rgb(229,2,41)" fg:x="38428" fg:w="6"/><text x="80.9523%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="80.7149%" y="1221" width="0.0168%" height="15" fill="rgb(232,89,16)" fg:x="38434" fg:w="8"/><text x="80.9649%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="80.7149%" y="1205" width="0.0168%" height="15" fill="rgb(247,59,52)" fg:x="38434" fg:w="8"/><text x="80.9649%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="80.7170%" y="1189" width="0.0147%" height="15" fill="rgb(226,110,21)" fg:x="38435" fg:w="7"/><text x="80.9670%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="80.7191%" y="1173" width="0.0126%" height="15" fill="rgb(224,176,43)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="80.7191%" y="1157" width="0.0126%" height="15" fill="rgb(221,73,6)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.7191%" y="1141" width="0.0126%" height="15" fill="rgb(232,78,19)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.7191%" y="1125" width="0.0126%" height="15" fill="rgb(233,112,48)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.7191%" y="1109" width="0.0126%" height="15" fill="rgb(243,131,47)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="80.7191%" y="1093" width="0.0126%" height="15" fill="rgb(226,51,1)" fg:x="38436" fg:w="6"/><text x="80.9691%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="80.7212%" y="1077" width="0.0105%" height="15" fill="rgb(247,58,7)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="80.7212%" y="1061" width="0.0105%" height="15" fill="rgb(209,7,32)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.7212%" y="1045" width="0.0105%" height="15" fill="rgb(209,39,41)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.7212%" y="1029" width="0.0105%" height="15" fill="rgb(226,182,46)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.7212%" y="1013" width="0.0105%" height="15" fill="rgb(230,219,10)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.7212%" y="997" width="0.0105%" height="15" fill="rgb(227,175,30)" fg:x="38437" fg:w="5"/><text x="80.9712%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (147 samples, 0.31%)</title><rect x="80.4503%" y="1333" width="0.3087%" height="15" fill="rgb(217,2,50)" fg:x="38308" fg:w="147"/><text x="80.7003%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (147 samples, 0.31%)</title><rect x="80.4503%" y="1317" width="0.3087%" height="15" fill="rgb(229,160,0)" fg:x="38308" fg:w="147"/><text x="80.7003%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (143 samples, 0.30%)</title><rect x="80.4587%" y="1301" width="0.3003%" height="15" fill="rgb(207,78,37)" fg:x="38312" fg:w="143"/><text x="80.7087%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (38 samples, 0.08%)</title><rect x="80.6792%" y="1285" width="0.0798%" height="15" fill="rgb(225,57,0)" fg:x="38417" fg:w="38"/><text x="80.9292%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (38 samples, 0.08%)</title><rect x="80.6792%" y="1269" width="0.0798%" height="15" fill="rgb(232,154,2)" fg:x="38417" fg:w="38"/><text x="80.9292%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (38 samples, 0.08%)</title><rect x="80.6792%" y="1253" width="0.0798%" height="15" fill="rgb(241,212,25)" fg:x="38417" fg:w="38"/><text x="80.9292%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (36 samples, 0.08%)</title><rect x="80.6834%" y="1237" width="0.0756%" height="15" fill="rgb(226,69,20)" fg:x="38419" fg:w="36"/><text x="80.9334%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="80.7317%" y="1221" width="0.0273%" height="15" fill="rgb(247,184,54)" fg:x="38442" fg:w="13"/><text x="80.9817%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="80.7317%" y="1205" width="0.0273%" height="15" fill="rgb(210,145,0)" fg:x="38442" fg:w="13"/><text x="80.9817%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="80.7317%" y="1189" width="0.0273%" height="15" fill="rgb(253,82,12)" fg:x="38442" fg:w="13"/><text x="80.9817%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="80.7338%" y="1173" width="0.0252%" height="15" fill="rgb(245,42,11)" fg:x="38443" fg:w="12"/><text x="80.9838%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="80.7485%" y="1157" width="0.0105%" height="15" fill="rgb(219,147,32)" fg:x="38450" fg:w="5"/><text x="80.9985%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="80.7485%" y="1141" width="0.0105%" height="15" fill="rgb(246,12,7)" fg:x="38450" fg:w="5"/><text x="80.9985%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.7485%" y="1125" width="0.0105%" height="15" fill="rgb(243,50,9)" fg:x="38450" fg:w="5"/><text x="80.9985%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (1,005 samples, 2.11%)</title><rect x="78.6505%" y="1397" width="2.1106%" height="15" fill="rgb(219,149,6)" fg:x="37451" fg:w="1005"/><text x="78.9005%" y="1407.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (998 samples, 2.10%)</title><rect x="78.6652%" y="1381" width="2.0959%" height="15" fill="rgb(241,51,42)" fg:x="37458" fg:w="998"/><text x="78.9152%" y="1391.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (945 samples, 1.98%)</title><rect x="78.7765%" y="1365" width="1.9846%" height="15" fill="rgb(226,128,27)" fg:x="37511" fg:w="945"/><text x="79.0265%" y="1375.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (148 samples, 0.31%)</title><rect x="80.4503%" y="1349" width="0.3108%" height="15" fill="rgb(244,144,4)" fg:x="38308" fg:w="148"/><text x="80.7003%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="80.7737%" y="1349" width="0.0189%" height="15" fill="rgb(221,4,13)" fg:x="38462" fg:w="9"/><text x="81.0237%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="80.7968%" y="1317" width="0.0126%" height="15" fill="rgb(208,170,28)" fg:x="38473" fg:w="6"/><text x="81.0468%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="80.8136%" y="1285" width="0.0126%" height="15" fill="rgb(226,131,13)" fg:x="38481" fg:w="6"/><text x="81.0636%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (10 samples, 0.02%)</title><rect x="80.8493%" y="1141" width="0.0210%" height="15" fill="rgb(215,72,41)" fg:x="38498" fg:w="10"/><text x="81.0993%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (6 samples, 0.01%)</title><rect x="80.8577%" y="1125" width="0.0126%" height="15" fill="rgb(243,108,20)" fg:x="38502" fg:w="6"/><text x="81.1077%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="80.8472%" y="1173" width="0.0294%" height="15" fill="rgb(230,189,17)" fg:x="38497" fg:w="14"/><text x="81.0972%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (14 samples, 0.03%)</title><rect x="80.8472%" y="1157" width="0.0294%" height="15" fill="rgb(220,50,17)" fg:x="38497" fg:w="14"/><text x="81.0972%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="80.8430%" y="1205" width="0.0378%" height="15" fill="rgb(248,152,48)" fg:x="38495" fg:w="18"/><text x="81.0930%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="80.8472%" y="1189" width="0.0336%" height="15" fill="rgb(244,91,11)" fg:x="38497" fg:w="16"/><text x="81.0972%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="80.8808%" y="1205" width="0.0147%" height="15" fill="rgb(220,157,5)" fg:x="38513" fg:w="7"/><text x="81.1308%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.8808%" y="1189" width="0.0147%" height="15" fill="rgb(253,137,8)" fg:x="38513" fg:w="7"/><text x="81.1308%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.8850%" y="1173" width="0.0105%" height="15" fill="rgb(217,137,51)" fg:x="38515" fg:w="5"/><text x="81.1350%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="80.8346%" y="1237" width="0.0714%" height="15" fill="rgb(218,209,53)" fg:x="38491" fg:w="34"/><text x="81.0846%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (31 samples, 0.07%)</title><rect x="80.8409%" y="1221" width="0.0651%" height="15" fill="rgb(249,137,25)" fg:x="38494" fg:w="31"/><text x="81.0909%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="80.8955%" y="1205" width="0.0105%" height="15" fill="rgb(239,155,26)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="80.8955%" y="1189" width="0.0105%" height="15" fill="rgb(227,85,46)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.8955%" y="1173" width="0.0105%" height="15" fill="rgb(251,107,43)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.8955%" y="1157" width="0.0105%" height="15" fill="rgb(234,170,33)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="80.8955%" y="1141" width="0.0105%" height="15" fill="rgb(206,29,35)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.8955%" y="1125" width="0.0105%" height="15" fill="rgb(227,138,25)" fg:x="38520" fg:w="5"/><text x="81.1455%" y="1135.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="80.9123%" y="1205" width="0.0147%" height="15" fill="rgb(249,131,35)" fg:x="38528" fg:w="7"/><text x="81.1623%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="80.9270%" y="1189" width="0.0147%" height="15" fill="rgb(239,6,40)" fg:x="38535" fg:w="7"/><text x="81.1770%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="80.9312%" y="1173" width="0.0105%" height="15" fill="rgb(246,136,47)" fg:x="38537" fg:w="5"/><text x="81.1812%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (20 samples, 0.04%)</title><rect x="80.9060%" y="1237" width="0.0420%" height="15" fill="rgb(253,58,26)" fg:x="38525" fg:w="20"/><text x="81.1560%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="80.9102%" y="1221" width="0.0378%" height="15" fill="rgb(237,141,10)" fg:x="38527" fg:w="18"/><text x="81.1602%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="80.9270%" y="1205" width="0.0210%" height="15" fill="rgb(234,156,12)" fg:x="38535" fg:w="10"/><text x="81.1770%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (58 samples, 0.12%)</title><rect x="80.8283%" y="1269" width="0.1218%" height="15" fill="rgb(243,224,36)" fg:x="38488" fg:w="58"/><text x="81.0783%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (55 samples, 0.12%)</title><rect x="80.8346%" y="1253" width="0.1155%" height="15" fill="rgb(205,229,51)" fg:x="38491" fg:w="55"/><text x="81.0846%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="80.9627%" y="1221" width="0.0336%" height="15" fill="rgb(223,189,4)" fg:x="38552" fg:w="16"/><text x="81.2127%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="80.9732%" y="1205" width="0.0231%" height="15" fill="rgb(249,167,54)" fg:x="38557" fg:w="11"/><text x="81.2232%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="80.9837%" y="1189" width="0.0126%" height="15" fill="rgb(218,34,28)" fg:x="38562" fg:w="6"/><text x="81.2337%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="80.9837%" y="1173" width="0.0126%" height="15" fill="rgb(232,109,42)" fg:x="38562" fg:w="6"/><text x="81.2337%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="80.9963%" y="1221" width="0.0210%" height="15" fill="rgb(248,214,46)" fg:x="38568" fg:w="10"/><text x="81.2463%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="80.9984%" y="1205" width="0.0189%" height="15" fill="rgb(244,216,40)" fg:x="38569" fg:w="9"/><text x="81.2484%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="81.0005%" y="1189" width="0.0168%" height="15" fill="rgb(231,226,31)" fg:x="38570" fg:w="8"/><text x="81.2505%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (39 samples, 0.08%)</title><rect x="80.9501%" y="1269" width="0.0819%" height="15" fill="rgb(238,38,43)" fg:x="38546" fg:w="39"/><text x="81.2001%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (39 samples, 0.08%)</title><rect x="80.9501%" y="1253" width="0.0819%" height="15" fill="rgb(208,88,43)" fg:x="38546" fg:w="39"/><text x="81.2001%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (34 samples, 0.07%)</title><rect x="80.9606%" y="1237" width="0.0714%" height="15" fill="rgb(205,136,37)" fg:x="38551" fg:w="34"/><text x="81.2106%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="81.0173%" y="1221" width="0.0147%" height="15" fill="rgb(237,34,14)" fg:x="38578" fg:w="7"/><text x="81.2673%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="81.0173%" y="1205" width="0.0147%" height="15" fill="rgb(236,193,44)" fg:x="38578" fg:w="7"/><text x="81.2673%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.0173%" y="1189" width="0.0147%" height="15" fill="rgb(231,48,10)" fg:x="38578" fg:w="7"/><text x="81.2673%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="81.0173%" y="1173" width="0.0147%" height="15" fill="rgb(213,141,34)" fg:x="38578" fg:w="7"/><text x="81.2673%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="81.0194%" y="1157" width="0.0126%" height="15" fill="rgb(249,130,34)" fg:x="38579" fg:w="6"/><text x="81.2694%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="81.0194%" y="1141" width="0.0126%" height="15" fill="rgb(219,42,41)" fg:x="38579" fg:w="6"/><text x="81.2694%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.0194%" y="1125" width="0.0126%" height="15" fill="rgb(224,100,54)" fg:x="38579" fg:w="6"/><text x="81.2694%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="81.0194%" y="1109" width="0.0126%" height="15" fill="rgb(229,200,27)" fg:x="38579" fg:w="6"/><text x="81.2694%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.0341%" y="1141" width="0.0126%" height="15" fill="rgb(217,118,10)" fg:x="38586" fg:w="6"/><text x="81.2841%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="1125" width="0.0105%" height="15" fill="rgb(206,22,3)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.0362%" y="1109" width="0.0105%" height="15" fill="rgb(232,163,46)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.0362%" y="1093" width="0.0105%" height="15" fill="rgb(206,95,13)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="1077" width="0.0105%" height="15" fill="rgb(253,154,18)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="1061" width="0.0105%" height="15" fill="rgb(219,32,23)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="1045" width="0.0105%" height="15" fill="rgb(230,191,45)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="1029" width="0.0105%" height="15" fill="rgb(229,64,36)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.0362%" y="1013" width="0.0105%" height="15" fill="rgb(205,129,25)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.0362%" y="997" width="0.0105%" height="15" fill="rgb(254,112,7)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="981" width="0.0105%" height="15" fill="rgb(226,53,48)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="965" width="0.0105%" height="15" fill="rgb(214,153,38)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="949" width="0.0105%" height="15" fill="rgb(243,101,7)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="933" width="0.0105%" height="15" fill="rgb(240,140,22)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="917" width="0.0105%" height="15" fill="rgb(235,114,2)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="901" width="0.0105%" height="15" fill="rgb(242,59,12)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.0362%" y="885" width="0.0105%" height="15" fill="rgb(252,134,9)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0362%" y="869" width="0.0105%" height="15" fill="rgb(236,4,44)" fg:x="38587" fg:w="5"/><text x="81.2862%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="81.0320%" y="1205" width="0.0168%" height="15" fill="rgb(254,172,41)" fg:x="38585" fg:w="8"/><text x="81.2820%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="81.0341%" y="1189" width="0.0147%" height="15" fill="rgb(244,63,20)" fg:x="38586" fg:w="7"/><text x="81.2841%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.0341%" y="1173" width="0.0147%" height="15" fill="rgb(250,73,31)" fg:x="38586" fg:w="7"/><text x="81.2841%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="81.0341%" y="1157" width="0.0147%" height="15" fill="rgb(241,38,36)" fg:x="38586" fg:w="7"/><text x="81.2841%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (114 samples, 0.24%)</title><rect x="80.8115%" y="1301" width="0.2394%" height="15" fill="rgb(245,211,2)" fg:x="38480" fg:w="114"/><text x="81.0615%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (107 samples, 0.22%)</title><rect x="80.8262%" y="1285" width="0.2247%" height="15" fill="rgb(206,120,28)" fg:x="38487" fg:w="107"/><text x="81.0762%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="81.0320%" y="1269" width="0.0189%" height="15" fill="rgb(211,59,34)" fg:x="38585" fg:w="9"/><text x="81.2820%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="81.0320%" y="1253" width="0.0189%" height="15" fill="rgb(233,168,5)" fg:x="38585" fg:w="9"/><text x="81.2820%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="81.0320%" y="1237" width="0.0189%" height="15" fill="rgb(234,33,13)" fg:x="38585" fg:w="9"/><text x="81.2820%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="81.0320%" y="1221" width="0.0189%" height="15" fill="rgb(231,150,26)" fg:x="38585" fg:w="9"/><text x="81.2820%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="81.0614%" y="1269" width="0.0126%" height="15" fill="rgb(217,191,4)" fg:x="38599" fg:w="6"/><text x="81.3114%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="81.0803%" y="1221" width="0.0168%" height="15" fill="rgb(246,198,38)" fg:x="38608" fg:w="8"/><text x="81.3303%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.0866%" y="1205" width="0.0105%" height="15" fill="rgb(245,64,37)" fg:x="38611" fg:w="5"/><text x="81.3366%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="81.0740%" y="1253" width="0.0399%" height="15" fill="rgb(250,30,36)" fg:x="38605" fg:w="19"/><text x="81.3240%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="81.0803%" y="1237" width="0.0336%" height="15" fill="rgb(217,86,53)" fg:x="38608" fg:w="16"/><text x="81.3303%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="81.0971%" y="1221" width="0.0168%" height="15" fill="rgb(228,157,16)" fg:x="38616" fg:w="8"/><text x="81.3471%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="81.0971%" y="1205" width="0.0168%" height="15" fill="rgb(217,59,31)" fg:x="38616" fg:w="8"/><text x="81.3471%" y="1215.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="81.1139%" y="1189" width="0.0105%" height="15" fill="rgb(237,138,41)" fg:x="38624" fg:w="5"/><text x="81.3639%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="81.1139%" y="1205" width="0.0168%" height="15" fill="rgb(227,91,49)" fg:x="38624" fg:w="8"/><text x="81.3639%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="81.1139%" y="1253" width="0.0294%" height="15" fill="rgb(247,21,44)" fg:x="38624" fg:w="14"/><text x="81.3639%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="81.1139%" y="1237" width="0.0294%" height="15" fill="rgb(219,210,51)" fg:x="38624" fg:w="14"/><text x="81.3639%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="81.1139%" y="1221" width="0.0294%" height="15" fill="rgb(209,140,6)" fg:x="38624" fg:w="14"/><text x="81.3639%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (49 samples, 0.10%)</title><rect x="81.0509%" y="1301" width="0.1029%" height="15" fill="rgb(221,188,24)" fg:x="38594" fg:w="49"/><text x="81.3009%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (47 samples, 0.10%)</title><rect x="81.0551%" y="1285" width="0.0987%" height="15" fill="rgb(232,154,20)" fg:x="38596" fg:w="47"/><text x="81.3051%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="81.0740%" y="1269" width="0.0798%" height="15" fill="rgb(244,137,50)" fg:x="38605" fg:w="38"/><text x="81.3240%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.1433%" y="1253" width="0.0105%" height="15" fill="rgb(225,185,43)" fg:x="38638" fg:w="5"/><text x="81.3933%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.1433%" y="1237" width="0.0105%" height="15" fill="rgb(213,205,38)" fg:x="38638" fg:w="5"/><text x="81.3933%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.1433%" y="1221" width="0.0105%" height="15" fill="rgb(236,73,12)" fg:x="38638" fg:w="5"/><text x="81.3933%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.1433%" y="1205" width="0.0105%" height="15" fill="rgb(235,219,13)" fg:x="38638" fg:w="5"/><text x="81.3933%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.1559%" y="1205" width="0.0147%" height="15" fill="rgb(218,59,36)" fg:x="38644" fg:w="7"/><text x="81.4059%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="81.1538%" y="1237" width="0.0189%" height="15" fill="rgb(205,110,39)" fg:x="38643" fg:w="9"/><text x="81.4038%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="81.1559%" y="1221" width="0.0168%" height="15" fill="rgb(218,206,42)" fg:x="38644" fg:w="8"/><text x="81.4059%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (185 samples, 0.39%)</title><rect x="80.7968%" y="1333" width="0.3885%" height="15" fill="rgb(248,125,24)" fg:x="38473" fg:w="185"/><text x="81.0468%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (178 samples, 0.37%)</title><rect x="80.8115%" y="1317" width="0.3738%" height="15" fill="rgb(242,28,27)" fg:x="38480" fg:w="178"/><text x="81.0615%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (15 samples, 0.03%)</title><rect x="81.1538%" y="1301" width="0.0315%" height="15" fill="rgb(216,228,15)" fg:x="38643" fg:w="15"/><text x="81.4038%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (15 samples, 0.03%)</title><rect x="81.1538%" y="1285" width="0.0315%" height="15" fill="rgb(235,116,46)" fg:x="38643" fg:w="15"/><text x="81.4038%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="81.1538%" y="1269" width="0.0315%" height="15" fill="rgb(224,18,32)" fg:x="38643" fg:w="15"/><text x="81.4038%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="81.1538%" y="1253" width="0.0315%" height="15" fill="rgb(252,5,12)" fg:x="38643" fg:w="15"/><text x="81.4038%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.1748%" y="1237" width="0.0105%" height="15" fill="rgb(251,36,5)" fg:x="38653" fg:w="5"/><text x="81.4248%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="81.1958%" y="1269" width="0.0105%" height="15" fill="rgb(217,53,14)" fg:x="38663" fg:w="5"/><text x="81.4458%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="81.2084%" y="1253" width="0.0189%" height="15" fill="rgb(215,86,45)" fg:x="38669" fg:w="9"/><text x="81.4584%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.2168%" y="1237" width="0.0105%" height="15" fill="rgb(242,169,11)" fg:x="38673" fg:w="5"/><text x="81.4668%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="81.1958%" y="1285" width="0.0420%" height="15" fill="rgb(211,213,45)" fg:x="38663" fg:w="20"/><text x="81.4458%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="81.2084%" y="1269" width="0.0294%" height="15" fill="rgb(205,88,11)" fg:x="38669" fg:w="14"/><text x="81.4584%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="81.2273%" y="1253" width="0.0105%" height="15" fill="rgb(252,69,26)" fg:x="38678" fg:w="5"/><text x="81.4773%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="81.2378%" y="1285" width="0.0210%" height="15" fill="rgb(246,123,37)" fg:x="38683" fg:w="10"/><text x="81.4878%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="81.2378%" y="1269" width="0.0210%" height="15" fill="rgb(212,205,5)" fg:x="38683" fg:w="10"/><text x="81.4878%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="81.2399%" y="1253" width="0.0189%" height="15" fill="rgb(253,148,0)" fg:x="38684" fg:w="9"/><text x="81.4899%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.2483%" y="1237" width="0.0105%" height="15" fill="rgb(239,22,4)" fg:x="38688" fg:w="5"/><text x="81.4983%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.2483%" y="1221" width="0.0105%" height="15" fill="rgb(226,26,53)" fg:x="38688" fg:w="5"/><text x="81.4983%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.2483%" y="1205" width="0.0105%" height="15" fill="rgb(225,229,45)" fg:x="38688" fg:w="5"/><text x="81.4983%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.2483%" y="1189" width="0.0105%" height="15" fill="rgb(220,60,37)" fg:x="38688" fg:w="5"/><text x="81.4983%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.2609%" y="1157" width="0.0126%" height="15" fill="rgb(217,180,35)" fg:x="38694" fg:w="6"/><text x="81.5109%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.2630%" y="1141" width="0.0105%" height="15" fill="rgb(229,7,53)" fg:x="38695" fg:w="5"/><text x="81.5130%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="81.2609%" y="1189" width="0.0210%" height="15" fill="rgb(254,137,3)" fg:x="38694" fg:w="10"/><text x="81.5109%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="81.2609%" y="1173" width="0.0210%" height="15" fill="rgb(215,140,41)" fg:x="38694" fg:w="10"/><text x="81.5109%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="81.2819%" y="1189" width="0.0147%" height="15" fill="rgb(250,80,15)" fg:x="38704" fg:w="7"/><text x="81.5319%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.2819%" y="1173" width="0.0147%" height="15" fill="rgb(252,191,6)" fg:x="38704" fg:w="7"/><text x="81.5319%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="81.2819%" y="1157" width="0.0147%" height="15" fill="rgb(246,217,18)" fg:x="38704" fg:w="7"/><text x="81.5319%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="81.2609%" y="1221" width="0.0378%" height="15" fill="rgb(223,93,7)" fg:x="38694" fg:w="18"/><text x="81.5109%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="81.2609%" y="1205" width="0.0378%" height="15" fill="rgb(225,55,52)" fg:x="38694" fg:w="18"/><text x="81.5109%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="81.3071%" y="1125" width="0.0189%" height="15" fill="rgb(240,31,24)" fg:x="38716" fg:w="9"/><text x="81.5571%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="81.3071%" y="1109" width="0.0189%" height="15" fill="rgb(205,56,52)" fg:x="38716" fg:w="9"/><text x="81.5571%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="81.3050%" y="1157" width="0.0336%" height="15" fill="rgb(246,146,12)" fg:x="38715" fg:w="16"/><text x="81.5550%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="81.3071%" y="1141" width="0.0315%" height="15" fill="rgb(239,84,36)" fg:x="38716" fg:w="15"/><text x="81.5571%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="81.3260%" y="1125" width="0.0126%" height="15" fill="rgb(207,41,40)" fg:x="38725" fg:w="6"/><text x="81.5760%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.3260%" y="1109" width="0.0126%" height="15" fill="rgb(241,179,25)" fg:x="38725" fg:w="6"/><text x="81.5760%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="81.3260%" y="1093" width="0.0126%" height="15" fill="rgb(210,0,34)" fg:x="38725" fg:w="6"/><text x="81.5760%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.3281%" y="1077" width="0.0105%" height="15" fill="rgb(225,217,29)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.3281%" y="1061" width="0.0105%" height="15" fill="rgb(216,191,38)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.3281%" y="1045" width="0.0105%" height="15" fill="rgb(232,140,52)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.3281%" y="1029" width="0.0105%" height="15" fill="rgb(223,158,51)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.3281%" y="1013" width="0.0105%" height="15" fill="rgb(235,29,51)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.3281%" y="997" width="0.0105%" height="15" fill="rgb(215,181,18)" fg:x="38726" fg:w="5"/><text x="81.5781%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (75 samples, 0.16%)</title><rect x="81.1853%" y="1333" width="0.1575%" height="15" fill="rgb(227,125,34)" fg:x="38658" fg:w="75"/><text x="81.4353%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (75 samples, 0.16%)</title><rect x="81.1853%" y="1317" width="0.1575%" height="15" fill="rgb(230,197,49)" fg:x="38658" fg:w="75"/><text x="81.4353%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (71 samples, 0.15%)</title><rect x="81.1937%" y="1301" width="0.1491%" height="15" fill="rgb(239,141,16)" fg:x="38662" fg:w="71"/><text x="81.4437%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (40 samples, 0.08%)</title><rect x="81.2588%" y="1285" width="0.0840%" height="15" fill="rgb(225,105,43)" fg:x="38693" fg:w="40"/><text x="81.5088%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (40 samples, 0.08%)</title><rect x="81.2588%" y="1269" width="0.0840%" height="15" fill="rgb(214,131,14)" fg:x="38693" fg:w="40"/><text x="81.5088%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (40 samples, 0.08%)</title><rect x="81.2588%" y="1253" width="0.0840%" height="15" fill="rgb(229,177,11)" fg:x="38693" fg:w="40"/><text x="81.5088%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (39 samples, 0.08%)</title><rect x="81.2609%" y="1237" width="0.0819%" height="15" fill="rgb(231,180,14)" fg:x="38694" fg:w="39"/><text x="81.5109%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (19 samples, 0.04%)</title><rect x="81.3029%" y="1221" width="0.0399%" height="15" fill="rgb(232,88,2)" fg:x="38714" fg:w="19"/><text x="81.5529%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (19 samples, 0.04%)</title><rect x="81.3029%" y="1205" width="0.0399%" height="15" fill="rgb(205,220,8)" fg:x="38714" fg:w="19"/><text x="81.5529%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="81.3029%" y="1189" width="0.0399%" height="15" fill="rgb(225,23,53)" fg:x="38714" fg:w="19"/><text x="81.5529%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="81.3050%" y="1173" width="0.0378%" height="15" fill="rgb(213,62,29)" fg:x="38715" fg:w="18"/><text x="81.5550%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.3680%" y="1173" width="0.0147%" height="15" fill="rgb(227,75,7)" fg:x="38745" fg:w="7"/><text x="81.6180%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="81.3680%" y="1157" width="0.0147%" height="15" fill="rgb(207,105,14)" fg:x="38745" fg:w="7"/><text x="81.6180%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="81.3680%" y="1205" width="0.0252%" height="15" fill="rgb(245,62,29)" fg:x="38745" fg:w="12"/><text x="81.6180%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="81.3680%" y="1189" width="0.0252%" height="15" fill="rgb(236,202,4)" fg:x="38745" fg:w="12"/><text x="81.6180%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="81.3827%" y="1173" width="0.0105%" height="15" fill="rgb(250,67,1)" fg:x="38752" fg:w="5"/><text x="81.6327%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.3827%" y="1157" width="0.0105%" height="15" fill="rgb(253,115,44)" fg:x="38752" fg:w="5"/><text x="81.6327%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="81.3932%" y="1205" width="0.0168%" height="15" fill="rgb(251,139,18)" fg:x="38757" fg:w="8"/><text x="81.6432%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="81.3932%" y="1189" width="0.0168%" height="15" fill="rgb(218,22,32)" fg:x="38757" fg:w="8"/><text x="81.6432%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="81.3932%" y="1173" width="0.0168%" height="15" fill="rgb(243,53,5)" fg:x="38757" fg:w="8"/><text x="81.6432%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="81.3617%" y="1237" width="0.0504%" height="15" fill="rgb(227,56,16)" fg:x="38742" fg:w="24"/><text x="81.6117%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="81.3680%" y="1221" width="0.0441%" height="15" fill="rgb(245,53,0)" fg:x="38745" fg:w="21"/><text x="81.6180%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.4142%" y="1189" width="0.0105%" height="15" fill="rgb(216,170,35)" fg:x="38767" fg:w="5"/><text x="81.6642%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.4142%" y="1173" width="0.0105%" height="15" fill="rgb(211,200,8)" fg:x="38767" fg:w="5"/><text x="81.6642%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="81.4247%" y="1189" width="0.0126%" height="15" fill="rgb(228,204,44)" fg:x="38772" fg:w="6"/><text x="81.6747%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.4247%" y="1173" width="0.0126%" height="15" fill="rgb(214,121,17)" fg:x="38772" fg:w="6"/><text x="81.6747%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="81.4247%" y="1157" width="0.0126%" height="15" fill="rgb(233,64,38)" fg:x="38772" fg:w="6"/><text x="81.6747%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="81.4121%" y="1237" width="0.0336%" height="15" fill="rgb(253,54,19)" fg:x="38766" fg:w="16"/><text x="81.6621%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="81.4121%" y="1221" width="0.0336%" height="15" fill="rgb(253,94,18)" fg:x="38766" fg:w="16"/><text x="81.6621%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="81.4142%" y="1205" width="0.0315%" height="15" fill="rgb(227,57,52)" fg:x="38767" fg:w="15"/><text x="81.6642%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (51 samples, 0.11%)</title><rect x="81.3533%" y="1269" width="0.1071%" height="15" fill="rgb(230,228,50)" fg:x="38738" fg:w="51"/><text x="81.6033%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (48 samples, 0.10%)</title><rect x="81.3596%" y="1253" width="0.1008%" height="15" fill="rgb(217,205,27)" fg:x="38741" fg:w="48"/><text x="81.6096%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="81.4457%" y="1237" width="0.0147%" height="15" fill="rgb(252,71,50)" fg:x="38782" fg:w="7"/><text x="81.6957%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="81.4457%" y="1221" width="0.0147%" height="15" fill="rgb(209,86,4)" fg:x="38782" fg:w="7"/><text x="81.6957%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.4457%" y="1205" width="0.0147%" height="15" fill="rgb(229,94,0)" fg:x="38782" fg:w="7"/><text x="81.6957%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="81.4604%" y="1269" width="0.0147%" height="15" fill="rgb(252,223,21)" fg:x="38789" fg:w="7"/><text x="81.7104%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="81.4604%" y="1253" width="0.0147%" height="15" fill="rgb(230,210,4)" fg:x="38789" fg:w="7"/><text x="81.7104%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.4814%" y="1109" width="0.0105%" height="15" fill="rgb(240,149,38)" fg:x="38799" fg:w="5"/><text x="81.7314%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.4814%" y="1141" width="0.0126%" height="15" fill="rgb(254,105,20)" fg:x="38799" fg:w="6"/><text x="81.7314%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="81.4814%" y="1125" width="0.0126%" height="15" fill="rgb(253,87,46)" fg:x="38799" fg:w="6"/><text x="81.7314%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="81.4814%" y="1173" width="0.0189%" height="15" fill="rgb(253,116,33)" fg:x="38799" fg:w="9"/><text x="81.7314%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="81.4814%" y="1157" width="0.0189%" height="15" fill="rgb(229,198,5)" fg:x="38799" fg:w="9"/><text x="81.7314%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="81.4772%" y="1205" width="0.0294%" height="15" fill="rgb(242,38,37)" fg:x="38797" fg:w="14"/><text x="81.7272%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="81.4814%" y="1189" width="0.0252%" height="15" fill="rgb(242,69,53)" fg:x="38799" fg:w="12"/><text x="81.7314%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (23 samples, 0.05%)</title><rect x="81.4751%" y="1253" width="0.0483%" height="15" fill="rgb(249,80,16)" fg:x="38796" fg:w="23"/><text x="81.7251%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (23 samples, 0.05%)</title><rect x="81.4751%" y="1237" width="0.0483%" height="15" fill="rgb(206,128,11)" fg:x="38796" fg:w="23"/><text x="81.7251%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (22 samples, 0.05%)</title><rect x="81.4772%" y="1221" width="0.0462%" height="15" fill="rgb(212,35,20)" fg:x="38797" fg:w="22"/><text x="81.7272%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="81.5108%" y="1205" width="0.0126%" height="15" fill="rgb(236,79,13)" fg:x="38813" fg:w="6"/><text x="81.7608%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="81.5108%" y="1189" width="0.0126%" height="15" fill="rgb(233,123,3)" fg:x="38813" fg:w="6"/><text x="81.7608%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="81.5108%" y="1173" width="0.0126%" height="15" fill="rgb(214,93,52)" fg:x="38813" fg:w="6"/><text x="81.7608%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="81.5108%" y="1157" width="0.0126%" height="15" fill="rgb(251,37,40)" fg:x="38813" fg:w="6"/><text x="81.7608%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="81.5129%" y="1141" width="0.0105%" height="15" fill="rgb(227,80,54)" fg:x="38814" fg:w="5"/><text x="81.7629%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="81.5129%" y="1125" width="0.0105%" height="15" fill="rgb(254,48,11)" fg:x="38814" fg:w="5"/><text x="81.7629%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="81.5129%" y="1109" width="0.0105%" height="15" fill="rgb(235,193,26)" fg:x="38814" fg:w="5"/><text x="81.7629%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="81.5129%" y="1093" width="0.0105%" height="15" fill="rgb(229,99,21)" fg:x="38814" fg:w="5"/><text x="81.7629%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (3,267 samples, 6.86%)</title><rect x="74.6645%" y="1429" width="6.8610%" height="15" fill="rgb(211,140,41)" fg:x="35553" fg:w="3267"/><text x="74.9145%" y="1439.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (3,209 samples, 6.74%)</title><rect x="74.7863%" y="1413" width="6.7392%" height="15" fill="rgb(240,227,30)" fg:x="35611" fg:w="3209"/><text x="75.0363%" y="1423.50">sqlparser..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (364 samples, 0.76%)</title><rect x="80.7611%" y="1397" width="0.7644%" height="15" fill="rgb(215,224,45)" fg:x="38456" fg:w="364"/><text x="81.0111%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (362 samples, 0.76%)</title><rect x="80.7653%" y="1381" width="0.7602%" height="15" fill="rgb(206,123,31)" fg:x="38458" fg:w="362"/><text x="81.0153%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (360 samples, 0.76%)</title><rect x="80.7695%" y="1365" width="0.7560%" height="15" fill="rgb(210,138,16)" fg:x="38460" fg:w="360"/><text x="81.0195%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (348 samples, 0.73%)</title><rect x="80.7947%" y="1349" width="0.7308%" height="15" fill="rgb(228,57,28)" fg:x="38472" fg:w="348"/><text x="81.0447%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (87 samples, 0.18%)</title><rect x="81.3428%" y="1333" width="0.1827%" height="15" fill="rgb(242,170,10)" fg:x="38733" fg:w="87"/><text x="81.5928%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (87 samples, 0.18%)</title><rect x="81.3428%" y="1317" width="0.1827%" height="15" fill="rgb(228,214,39)" fg:x="38733" fg:w="87"/><text x="81.5928%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (86 samples, 0.18%)</title><rect x="81.3449%" y="1301" width="0.1806%" height="15" fill="rgb(218,179,33)" fg:x="38734" fg:w="86"/><text x="81.5949%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (82 samples, 0.17%)</title><rect x="81.3533%" y="1285" width="0.1722%" height="15" fill="rgb(235,193,39)" fg:x="38738" fg:w="82"/><text x="81.6033%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (24 samples, 0.05%)</title><rect x="81.4751%" y="1269" width="0.0504%" height="15" fill="rgb(219,221,36)" fg:x="38796" fg:w="24"/><text x="81.7251%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (33 samples, 0.07%)</title><rect x="81.5444%" y="1397" width="0.0693%" height="15" fill="rgb(248,218,19)" fg:x="38829" fg:w="33"/><text x="81.7944%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="81.6263%" y="1381" width="0.0105%" height="15" fill="rgb(205,50,9)" fg:x="38868" fg:w="5"/><text x="81.8763%" y="1391.50"></text></g><g><title>libsystem_m.dylib`exp (40 samples, 0.08%)</title><rect x="81.6536%" y="1365" width="0.0840%" height="15" fill="rgb(238,81,28)" fg:x="38881" fg:w="40"/><text x="81.9036%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (9 samples, 0.02%)</title><rect x="81.7376%" y="1365" width="0.0189%" height="15" fill="rgb(235,110,19)" fg:x="38921" fg:w="9"/><text x="81.9876%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (9 samples, 0.02%)</title><rect x="81.7376%" y="1349" width="0.0189%" height="15" fill="rgb(214,7,14)" fg:x="38921" fg:w="9"/><text x="81.9876%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (9 samples, 0.02%)</title><rect x="81.7376%" y="1333" width="0.0189%" height="15" fill="rgb(211,77,3)" fg:x="38921" fg:w="9"/><text x="81.9876%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="81.7397%" y="1317" width="0.0168%" height="15" fill="rgb(229,5,9)" fg:x="38922" fg:w="8"/><text x="81.9897%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="81.7397%" y="1301" width="0.0168%" height="15" fill="rgb(225,90,11)" fg:x="38922" fg:w="8"/><text x="81.9897%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="81.7418%" y="1285" width="0.0147%" height="15" fill="rgb(242,56,8)" fg:x="38923" fg:w="7"/><text x="81.9918%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (20 samples, 0.04%)</title><rect x="81.7754%" y="1333" width="0.0420%" height="15" fill="rgb(249,212,39)" fg:x="38939" fg:w="20"/><text x="82.0254%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (7 samples, 0.01%)</title><rect x="81.8174%" y="1301" width="0.0147%" height="15" fill="rgb(236,90,9)" fg:x="38959" fg:w="7"/><text x="82.0674%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="81.8195%" y="1285" width="0.0126%" height="15" fill="rgb(206,88,35)" fg:x="38960" fg:w="6"/><text x="82.0695%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="81.8195%" y="1269" width="0.0126%" height="15" fill="rgb(205,126,30)" fg:x="38960" fg:w="6"/><text x="82.0695%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="81.8216%" y="1253" width="0.0105%" height="15" fill="rgb(230,176,12)" fg:x="38961" fg:w="5"/><text x="82.0716%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (9 samples, 0.02%)</title><rect x="81.8174%" y="1333" width="0.0189%" height="15" fill="rgb(243,19,9)" fg:x="38959" fg:w="9"/><text x="82.0674%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (9 samples, 0.02%)</title><rect x="81.8174%" y="1317" width="0.0189%" height="15" fill="rgb(245,171,17)" fg:x="38959" fg:w="9"/><text x="82.0674%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="81.8447%" y="1301" width="0.0315%" height="15" fill="rgb(227,52,21)" fg:x="38972" fg:w="15"/><text x="82.0947%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (11 samples, 0.02%)</title><rect x="81.8804%" y="1269" width="0.0231%" height="15" fill="rgb(238,69,14)" fg:x="38989" fg:w="11"/><text x="82.1304%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (6 samples, 0.01%)</title><rect x="81.9035%" y="1253" width="0.0126%" height="15" fill="rgb(241,156,39)" fg:x="39000" fg:w="6"/><text x="82.1535%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="81.8804%" y="1285" width="0.0399%" height="15" fill="rgb(212,227,28)" fg:x="38989" fg:w="19"/><text x="82.1304%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="81.9035%" y="1269" width="0.0168%" height="15" fill="rgb(209,118,27)" fg:x="39000" fg:w="8"/><text x="82.1535%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="81.9308%" y="1253" width="0.0210%" height="15" fill="rgb(226,102,5)" fg:x="39013" fg:w="10"/><text x="82.1808%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (5 samples, 0.01%)</title><rect x="81.9539%" y="1221" width="0.0105%" height="15" fill="rgb(223,34,3)" fg:x="39024" fg:w="5"/><text x="82.2039%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="81.9539%" y="1205" width="0.0105%" height="15" fill="rgb(221,81,38)" fg:x="39024" fg:w="5"/><text x="82.2039%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="81.9539%" y="1189" width="0.0105%" height="15" fill="rgb(236,219,28)" fg:x="39024" fg:w="5"/><text x="82.2039%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (61 samples, 0.13%)</title><rect x="81.8405%" y="1317" width="0.1281%" height="15" fill="rgb(213,200,14)" fg:x="38970" fg:w="61"/><text x="82.0905%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (44 samples, 0.09%)</title><rect x="81.8762%" y="1301" width="0.0924%" height="15" fill="rgb(240,33,19)" fg:x="38987" fg:w="44"/><text x="82.1262%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (23 samples, 0.05%)</title><rect x="81.9203%" y="1285" width="0.0483%" height="15" fill="rgb(233,113,27)" fg:x="39008" fg:w="23"/><text x="82.1703%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="81.9266%" y="1269" width="0.0420%" height="15" fill="rgb(220,221,18)" fg:x="39011" fg:w="20"/><text x="82.1766%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="81.9518%" y="1253" width="0.0168%" height="15" fill="rgb(238,92,8)" fg:x="39023" fg:w="8"/><text x="82.2018%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (8 samples, 0.02%)</title><rect x="81.9518%" y="1237" width="0.0168%" height="15" fill="rgb(222,164,16)" fg:x="39023" fg:w="8"/><text x="82.2018%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="81.9686%" y="1301" width="0.0105%" height="15" fill="rgb(241,119,3)" fg:x="39031" fg:w="5"/><text x="82.2186%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (14 samples, 0.03%)</title><rect x="81.9917%" y="1285" width="0.0294%" height="15" fill="rgb(241,44,8)" fg:x="39042" fg:w="14"/><text x="82.2417%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (13 samples, 0.03%)</title><rect x="82.0358%" y="1253" width="0.0273%" height="15" fill="rgb(230,36,40)" fg:x="39063" fg:w="13"/><text x="82.2858%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (6 samples, 0.01%)</title><rect x="82.0652%" y="1221" width="0.0126%" height="15" fill="rgb(243,16,36)" fg:x="39077" fg:w="6"/><text x="82.3152%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="82.0652%" y="1205" width="0.0126%" height="15" fill="rgb(231,4,26)" fg:x="39077" fg:w="6"/><text x="82.3152%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="82.0652%" y="1189" width="0.0126%" height="15" fill="rgb(240,9,31)" fg:x="39077" fg:w="6"/><text x="82.3152%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="82.0673%" y="1173" width="0.0105%" height="15" fill="rgb(207,173,15)" fg:x="39078" fg:w="5"/><text x="82.3173%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="82.0631%" y="1237" width="0.0231%" height="15" fill="rgb(224,192,53)" fg:x="39076" fg:w="11"/><text x="82.3131%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="82.0295%" y="1269" width="0.0609%" height="15" fill="rgb(223,67,28)" fg:x="39060" fg:w="29"/><text x="82.2795%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (13 samples, 0.03%)</title><rect x="82.0631%" y="1253" width="0.0273%" height="15" fill="rgb(211,20,47)" fg:x="39076" fg:w="13"/><text x="82.3131%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (8 samples, 0.02%)</title><rect x="82.0946%" y="1237" width="0.0168%" height="15" fill="rgb(240,228,2)" fg:x="39091" fg:w="8"/><text x="82.3446%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (7 samples, 0.01%)</title><rect x="82.1135%" y="1205" width="0.0147%" height="15" fill="rgb(248,151,12)" fg:x="39100" fg:w="7"/><text x="82.3635%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="82.1156%" y="1189" width="0.0126%" height="15" fill="rgb(244,8,39)" fg:x="39101" fg:w="6"/><text x="82.3656%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="82.1156%" y="1173" width="0.0126%" height="15" fill="rgb(222,26,8)" fg:x="39101" fg:w="6"/><text x="82.3656%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="82.1177%" y="1157" width="0.0105%" height="15" fill="rgb(213,106,44)" fg:x="39102" fg:w="5"/><text x="82.3677%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (177 samples, 0.37%)</title><rect x="81.7628%" y="1349" width="0.3717%" height="15" fill="rgb(214,129,20)" fg:x="38933" fg:w="177"/><text x="82.0128%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (142 samples, 0.30%)</title><rect x="81.8363%" y="1333" width="0.2982%" height="15" fill="rgb(212,32,13)" fg:x="38968" fg:w="142"/><text x="82.0863%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (79 samples, 0.17%)</title><rect x="81.9686%" y="1317" width="0.1659%" height="15" fill="rgb(208,168,33)" fg:x="39031" fg:w="79"/><text x="82.2186%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (74 samples, 0.16%)</title><rect x="81.9791%" y="1301" width="0.1554%" height="15" fill="rgb(231,207,8)" fg:x="39036" fg:w="74"/><text x="82.2291%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (51 samples, 0.11%)</title><rect x="82.0274%" y="1285" width="0.1071%" height="15" fill="rgb(235,219,23)" fg:x="39059" fg:w="51"/><text x="82.2774%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (21 samples, 0.04%)</title><rect x="82.0904%" y="1269" width="0.0441%" height="15" fill="rgb(226,216,26)" fg:x="39089" fg:w="21"/><text x="82.3404%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="82.0925%" y="1253" width="0.0420%" height="15" fill="rgb(239,137,16)" fg:x="39090" fg:w="20"/><text x="82.3425%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (11 samples, 0.02%)</title><rect x="82.1114%" y="1237" width="0.0231%" height="15" fill="rgb(207,12,36)" fg:x="39099" fg:w="11"/><text x="82.3614%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="82.1114%" y="1221" width="0.0231%" height="15" fill="rgb(210,214,24)" fg:x="39099" fg:w="11"/><text x="82.3614%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (28 samples, 0.06%)</title><rect x="82.1492%" y="1317" width="0.0588%" height="15" fill="rgb(206,56,30)" fg:x="39117" fg:w="28"/><text x="82.3992%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="82.2080%" y="1317" width="0.0105%" height="15" fill="rgb(228,143,26)" fg:x="39145" fg:w="5"/><text x="82.4580%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="82.2080%" y="1301" width="0.0105%" height="15" fill="rgb(216,218,46)" fg:x="39145" fg:w="5"/><text x="82.4580%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="82.2080%" y="1285" width="0.0105%" height="15" fill="rgb(206,6,19)" fg:x="39145" fg:w="5"/><text x="82.4580%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="82.2080%" y="1269" width="0.0105%" height="15" fill="rgb(239,177,51)" fg:x="39145" fg:w="5"/><text x="82.4580%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="82.2080%" y="1253" width="0.0105%" height="15" fill="rgb(216,55,25)" fg:x="39145" fg:w="5"/><text x="82.4580%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="82.2269%" y="1285" width="0.0399%" height="15" fill="rgb(231,163,29)" fg:x="39154" fg:w="19"/><text x="82.4769%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (11 samples, 0.02%)</title><rect x="82.2815%" y="1253" width="0.0231%" height="15" fill="rgb(232,149,50)" fg:x="39180" fg:w="11"/><text x="82.5315%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="82.3046%" y="1237" width="0.0147%" height="15" fill="rgb(223,142,48)" fg:x="39191" fg:w="7"/><text x="82.5546%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="82.2794%" y="1269" width="0.0420%" height="15" fill="rgb(245,83,23)" fg:x="39179" fg:w="20"/><text x="82.5294%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="82.3046%" y="1253" width="0.0168%" height="15" fill="rgb(224,63,2)" fg:x="39191" fg:w="8"/><text x="82.5546%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="82.3277%" y="1237" width="0.0189%" height="15" fill="rgb(218,65,53)" fg:x="39202" fg:w="9"/><text x="82.5777%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="82.3466%" y="1221" width="0.0147%" height="15" fill="rgb(221,84,29)" fg:x="39211" fg:w="7"/><text x="82.5966%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (20 samples, 0.04%)</title><rect x="82.3214%" y="1269" width="0.0420%" height="15" fill="rgb(234,0,32)" fg:x="39199" fg:w="20"/><text x="82.5714%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="82.3214%" y="1253" width="0.0420%" height="15" fill="rgb(206,20,16)" fg:x="39199" fg:w="20"/><text x="82.5714%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="82.3466%" y="1237" width="0.0168%" height="15" fill="rgb(244,172,18)" fg:x="39211" fg:w="8"/><text x="82.5966%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (74 samples, 0.16%)</title><rect x="82.2185%" y="1301" width="0.1554%" height="15" fill="rgb(254,133,1)" fg:x="39150" fg:w="74"/><text x="82.4685%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (47 samples, 0.10%)</title><rect x="82.2752%" y="1285" width="0.0987%" height="15" fill="rgb(222,206,41)" fg:x="39177" fg:w="47"/><text x="82.5252%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="82.3634%" y="1269" width="0.0105%" height="15" fill="rgb(212,3,42)" fg:x="39219" fg:w="5"/><text x="82.6134%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="82.3634%" y="1253" width="0.0105%" height="15" fill="rgb(241,11,4)" fg:x="39219" fg:w="5"/><text x="82.6134%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="82.3634%" y="1237" width="0.0105%" height="15" fill="rgb(205,19,26)" fg:x="39219" fg:w="5"/><text x="82.6134%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="82.3634%" y="1221" width="0.0105%" height="15" fill="rgb(210,179,32)" fg:x="39219" fg:w="5"/><text x="82.6134%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="82.3907%" y="1269" width="0.0315%" height="15" fill="rgb(227,116,49)" fg:x="39232" fg:w="15"/><text x="82.6407%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="82.4285%" y="1237" width="0.0210%" height="15" fill="rgb(211,146,6)" fg:x="39250" fg:w="10"/><text x="82.6785%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (11 samples, 0.02%)</title><rect x="82.4495%" y="1237" width="0.0231%" height="15" fill="rgb(219,44,39)" fg:x="39260" fg:w="11"/><text x="82.6995%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="82.4495%" y="1221" width="0.0231%" height="15" fill="rgb(234,128,11)" fg:x="39260" fg:w="11"/><text x="82.6995%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="82.4558%" y="1205" width="0.0168%" height="15" fill="rgb(220,183,53)" fg:x="39263" fg:w="8"/><text x="82.7058%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="82.4558%" y="1189" width="0.0168%" height="15" fill="rgb(213,219,32)" fg:x="39263" fg:w="8"/><text x="82.7058%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="82.4621%" y="1173" width="0.0105%" height="15" fill="rgb(232,156,16)" fg:x="39266" fg:w="5"/><text x="82.7121%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="82.4222%" y="1253" width="0.0525%" height="15" fill="rgb(246,135,34)" fg:x="39247" fg:w="25"/><text x="82.6722%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="82.4852%" y="1221" width="0.0147%" height="15" fill="rgb(241,99,0)" fg:x="39277" fg:w="7"/><text x="82.7352%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="82.4999%" y="1205" width="0.0147%" height="15" fill="rgb(222,103,45)" fg:x="39284" fg:w="7"/><text x="82.7499%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (9 samples, 0.02%)</title><rect x="82.4999%" y="1221" width="0.0189%" height="15" fill="rgb(212,57,4)" fg:x="39284" fg:w="9"/><text x="82.7499%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (23 samples, 0.05%)</title><rect x="82.4747%" y="1253" width="0.0483%" height="15" fill="rgb(215,68,47)" fg:x="39272" fg:w="23"/><text x="82.7247%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="82.4789%" y="1237" width="0.0441%" height="15" fill="rgb(230,84,2)" fg:x="39274" fg:w="21"/><text x="82.7289%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (73 samples, 0.15%)</title><rect x="82.3739%" y="1301" width="0.1533%" height="15" fill="rgb(220,102,14)" fg:x="39224" fg:w="73"/><text x="82.6239%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (69 samples, 0.14%)</title><rect x="82.3823%" y="1285" width="0.1449%" height="15" fill="rgb(240,10,32)" fg:x="39228" fg:w="69"/><text x="82.6323%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (50 samples, 0.11%)</title><rect x="82.4222%" y="1269" width="0.1050%" height="15" fill="rgb(215,47,27)" fg:x="39247" fg:w="50"/><text x="82.6722%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="82.5272%" y="1205" width="0.0189%" height="15" fill="rgb(233,188,43)" fg:x="39297" fg:w="9"/><text x="82.7772%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="82.5293%" y="1189" width="0.0168%" height="15" fill="rgb(253,190,1)" fg:x="39298" fg:w="8"/><text x="82.7793%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="82.5272%" y="1237" width="0.0399%" height="15" fill="rgb(206,114,52)" fg:x="39297" fg:w="19"/><text x="82.7772%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="82.5272%" y="1221" width="0.0399%" height="15" fill="rgb(233,120,37)" fg:x="39297" fg:w="19"/><text x="82.7772%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="82.5461%" y="1205" width="0.0210%" height="15" fill="rgb(214,52,39)" fg:x="39306" fg:w="10"/><text x="82.7961%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="82.5461%" y="1189" width="0.0210%" height="15" fill="rgb(223,80,29)" fg:x="39306" fg:w="10"/><text x="82.7961%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="82.5461%" y="1173" width="0.0210%" height="15" fill="rgb(230,101,40)" fg:x="39306" fg:w="10"/><text x="82.7961%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="82.5672%" y="1237" width="0.0147%" height="15" fill="rgb(219,211,8)" fg:x="39316" fg:w="7"/><text x="82.8172%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="82.5672%" y="1221" width="0.0147%" height="15" fill="rgb(252,126,28)" fg:x="39316" fg:w="7"/><text x="82.8172%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="82.5672%" y="1205" width="0.0147%" height="15" fill="rgb(215,56,38)" fg:x="39316" fg:w="7"/><text x="82.8172%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (223 samples, 0.47%)</title><rect x="82.1345%" y="1349" width="0.4683%" height="15" fill="rgb(249,55,44)" fg:x="39110" fg:w="223"/><text x="82.3845%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (219 samples, 0.46%)</title><rect x="82.1429%" y="1333" width="0.4599%" height="15" fill="rgb(220,221,32)" fg:x="39114" fg:w="219"/><text x="82.3929%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (183 samples, 0.38%)</title><rect x="82.2185%" y="1317" width="0.3843%" height="15" fill="rgb(212,216,41)" fg:x="39150" fg:w="183"/><text x="82.4685%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (36 samples, 0.08%)</title><rect x="82.5272%" y="1301" width="0.0756%" height="15" fill="rgb(228,213,43)" fg:x="39297" fg:w="36"/><text x="82.7772%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (36 samples, 0.08%)</title><rect x="82.5272%" y="1285" width="0.0756%" height="15" fill="rgb(211,31,26)" fg:x="39297" fg:w="36"/><text x="82.7772%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (36 samples, 0.08%)</title><rect x="82.5272%" y="1269" width="0.0756%" height="15" fill="rgb(229,202,19)" fg:x="39297" fg:w="36"/><text x="82.7772%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (36 samples, 0.08%)</title><rect x="82.5272%" y="1253" width="0.0756%" height="15" fill="rgb(229,105,46)" fg:x="39297" fg:w="36"/><text x="82.7772%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (10 samples, 0.02%)</title><rect x="82.5819%" y="1237" width="0.0210%" height="15" fill="rgb(235,108,1)" fg:x="39323" fg:w="10"/><text x="82.8319%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (10 samples, 0.02%)</title><rect x="82.5819%" y="1221" width="0.0210%" height="15" fill="rgb(245,111,35)" fg:x="39323" fg:w="10"/><text x="82.8319%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="82.5840%" y="1205" width="0.0189%" height="15" fill="rgb(219,185,31)" fg:x="39324" fg:w="9"/><text x="82.8340%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="82.5840%" y="1189" width="0.0189%" height="15" fill="rgb(214,4,43)" fg:x="39324" fg:w="9"/><text x="82.8340%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="82.5903%" y="1173" width="0.0126%" height="15" fill="rgb(235,227,40)" fg:x="39327" fg:w="6"/><text x="82.8403%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="82.5903%" y="1157" width="0.0126%" height="15" fill="rgb(230,88,30)" fg:x="39327" fg:w="6"/><text x="82.8403%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="82.5903%" y="1141" width="0.0126%" height="15" fill="rgb(216,217,1)" fg:x="39327" fg:w="6"/><text x="82.8403%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="82.5903%" y="1125" width="0.0126%" height="15" fill="rgb(248,139,50)" fg:x="39327" fg:w="6"/><text x="82.8403%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (466 samples, 0.98%)</title><rect x="81.6368%" y="1381" width="0.9786%" height="15" fill="rgb(233,1,21)" fg:x="38873" fg:w="466"/><text x="81.8868%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (409 samples, 0.86%)</title><rect x="81.7565%" y="1365" width="0.8589%" height="15" fill="rgb(215,183,12)" fg:x="38930" fg:w="409"/><text x="82.0065%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="82.6029%" y="1349" width="0.0126%" height="15" fill="rgb(229,104,42)" fg:x="39333" fg:w="6"/><text x="82.8529%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="82.6029%" y="1333" width="0.0126%" height="15" fill="rgb(243,34,48)" fg:x="39333" fg:w="6"/><text x="82.8529%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="82.6029%" y="1317" width="0.0126%" height="15" fill="rgb(239,11,44)" fg:x="39333" fg:w="6"/><text x="82.8529%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="82.6050%" y="1301" width="0.0105%" height="15" fill="rgb(231,98,35)" fg:x="39334" fg:w="5"/><text x="82.8550%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (52 samples, 0.11%)</title><rect x="82.6428%" y="1349" width="0.1092%" height="15" fill="rgb(233,28,25)" fg:x="39352" fg:w="52"/><text x="82.8928%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (31 samples, 0.07%)</title><rect x="82.7688%" y="1317" width="0.0651%" height="15" fill="rgb(234,123,11)" fg:x="39412" fg:w="31"/><text x="83.0188%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (7 samples, 0.01%)</title><rect x="82.8339%" y="1285" width="0.0147%" height="15" fill="rgb(220,69,3)" fg:x="39443" fg:w="7"/><text x="83.0839%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="82.8339%" y="1269" width="0.0147%" height="15" fill="rgb(214,64,36)" fg:x="39443" fg:w="7"/><text x="83.0839%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="82.8339%" y="1253" width="0.0147%" height="15" fill="rgb(211,138,32)" fg:x="39443" fg:w="7"/><text x="83.0839%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (9 samples, 0.02%)</title><rect x="82.8339%" y="1317" width="0.0189%" height="15" fill="rgb(213,118,47)" fg:x="39443" fg:w="9"/><text x="83.0839%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (9 samples, 0.02%)</title><rect x="82.8339%" y="1301" width="0.0189%" height="15" fill="rgb(243,124,49)" fg:x="39443" fg:w="9"/><text x="83.0839%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="82.8570%" y="1285" width="0.0399%" height="15" fill="rgb(221,30,28)" fg:x="39454" fg:w="19"/><text x="83.1070%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="82.9053%" y="1253" width="0.0126%" height="15" fill="rgb(246,37,13)" fg:x="39477" fg:w="6"/><text x="83.1553%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="82.9032%" y="1269" width="0.0252%" height="15" fill="rgb(249,66,14)" fg:x="39476" fg:w="12"/><text x="83.1532%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="82.9179%" y="1253" width="0.0105%" height="15" fill="rgb(213,166,5)" fg:x="39483" fg:w="5"/><text x="83.1679%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="82.9347%" y="1221" width="0.0147%" height="15" fill="rgb(221,66,24)" fg:x="39491" fg:w="7"/><text x="83.1847%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="82.9389%" y="1205" width="0.0105%" height="15" fill="rgb(210,132,17)" fg:x="39493" fg:w="5"/><text x="83.1889%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="82.9389%" y="1189" width="0.0105%" height="15" fill="rgb(243,202,5)" fg:x="39493" fg:w="5"/><text x="83.1889%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (50 samples, 0.11%)</title><rect x="82.8528%" y="1301" width="0.1050%" height="15" fill="rgb(233,70,48)" fg:x="39452" fg:w="50"/><text x="83.1028%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (27 samples, 0.06%)</title><rect x="82.9011%" y="1285" width="0.0567%" height="15" fill="rgb(238,41,26)" fg:x="39475" fg:w="27"/><text x="83.1511%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="82.9284%" y="1269" width="0.0294%" height="15" fill="rgb(241,19,31)" fg:x="39488" fg:w="14"/><text x="83.1784%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="82.9284%" y="1253" width="0.0294%" height="15" fill="rgb(214,76,10)" fg:x="39488" fg:w="14"/><text x="83.1784%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (11 samples, 0.02%)</title><rect x="82.9347%" y="1237" width="0.0231%" height="15" fill="rgb(254,202,22)" fg:x="39491" fg:w="11"/><text x="83.1847%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (12 samples, 0.03%)</title><rect x="82.9620%" y="1269" width="0.0252%" height="15" fill="rgb(214,72,24)" fg:x="39504" fg:w="12"/><text x="83.2120%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="82.9956%" y="1237" width="0.0210%" height="15" fill="rgb(221,92,46)" fg:x="39520" fg:w="10"/><text x="83.2456%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (5 samples, 0.01%)</title><rect x="83.0166%" y="1205" width="0.0105%" height="15" fill="rgb(246,13,50)" fg:x="39530" fg:w="5"/><text x="83.2666%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="83.0166%" y="1189" width="0.0105%" height="15" fill="rgb(240,165,38)" fg:x="39530" fg:w="5"/><text x="83.2666%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (11 samples, 0.02%)</title><rect x="83.0166%" y="1221" width="0.0231%" height="15" fill="rgb(241,24,51)" fg:x="39530" fg:w="11"/><text x="83.2666%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="83.0271%" y="1205" width="0.0126%" height="15" fill="rgb(227,51,44)" fg:x="39535" fg:w="6"/><text x="83.2771%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="83.0271%" y="1189" width="0.0126%" height="15" fill="rgb(231,121,3)" fg:x="39535" fg:w="6"/><text x="83.2771%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="82.9956%" y="1253" width="0.0462%" height="15" fill="rgb(245,3,41)" fg:x="39520" fg:w="22"/><text x="83.2456%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (12 samples, 0.03%)</title><rect x="83.0166%" y="1237" width="0.0252%" height="15" fill="rgb(214,13,26)" fg:x="39530" fg:w="12"/><text x="83.2666%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="83.0460%" y="1221" width="0.0126%" height="15" fill="rgb(252,75,11)" fg:x="39544" fg:w="6"/><text x="83.2960%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (150 samples, 0.32%)</title><rect x="82.7583%" y="1333" width="0.3150%" height="15" fill="rgb(218,226,17)" fg:x="39407" fg:w="150"/><text x="83.0083%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (105 samples, 0.22%)</title><rect x="82.8528%" y="1317" width="0.2205%" height="15" fill="rgb(248,89,38)" fg:x="39452" fg:w="105"/><text x="83.1028%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (55 samples, 0.12%)</title><rect x="82.9578%" y="1301" width="0.1155%" height="15" fill="rgb(237,73,46)" fg:x="39502" fg:w="55"/><text x="83.2078%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (55 samples, 0.12%)</title><rect x="82.9578%" y="1285" width="0.1155%" height="15" fill="rgb(242,78,33)" fg:x="39502" fg:w="55"/><text x="83.2078%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (39 samples, 0.08%)</title><rect x="82.9914%" y="1269" width="0.0819%" height="15" fill="rgb(235,60,3)" fg:x="39518" fg:w="39"/><text x="83.2414%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="83.0418%" y="1253" width="0.0315%" height="15" fill="rgb(216,172,19)" fg:x="39542" fg:w="15"/><text x="83.2918%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="83.0460%" y="1237" width="0.0273%" height="15" fill="rgb(227,6,42)" fg:x="39544" fg:w="13"/><text x="83.2960%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (7 samples, 0.01%)</title><rect x="83.0586%" y="1221" width="0.0147%" height="15" fill="rgb(223,207,42)" fg:x="39550" fg:w="7"/><text x="83.3086%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="83.0586%" y="1205" width="0.0147%" height="15" fill="rgb(246,138,30)" fg:x="39550" fg:w="7"/><text x="83.3086%" y="1215.50"></text></g><g><title>libsystem_m.dylib`exp (16 samples, 0.03%)</title><rect x="83.0901%" y="1301" width="0.0336%" height="15" fill="rgb(251,199,47)" fg:x="39565" fg:w="16"/><text x="83.3401%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (8 samples, 0.02%)</title><rect x="83.1237%" y="1301" width="0.0168%" height="15" fill="rgb(228,218,44)" fg:x="39581" fg:w="8"/><text x="83.3737%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (8 samples, 0.02%)</title><rect x="83.1237%" y="1285" width="0.0168%" height="15" fill="rgb(220,68,6)" fg:x="39581" fg:w="8"/><text x="83.3737%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (8 samples, 0.02%)</title><rect x="83.1237%" y="1269" width="0.0168%" height="15" fill="rgb(240,60,26)" fg:x="39581" fg:w="8"/><text x="83.3737%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="83.1258%" y="1253" width="0.0147%" height="15" fill="rgb(211,200,19)" fg:x="39582" fg:w="7"/><text x="83.3758%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="83.1258%" y="1237" width="0.0147%" height="15" fill="rgb(242,145,30)" fg:x="39582" fg:w="7"/><text x="83.3758%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="83.1300%" y="1221" width="0.0105%" height="15" fill="rgb(225,64,13)" fg:x="39584" fg:w="5"/><text x="83.3800%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (11 samples, 0.02%)</title><rect x="83.1489%" y="1269" width="0.0231%" height="15" fill="rgb(218,103,35)" fg:x="39593" fg:w="11"/><text x="83.3989%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (8 samples, 0.02%)</title><rect x="83.1720%" y="1237" width="0.0168%" height="15" fill="rgb(216,93,46)" fg:x="39604" fg:w="8"/><text x="83.4220%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (8 samples, 0.02%)</title><rect x="83.1720%" y="1221" width="0.0168%" height="15" fill="rgb(225,159,27)" fg:x="39604" fg:w="8"/><text x="83.4220%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="83.1720%" y="1205" width="0.0168%" height="15" fill="rgb(225,204,11)" fg:x="39604" fg:w="8"/><text x="83.4220%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (9 samples, 0.02%)</title><rect x="83.1720%" y="1269" width="0.0189%" height="15" fill="rgb(205,56,4)" fg:x="39604" fg:w="9"/><text x="83.4220%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (9 samples, 0.02%)</title><rect x="83.1720%" y="1253" width="0.0189%" height="15" fill="rgb(206,6,35)" fg:x="39604" fg:w="9"/><text x="83.4220%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.1930%" y="1253" width="0.0126%" height="15" fill="rgb(247,73,52)" fg:x="39614" fg:w="6"/><text x="83.4430%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="83.1951%" y="1237" width="0.0105%" height="15" fill="rgb(246,97,4)" fg:x="39615" fg:w="5"/><text x="83.4451%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="83.1951%" y="1221" width="0.0105%" height="15" fill="rgb(212,37,15)" fg:x="39615" fg:w="5"/><text x="83.4451%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (7 samples, 0.01%)</title><rect x="83.2140%" y="1205" width="0.0147%" height="15" fill="rgb(208,130,40)" fg:x="39624" fg:w="7"/><text x="83.4640%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (41 samples, 0.09%)</title><rect x="83.1447%" y="1285" width="0.0861%" height="15" fill="rgb(236,55,29)" fg:x="39591" fg:w="41"/><text x="83.3947%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="83.1909%" y="1269" width="0.0399%" height="15" fill="rgb(209,156,45)" fg:x="39613" fg:w="19"/><text x="83.4409%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="83.2056%" y="1253" width="0.0252%" height="15" fill="rgb(249,107,4)" fg:x="39620" fg:w="12"/><text x="83.4556%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="83.2056%" y="1237" width="0.0252%" height="15" fill="rgb(227,7,13)" fg:x="39620" fg:w="12"/><text x="83.4556%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="83.2140%" y="1221" width="0.0168%" height="15" fill="rgb(250,129,14)" fg:x="39624" fg:w="8"/><text x="83.4640%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="83.2413%" y="1253" width="0.0315%" height="15" fill="rgb(229,92,13)" fg:x="39637" fg:w="15"/><text x="83.4913%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="83.2728%" y="1253" width="0.0105%" height="15" fill="rgb(245,98,39)" fg:x="39652" fg:w="5"/><text x="83.5228%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="83.2728%" y="1237" width="0.0105%" height="15" fill="rgb(234,135,48)" fg:x="39652" fg:w="5"/><text x="83.5228%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="83.2854%" y="1221" width="0.0105%" height="15" fill="rgb(230,98,28)" fg:x="39658" fg:w="5"/><text x="83.5354%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="83.2959%" y="1221" width="0.0105%" height="15" fill="rgb(223,121,0)" fg:x="39663" fg:w="5"/><text x="83.5459%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="83.2833%" y="1237" width="0.0252%" height="15" fill="rgb(234,173,33)" fg:x="39657" fg:w="12"/><text x="83.5333%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (6 samples, 0.01%)</title><rect x="83.3127%" y="1205" width="0.0126%" height="15" fill="rgb(245,47,8)" fg:x="39671" fg:w="6"/><text x="83.5627%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (6 samples, 0.01%)</title><rect x="83.3127%" y="1189" width="0.0126%" height="15" fill="rgb(205,17,20)" fg:x="39671" fg:w="6"/><text x="83.5627%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="83.3085%" y="1237" width="0.0189%" height="15" fill="rgb(232,151,16)" fg:x="39669" fg:w="9"/><text x="83.5585%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="83.3106%" y="1221" width="0.0168%" height="15" fill="rgb(208,30,32)" fg:x="39670" fg:w="8"/><text x="83.5606%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (47 samples, 0.10%)</title><rect x="83.2308%" y="1285" width="0.0987%" height="15" fill="rgb(254,26,3)" fg:x="39632" fg:w="47"/><text x="83.4808%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (45 samples, 0.09%)</title><rect x="83.2350%" y="1269" width="0.0945%" height="15" fill="rgb(240,177,30)" fg:x="39634" fg:w="45"/><text x="83.4850%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (22 samples, 0.05%)</title><rect x="83.2833%" y="1253" width="0.0462%" height="15" fill="rgb(248,76,44)" fg:x="39657" fg:w="22"/><text x="83.5333%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="83.3442%" y="1189" width="0.0105%" height="15" fill="rgb(241,186,54)" fg:x="39686" fg:w="5"/><text x="83.5942%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="83.3316%" y="1221" width="0.0252%" height="15" fill="rgb(249,171,29)" fg:x="39680" fg:w="12"/><text x="83.5816%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="83.3358%" y="1205" width="0.0210%" height="15" fill="rgb(237,151,44)" fg:x="39682" fg:w="10"/><text x="83.5858%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="83.3568%" y="1221" width="0.0189%" height="15" fill="rgb(228,174,30)" fg:x="39692" fg:w="9"/><text x="83.6068%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.3568%" y="1205" width="0.0189%" height="15" fill="rgb(252,14,37)" fg:x="39692" fg:w="9"/><text x="83.6068%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.3568%" y="1189" width="0.0189%" height="15" fill="rgb(207,111,40)" fg:x="39692" fg:w="9"/><text x="83.6068%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="83.3631%" y="1173" width="0.0126%" height="15" fill="rgb(248,171,54)" fg:x="39695" fg:w="6"/><text x="83.6131%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="83.3631%" y="1157" width="0.0126%" height="15" fill="rgb(211,127,2)" fg:x="39695" fg:w="6"/><text x="83.6131%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.3631%" y="1141" width="0.0126%" height="15" fill="rgb(236,87,47)" fg:x="39695" fg:w="6"/><text x="83.6131%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.3652%" y="1125" width="0.0105%" height="15" fill="rgb(223,190,45)" fg:x="39696" fg:w="5"/><text x="83.6152%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (145 samples, 0.30%)</title><rect x="83.0733%" y="1333" width="0.3045%" height="15" fill="rgb(215,5,16)" fg:x="39557" fg:w="145"/><text x="83.3233%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (141 samples, 0.30%)</title><rect x="83.0817%" y="1317" width="0.2961%" height="15" fill="rgb(252,82,33)" fg:x="39561" fg:w="141"/><text x="83.3317%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (113 samples, 0.24%)</title><rect x="83.1405%" y="1301" width="0.2373%" height="15" fill="rgb(247,213,44)" fg:x="39589" fg:w="113"/><text x="83.3905%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (23 samples, 0.05%)</title><rect x="83.3295%" y="1285" width="0.0483%" height="15" fill="rgb(205,196,44)" fg:x="39679" fg:w="23"/><text x="83.5795%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (23 samples, 0.05%)</title><rect x="83.3295%" y="1269" width="0.0483%" height="15" fill="rgb(237,96,54)" fg:x="39679" fg:w="23"/><text x="83.5795%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (23 samples, 0.05%)</title><rect x="83.3295%" y="1253" width="0.0483%" height="15" fill="rgb(230,113,34)" fg:x="39679" fg:w="23"/><text x="83.5795%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (22 samples, 0.05%)</title><rect x="83.3316%" y="1237" width="0.0462%" height="15" fill="rgb(221,224,12)" fg:x="39680" fg:w="22"/><text x="83.5816%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.3862%" y="1205" width="0.0126%" height="15" fill="rgb(219,112,44)" fg:x="39706" fg:w="6"/><text x="83.6362%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.3883%" y="1189" width="0.0105%" height="15" fill="rgb(210,31,13)" fg:x="39707" fg:w="5"/><text x="83.6383%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="83.3841%" y="1237" width="0.0252%" height="15" fill="rgb(230,25,16)" fg:x="39705" fg:w="12"/><text x="83.6341%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="83.3862%" y="1221" width="0.0231%" height="15" fill="rgb(246,108,53)" fg:x="39706" fg:w="11"/><text x="83.6362%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="83.3988%" y="1205" width="0.0105%" height="15" fill="rgb(241,172,50)" fg:x="39712" fg:w="5"/><text x="83.6488%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.3988%" y="1189" width="0.0105%" height="15" fill="rgb(235,141,10)" fg:x="39712" fg:w="5"/><text x="83.6488%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="83.4093%" y="1189" width="0.0147%" height="15" fill="rgb(220,174,43)" fg:x="39717" fg:w="7"/><text x="83.6593%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.4114%" y="1173" width="0.0126%" height="15" fill="rgb(215,181,40)" fg:x="39718" fg:w="6"/><text x="83.6614%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="83.4093%" y="1237" width="0.0189%" height="15" fill="rgb(230,97,2)" fg:x="39717" fg:w="9"/><text x="83.6593%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.4093%" y="1221" width="0.0189%" height="15" fill="rgb(211,25,27)" fg:x="39717" fg:w="9"/><text x="83.6593%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.4093%" y="1205" width="0.0189%" height="15" fill="rgb(230,87,26)" fg:x="39717" fg:w="9"/><text x="83.6593%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.4282%" y="1173" width="0.0126%" height="15" fill="rgb(227,160,17)" fg:x="39726" fg:w="6"/><text x="83.6782%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.4282%" y="1157" width="0.0126%" height="15" fill="rgb(244,85,34)" fg:x="39726" fg:w="6"/><text x="83.6782%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (30 samples, 0.06%)</title><rect x="83.3820%" y="1269" width="0.0630%" height="15" fill="rgb(207,70,0)" fg:x="39704" fg:w="30"/><text x="83.6320%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (29 samples, 0.06%)</title><rect x="83.3841%" y="1253" width="0.0609%" height="15" fill="rgb(223,129,7)" fg:x="39705" fg:w="29"/><text x="83.6341%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="83.4282%" y="1237" width="0.0168%" height="15" fill="rgb(246,105,7)" fg:x="39726" fg:w="8"/><text x="83.6782%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="83.4282%" y="1221" width="0.0168%" height="15" fill="rgb(215,154,42)" fg:x="39726" fg:w="8"/><text x="83.6782%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="83.4282%" y="1205" width="0.0168%" height="15" fill="rgb(220,215,30)" fg:x="39726" fg:w="8"/><text x="83.6782%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="83.4282%" y="1189" width="0.0168%" height="15" fill="rgb(228,81,51)" fg:x="39726" fg:w="8"/><text x="83.6782%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="83.4450%" y="1269" width="0.0168%" height="15" fill="rgb(247,71,54)" fg:x="39734" fg:w="8"/><text x="83.6950%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="83.4471%" y="1253" width="0.0147%" height="15" fill="rgb(234,176,34)" fg:x="39735" fg:w="7"/><text x="83.6971%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.4513%" y="1237" width="0.0105%" height="15" fill="rgb(241,103,54)" fg:x="39737" fg:w="5"/><text x="83.7013%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="83.4660%" y="1141" width="0.0168%" height="15" fill="rgb(228,22,34)" fg:x="39744" fg:w="8"/><text x="83.7160%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="83.4681%" y="1125" width="0.0147%" height="15" fill="rgb(241,179,48)" fg:x="39745" fg:w="7"/><text x="83.7181%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="83.4660%" y="1173" width="0.0357%" height="15" fill="rgb(235,167,37)" fg:x="39744" fg:w="17"/><text x="83.7160%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="83.4660%" y="1157" width="0.0357%" height="15" fill="rgb(213,109,30)" fg:x="39744" fg:w="17"/><text x="83.7160%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="83.4828%" y="1141" width="0.0189%" height="15" fill="rgb(222,172,16)" fg:x="39752" fg:w="9"/><text x="83.7328%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.4828%" y="1125" width="0.0189%" height="15" fill="rgb(233,192,5)" fg:x="39752" fg:w="9"/><text x="83.7328%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.4828%" y="1109" width="0.0189%" height="15" fill="rgb(247,189,41)" fg:x="39752" fg:w="9"/><text x="83.7328%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="83.4912%" y="1093" width="0.0105%" height="15" fill="rgb(218,134,47)" fg:x="39756" fg:w="5"/><text x="83.7412%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.4912%" y="1077" width="0.0105%" height="15" fill="rgb(216,29,3)" fg:x="39756" fg:w="5"/><text x="83.7412%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.4912%" y="1061" width="0.0105%" height="15" fill="rgb(246,140,12)" fg:x="39756" fg:w="5"/><text x="83.7412%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="83.5017%" y="1173" width="0.0126%" height="15" fill="rgb(230,136,11)" fg:x="39761" fg:w="6"/><text x="83.7517%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.5017%" y="1157" width="0.0126%" height="15" fill="rgb(247,22,47)" fg:x="39761" fg:w="6"/><text x="83.7517%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.5017%" y="1141" width="0.0126%" height="15" fill="rgb(218,84,22)" fg:x="39761" fg:w="6"/><text x="83.7517%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="83.4660%" y="1205" width="0.0525%" height="15" fill="rgb(216,87,39)" fg:x="39744" fg:w="25"/><text x="83.7160%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="83.4660%" y="1189" width="0.0525%" height="15" fill="rgb(221,178,8)" fg:x="39744" fg:w="25"/><text x="83.7160%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (71 samples, 0.15%)</title><rect x="83.3778%" y="1317" width="0.1491%" height="15" fill="rgb(230,42,11)" fg:x="39702" fg:w="71"/><text x="83.6278%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (71 samples, 0.15%)</title><rect x="83.3778%" y="1301" width="0.1491%" height="15" fill="rgb(237,229,4)" fg:x="39702" fg:w="71"/><text x="83.6278%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (70 samples, 0.15%)</title><rect x="83.3799%" y="1285" width="0.1470%" height="15" fill="rgb(222,31,33)" fg:x="39703" fg:w="70"/><text x="83.6299%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (31 samples, 0.07%)</title><rect x="83.4618%" y="1269" width="0.0651%" height="15" fill="rgb(210,17,39)" fg:x="39742" fg:w="31"/><text x="83.7118%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (31 samples, 0.07%)</title><rect x="83.4618%" y="1253" width="0.0651%" height="15" fill="rgb(244,93,20)" fg:x="39742" fg:w="31"/><text x="83.7118%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (31 samples, 0.07%)</title><rect x="83.4618%" y="1237" width="0.0651%" height="15" fill="rgb(210,40,47)" fg:x="39742" fg:w="31"/><text x="83.7118%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (29 samples, 0.06%)</title><rect x="83.4660%" y="1221" width="0.0609%" height="15" fill="rgb(239,211,47)" fg:x="39744" fg:w="29"/><text x="83.7160%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (435 samples, 0.91%)</title><rect x="82.6155%" y="1381" width="0.9135%" height="15" fill="rgb(251,223,49)" fg:x="39339" fg:w="435"/><text x="82.8655%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (431 samples, 0.91%)</title><rect x="82.6239%" y="1365" width="0.9051%" height="15" fill="rgb(221,149,5)" fg:x="39343" fg:w="431"/><text x="82.8739%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (370 samples, 0.78%)</title><rect x="82.7520%" y="1349" width="0.7770%" height="15" fill="rgb(219,224,51)" fg:x="39404" fg:w="370"/><text x="83.0020%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (72 samples, 0.15%)</title><rect x="83.3778%" y="1333" width="0.1512%" height="15" fill="rgb(223,7,8)" fg:x="39702" fg:w="72"/><text x="83.6278%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.5605%" y="1221" width="0.0105%" height="15" fill="rgb(241,217,22)" fg:x="39789" fg:w="5"/><text x="83.8105%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="83.5584%" y="1253" width="0.0273%" height="15" fill="rgb(248,209,0)" fg:x="39788" fg:w="13"/><text x="83.8084%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="83.5605%" y="1237" width="0.0252%" height="15" fill="rgb(217,205,4)" fg:x="39789" fg:w="12"/><text x="83.8105%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="83.5710%" y="1221" width="0.0147%" height="15" fill="rgb(228,124,39)" fg:x="39794" fg:w="7"/><text x="83.8210%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.5731%" y="1205" width="0.0126%" height="15" fill="rgb(250,116,42)" fg:x="39795" fg:w="6"/><text x="83.8231%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.5752%" y="1189" width="0.0105%" height="15" fill="rgb(223,202,9)" fg:x="39796" fg:w="5"/><text x="83.8252%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (27 samples, 0.06%)</title><rect x="83.5521%" y="1285" width="0.0567%" height="15" fill="rgb(242,222,40)" fg:x="39785" fg:w="27"/><text x="83.8021%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="83.5563%" y="1269" width="0.0525%" height="15" fill="rgb(229,99,46)" fg:x="39787" fg:w="25"/><text x="83.8063%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="83.5857%" y="1253" width="0.0231%" height="15" fill="rgb(225,56,46)" fg:x="39801" fg:w="11"/><text x="83.8357%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="83.5878%" y="1237" width="0.0210%" height="15" fill="rgb(227,94,5)" fg:x="39802" fg:w="10"/><text x="83.8378%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.5899%" y="1221" width="0.0189%" height="15" fill="rgb(205,112,38)" fg:x="39803" fg:w="9"/><text x="83.8399%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.6172%" y="1237" width="0.0189%" height="15" fill="rgb(231,133,46)" fg:x="39816" fg:w="9"/><text x="83.8672%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="83.6193%" y="1221" width="0.0168%" height="15" fill="rgb(217,16,9)" fg:x="39817" fg:w="8"/><text x="83.8693%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="83.6235%" y="1205" width="0.0126%" height="15" fill="rgb(249,173,9)" fg:x="39819" fg:w="6"/><text x="83.8735%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.6235%" y="1189" width="0.0126%" height="15" fill="rgb(205,163,53)" fg:x="39819" fg:w="6"/><text x="83.8735%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.6256%" y="1173" width="0.0105%" height="15" fill="rgb(217,54,41)" fg:x="39820" fg:w="5"/><text x="83.8756%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="83.6361%" y="1237" width="0.0105%" height="15" fill="rgb(228,216,12)" fg:x="39825" fg:w="5"/><text x="83.8861%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.6361%" y="1221" width="0.0105%" height="15" fill="rgb(244,228,15)" fg:x="39825" fg:w="5"/><text x="83.8861%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (27 samples, 0.06%)</title><rect x="83.6088%" y="1285" width="0.0567%" height="15" fill="rgb(221,176,53)" fg:x="39812" fg:w="27"/><text x="83.8588%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (26 samples, 0.05%)</title><rect x="83.6109%" y="1269" width="0.0546%" height="15" fill="rgb(205,94,34)" fg:x="39813" fg:w="26"/><text x="83.8609%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (23 samples, 0.05%)</title><rect x="83.6172%" y="1253" width="0.0483%" height="15" fill="rgb(213,110,48)" fg:x="39816" fg:w="23"/><text x="83.8672%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="83.6466%" y="1237" width="0.0189%" height="15" fill="rgb(236,142,28)" fg:x="39830" fg:w="9"/><text x="83.8966%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="83.6466%" y="1221" width="0.0189%" height="15" fill="rgb(225,135,29)" fg:x="39830" fg:w="9"/><text x="83.8966%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.6466%" y="1205" width="0.0189%" height="15" fill="rgb(252,45,31)" fg:x="39830" fg:w="9"/><text x="83.8966%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.6466%" y="1189" width="0.0189%" height="15" fill="rgb(211,187,50)" fg:x="39830" fg:w="9"/><text x="83.8966%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="83.6550%" y="1173" width="0.0105%" height="15" fill="rgb(229,109,7)" fg:x="39834" fg:w="5"/><text x="83.9050%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.6550%" y="1157" width="0.0105%" height="15" fill="rgb(251,131,51)" fg:x="39834" fg:w="5"/><text x="83.9050%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="83.6550%" y="1141" width="0.0105%" height="15" fill="rgb(251,180,35)" fg:x="39834" fg:w="5"/><text x="83.9050%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="83.6697%" y="1221" width="0.0294%" height="15" fill="rgb(211,46,32)" fg:x="39841" fg:w="14"/><text x="83.9197%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="83.6718%" y="1205" width="0.0273%" height="15" fill="rgb(248,123,17)" fg:x="39842" fg:w="13"/><text x="83.9218%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="83.6802%" y="1189" width="0.0189%" height="15" fill="rgb(227,141,18)" fg:x="39846" fg:w="9"/><text x="83.9302%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.6802%" y="1173" width="0.0189%" height="15" fill="rgb(216,102,9)" fg:x="39846" fg:w="9"/><text x="83.9302%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.6802%" y="1157" width="0.0189%" height="15" fill="rgb(253,47,13)" fg:x="39846" fg:w="9"/><text x="83.9302%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (88 samples, 0.18%)</title><rect x="83.5353%" y="1317" width="0.1848%" height="15" fill="rgb(226,93,23)" fg:x="39777" fg:w="88"/><text x="83.7853%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (81 samples, 0.17%)</title><rect x="83.5500%" y="1301" width="0.1701%" height="15" fill="rgb(247,104,17)" fg:x="39784" fg:w="81"/><text x="83.8000%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (26 samples, 0.05%)</title><rect x="83.6655%" y="1285" width="0.0546%" height="15" fill="rgb(233,203,26)" fg:x="39839" fg:w="26"/><text x="83.9155%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (26 samples, 0.05%)</title><rect x="83.6655%" y="1269" width="0.0546%" height="15" fill="rgb(244,98,49)" fg:x="39839" fg:w="26"/><text x="83.9155%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (26 samples, 0.05%)</title><rect x="83.6655%" y="1253" width="0.0546%" height="15" fill="rgb(235,134,22)" fg:x="39839" fg:w="26"/><text x="83.9155%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (24 samples, 0.05%)</title><rect x="83.6697%" y="1237" width="0.0504%" height="15" fill="rgb(221,70,32)" fg:x="39841" fg:w="24"/><text x="83.9197%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (10 samples, 0.02%)</title><rect x="83.6991%" y="1221" width="0.0210%" height="15" fill="rgb(238,15,50)" fg:x="39855" fg:w="10"/><text x="83.9491%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (10 samples, 0.02%)</title><rect x="83.6991%" y="1205" width="0.0210%" height="15" fill="rgb(215,221,48)" fg:x="39855" fg:w="10"/><text x="83.9491%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="83.6991%" y="1189" width="0.0210%" height="15" fill="rgb(236,73,3)" fg:x="39855" fg:w="10"/><text x="83.9491%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="83.7033%" y="1173" width="0.0168%" height="15" fill="rgb(250,107,11)" fg:x="39857" fg:w="8"/><text x="83.9533%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="83.7390%" y="1141" width="0.0168%" height="15" fill="rgb(242,39,14)" fg:x="39874" fg:w="8"/><text x="83.9890%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="83.7411%" y="1125" width="0.0147%" height="15" fill="rgb(248,164,37)" fg:x="39875" fg:w="7"/><text x="83.9911%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="83.7285%" y="1237" width="0.0294%" height="15" fill="rgb(217,60,12)" fg:x="39869" fg:w="14"/><text x="83.9785%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="83.7327%" y="1221" width="0.0252%" height="15" fill="rgb(240,125,29)" fg:x="39871" fg:w="12"/><text x="83.9827%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="83.7390%" y="1205" width="0.0189%" height="15" fill="rgb(208,207,28)" fg:x="39874" fg:w="9"/><text x="83.9890%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="83.7390%" y="1189" width="0.0189%" height="15" fill="rgb(209,159,27)" fg:x="39874" fg:w="9"/><text x="83.9890%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="83.7390%" y="1173" width="0.0189%" height="15" fill="rgb(251,176,53)" fg:x="39874" fg:w="9"/><text x="83.9890%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="83.7390%" y="1157" width="0.0189%" height="15" fill="rgb(211,85,7)" fg:x="39874" fg:w="9"/><text x="83.9890%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="83.7222%" y="1269" width="0.0378%" height="15" fill="rgb(216,64,54)" fg:x="39866" fg:w="18"/><text x="83.9722%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="83.7285%" y="1253" width="0.0315%" height="15" fill="rgb(217,54,24)" fg:x="39869" fg:w="15"/><text x="83.9785%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.7663%" y="1173" width="0.0126%" height="15" fill="rgb(208,206,53)" fg:x="39887" fg:w="6"/><text x="84.0163%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.7663%" y="1157" width="0.0126%" height="15" fill="rgb(251,74,39)" fg:x="39887" fg:w="6"/><text x="84.0163%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="83.7663%" y="1205" width="0.0252%" height="15" fill="rgb(226,47,5)" fg:x="39887" fg:w="12"/><text x="84.0163%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="83.7663%" y="1189" width="0.0252%" height="15" fill="rgb(234,111,33)" fg:x="39887" fg:w="12"/><text x="84.0163%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="83.7810%" y="1173" width="0.0105%" height="15" fill="rgb(251,14,10)" fg:x="39894" fg:w="5"/><text x="84.0310%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="83.7810%" y="1157" width="0.0105%" height="15" fill="rgb(232,43,0)" fg:x="39894" fg:w="5"/><text x="84.0310%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.7810%" y="1141" width="0.0105%" height="15" fill="rgb(222,68,43)" fg:x="39894" fg:w="5"/><text x="84.0310%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (35 samples, 0.07%)</title><rect x="83.7201%" y="1317" width="0.0735%" height="15" fill="rgb(217,24,23)" fg:x="39865" fg:w="35"/><text x="83.9701%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (35 samples, 0.07%)</title><rect x="83.7201%" y="1301" width="0.0735%" height="15" fill="rgb(229,209,14)" fg:x="39865" fg:w="35"/><text x="83.9701%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (34 samples, 0.07%)</title><rect x="83.7222%" y="1285" width="0.0714%" height="15" fill="rgb(250,149,48)" fg:x="39866" fg:w="34"/><text x="83.9722%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="83.7663%" y="1269" width="0.0273%" height="15" fill="rgb(210,120,37)" fg:x="39887" fg:w="13"/><text x="84.0163%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="83.7663%" y="1253" width="0.0273%" height="15" fill="rgb(210,21,8)" fg:x="39887" fg:w="13"/><text x="84.0163%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="83.7663%" y="1237" width="0.0273%" height="15" fill="rgb(243,145,7)" fg:x="39887" fg:w="13"/><text x="84.0163%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="83.7663%" y="1221" width="0.0273%" height="15" fill="rgb(238,178,32)" fg:x="39887" fg:w="13"/><text x="84.0163%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="83.7978%" y="1253" width="0.0378%" height="15" fill="rgb(222,4,10)" fg:x="39902" fg:w="18"/><text x="84.0478%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="83.8062%" y="1237" width="0.0294%" height="15" fill="rgb(239,7,37)" fg:x="39906" fg:w="14"/><text x="84.0562%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="83.8209%" y="1221" width="0.0147%" height="15" fill="rgb(215,31,37)" fg:x="39913" fg:w="7"/><text x="84.0709%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="83.8209%" y="1205" width="0.0147%" height="15" fill="rgb(224,83,33)" fg:x="39913" fg:w="7"/><text x="84.0709%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="83.8209%" y="1189" width="0.0147%" height="15" fill="rgb(239,55,3)" fg:x="39913" fg:w="7"/><text x="84.0709%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.8230%" y="1173" width="0.0126%" height="15" fill="rgb(247,92,11)" fg:x="39914" fg:w="6"/><text x="84.0730%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.8230%" y="1157" width="0.0126%" height="15" fill="rgb(239,200,7)" fg:x="39914" fg:w="6"/><text x="84.0730%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.8230%" y="1141" width="0.0126%" height="15" fill="rgb(227,115,8)" fg:x="39914" fg:w="6"/><text x="84.0730%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="83.8440%" y="1189" width="0.0105%" height="15" fill="rgb(215,189,27)" fg:x="39924" fg:w="5"/><text x="84.0940%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (1,110 samples, 2.33%)</title><rect x="81.5255%" y="1429" width="2.3311%" height="15" fill="rgb(251,216,39)" fg:x="38820" fg:w="1110"/><text x="81.7755%" y="1439.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (1,106 samples, 2.32%)</title><rect x="81.5339%" y="1413" width="2.3227%" height="15" fill="rgb(207,29,47)" fg:x="38824" fg:w="1106"/><text x="81.7839%" y="1423.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (1,064 samples, 2.23%)</title><rect x="81.6221%" y="1397" width="2.2345%" height="15" fill="rgb(210,71,34)" fg:x="38866" fg:w="1064"/><text x="81.8721%" y="1407.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (156 samples, 0.33%)</title><rect x="83.5290%" y="1381" width="0.3276%" height="15" fill="rgb(253,217,51)" fg:x="39774" fg:w="156"/><text x="83.7790%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (155 samples, 0.33%)</title><rect x="83.5311%" y="1365" width="0.3255%" height="15" fill="rgb(222,117,46)" fg:x="39775" fg:w="155"/><text x="83.7811%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (155 samples, 0.33%)</title><rect x="83.5311%" y="1349" width="0.3255%" height="15" fill="rgb(226,132,6)" fg:x="39775" fg:w="155"/><text x="83.7811%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (153 samples, 0.32%)</title><rect x="83.5353%" y="1333" width="0.3213%" height="15" fill="rgb(254,145,51)" fg:x="39777" fg:w="153"/><text x="83.7853%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (30 samples, 0.06%)</title><rect x="83.7936%" y="1317" width="0.0630%" height="15" fill="rgb(231,199,27)" fg:x="39900" fg:w="30"/><text x="84.0436%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (30 samples, 0.06%)</title><rect x="83.7936%" y="1301" width="0.0630%" height="15" fill="rgb(245,158,14)" fg:x="39900" fg:w="30"/><text x="84.0436%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="83.7957%" y="1285" width="0.0609%" height="15" fill="rgb(240,113,14)" fg:x="39901" fg:w="29"/><text x="84.0457%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="83.7978%" y="1269" width="0.0588%" height="15" fill="rgb(210,20,13)" fg:x="39902" fg:w="28"/><text x="84.0478%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="83.8440%" y="1253" width="0.0126%" height="15" fill="rgb(241,144,13)" fg:x="39924" fg:w="6"/><text x="84.0940%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="83.8440%" y="1237" width="0.0126%" height="15" fill="rgb(235,43,34)" fg:x="39924" fg:w="6"/><text x="84.0940%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="83.8440%" y="1221" width="0.0126%" height="15" fill="rgb(208,36,20)" fg:x="39924" fg:w="6"/><text x="84.0940%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="83.8440%" y="1205" width="0.0126%" height="15" fill="rgb(239,204,10)" fg:x="39924" fg:w="6"/><text x="84.0940%" y="1215.50"></text></g><g><title>libsystem_kernel.dylib`swtch_pri (5 samples, 0.01%)</title><rect x="83.8566%" y="1413" width="0.0105%" height="15" fill="rgb(217,84,43)" fg:x="39930" fg:w="5"/><text x="84.1066%" y="1423.50"></text></g><g><title>libsystem_m.dylib`exp (12 samples, 0.03%)</title><rect x="83.8776%" y="1381" width="0.0252%" height="15" fill="rgb(241,170,50)" fg:x="39940" fg:w="12"/><text x="84.1276%" y="1391.50"></text></g><g><title>libsystem_m.dylib`exp (11 samples, 0.02%)</title><rect x="83.9091%" y="1349" width="0.0231%" height="15" fill="rgb(226,205,29)" fg:x="39955" fg:w="11"/><text x="84.1591%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (14 samples, 0.03%)</title><rect x="83.9448%" y="1317" width="0.0294%" height="15" fill="rgb(233,113,1)" fg:x="39972" fg:w="14"/><text x="84.1948%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="83.9826%" y="1285" width="0.0210%" height="15" fill="rgb(253,98,13)" fg:x="39990" fg:w="10"/><text x="84.2326%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="84.0120%" y="1253" width="0.0189%" height="15" fill="rgb(211,115,12)" fg:x="40004" fg:w="9"/><text x="84.2620%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (11 samples, 0.02%)</title><rect x="84.0435%" y="1173" width="0.0231%" height="15" fill="rgb(208,12,16)" fg:x="40019" fg:w="11"/><text x="84.2935%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (9 samples, 0.02%)</title><rect x="84.0477%" y="1157" width="0.0189%" height="15" fill="rgb(237,193,54)" fg:x="40021" fg:w="9"/><text x="84.2977%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="84.0666%" y="1173" width="0.0105%" height="15" fill="rgb(243,22,42)" fg:x="40030" fg:w="5"/><text x="84.3166%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (23 samples, 0.05%)</title><rect x="84.0393%" y="1189" width="0.0483%" height="15" fill="rgb(233,151,36)" fg:x="40017" fg:w="23"/><text x="84.2893%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="84.0372%" y="1205" width="0.0525%" height="15" fill="rgb(237,57,45)" fg:x="40016" fg:w="25"/><text x="84.2872%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (30 samples, 0.06%)</title><rect x="84.0330%" y="1237" width="0.0630%" height="15" fill="rgb(221,88,17)" fg:x="40014" fg:w="30"/><text x="84.2830%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="84.0372%" y="1221" width="0.0588%" height="15" fill="rgb(230,79,15)" fg:x="40016" fg:w="28"/><text x="84.2872%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="84.1002%" y="1189" width="0.0147%" height="15" fill="rgb(213,57,13)" fg:x="40046" fg:w="7"/><text x="84.3502%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (56 samples, 0.12%)</title><rect x="84.0078%" y="1269" width="0.1176%" height="15" fill="rgb(222,116,39)" fg:x="40002" fg:w="56"/><text x="84.2578%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (45 samples, 0.09%)</title><rect x="84.0309%" y="1253" width="0.0945%" height="15" fill="rgb(245,107,2)" fg:x="40013" fg:w="45"/><text x="84.2809%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="84.0960%" y="1237" width="0.0294%" height="15" fill="rgb(238,1,10)" fg:x="40044" fg:w="14"/><text x="84.3460%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="84.0960%" y="1221" width="0.0294%" height="15" fill="rgb(249,4,48)" fg:x="40044" fg:w="14"/><text x="84.3460%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="84.1002%" y="1205" width="0.0252%" height="15" fill="rgb(223,151,18)" fg:x="40046" fg:w="12"/><text x="84.3502%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.1149%" y="1189" width="0.0105%" height="15" fill="rgb(227,65,43)" fg:x="40053" fg:w="5"/><text x="84.3649%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.1149%" y="1173" width="0.0105%" height="15" fill="rgb(218,40,45)" fg:x="40053" fg:w="5"/><text x="84.3649%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="84.1149%" y="1157" width="0.0105%" height="15" fill="rgb(252,121,31)" fg:x="40053" fg:w="5"/><text x="84.3649%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="84.1275%" y="1253" width="0.0105%" height="15" fill="rgb(219,158,43)" fg:x="40059" fg:w="5"/><text x="84.3775%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="84.1485%" y="1221" width="0.0189%" height="15" fill="rgb(231,162,42)" fg:x="40069" fg:w="9"/><text x="84.3985%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="84.1485%" y="1205" width="0.0189%" height="15" fill="rgb(217,179,25)" fg:x="40069" fg:w="9"/><text x="84.3985%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="84.1548%" y="1189" width="0.0126%" height="15" fill="rgb(206,212,31)" fg:x="40072" fg:w="6"/><text x="84.4048%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.1548%" y="1173" width="0.0126%" height="15" fill="rgb(235,144,12)" fg:x="40072" fg:w="6"/><text x="84.4048%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="84.1674%" y="1221" width="0.0126%" height="15" fill="rgb(213,51,10)" fg:x="40078" fg:w="6"/><text x="84.4174%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.1674%" y="1205" width="0.0126%" height="15" fill="rgb(231,145,14)" fg:x="40078" fg:w="6"/><text x="84.4174%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (31 samples, 0.07%)</title><rect x="84.1254%" y="1269" width="0.0651%" height="15" fill="rgb(235,15,28)" fg:x="40058" fg:w="31"/><text x="84.3754%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="84.1380%" y="1253" width="0.0525%" height="15" fill="rgb(237,206,10)" fg:x="40064" fg:w="25"/><text x="84.3880%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="84.1485%" y="1237" width="0.0420%" height="15" fill="rgb(236,227,27)" fg:x="40069" fg:w="20"/><text x="84.3985%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.1800%" y="1221" width="0.0105%" height="15" fill="rgb(246,83,35)" fg:x="40084" fg:w="5"/><text x="84.4300%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.1800%" y="1205" width="0.0105%" height="15" fill="rgb(220,136,24)" fg:x="40084" fg:w="5"/><text x="84.4300%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.1800%" y="1189" width="0.0105%" height="15" fill="rgb(217,3,25)" fg:x="40084" fg:w="5"/><text x="84.4300%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.1800%" y="1173" width="0.0105%" height="15" fill="rgb(239,24,14)" fg:x="40084" fg:w="5"/><text x="84.4300%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (103 samples, 0.22%)</title><rect x="83.9784%" y="1301" width="0.2163%" height="15" fill="rgb(244,16,53)" fg:x="39988" fg:w="103"/><text x="84.2284%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (91 samples, 0.19%)</title><rect x="84.0036%" y="1285" width="0.1911%" height="15" fill="rgb(208,175,44)" fg:x="40000" fg:w="91"/><text x="84.2536%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="84.1989%" y="1269" width="0.0126%" height="15" fill="rgb(252,18,48)" fg:x="40093" fg:w="6"/><text x="84.4489%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="84.2178%" y="1237" width="0.0126%" height="15" fill="rgb(234,199,32)" fg:x="40102" fg:w="6"/><text x="84.4678%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="84.2346%" y="1221" width="0.0168%" height="15" fill="rgb(225,77,54)" fg:x="40110" fg:w="8"/><text x="84.4846%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.2409%" y="1205" width="0.0105%" height="15" fill="rgb(225,42,25)" fg:x="40113" fg:w="5"/><text x="84.4909%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (28 samples, 0.06%)</title><rect x="84.2115%" y="1253" width="0.0588%" height="15" fill="rgb(242,227,46)" fg:x="40099" fg:w="28"/><text x="84.4615%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="84.2304%" y="1237" width="0.0399%" height="15" fill="rgb(246,197,35)" fg:x="40108" fg:w="19"/><text x="84.4804%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="84.2514%" y="1221" width="0.0189%" height="15" fill="rgb(215,159,26)" fg:x="40118" fg:w="9"/><text x="84.5014%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="84.2514%" y="1205" width="0.0189%" height="15" fill="rgb(212,194,50)" fg:x="40118" fg:w="9"/><text x="84.5014%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.2577%" y="1189" width="0.0126%" height="15" fill="rgb(246,132,1)" fg:x="40121" fg:w="6"/><text x="84.5077%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (54 samples, 0.11%)</title><rect x="84.1947%" y="1301" width="0.1134%" height="15" fill="rgb(217,71,7)" fg:x="40091" fg:w="54"/><text x="84.4447%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (52 samples, 0.11%)</title><rect x="84.1989%" y="1285" width="0.1092%" height="15" fill="rgb(252,59,32)" fg:x="40093" fg:w="52"/><text x="84.4489%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (46 samples, 0.10%)</title><rect x="84.2115%" y="1269" width="0.0966%" height="15" fill="rgb(253,204,25)" fg:x="40099" fg:w="46"/><text x="84.4615%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (18 samples, 0.04%)</title><rect x="84.2703%" y="1253" width="0.0378%" height="15" fill="rgb(232,21,16)" fg:x="40127" fg:w="18"/><text x="84.5203%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="84.2703%" y="1237" width="0.0378%" height="15" fill="rgb(248,90,29)" fg:x="40127" fg:w="18"/><text x="84.5203%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="84.2808%" y="1221" width="0.0273%" height="15" fill="rgb(249,223,7)" fg:x="40132" fg:w="13"/><text x="84.5308%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="84.2892%" y="1205" width="0.0189%" height="15" fill="rgb(231,119,42)" fg:x="40136" fg:w="9"/><text x="84.5392%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="84.2913%" y="1189" width="0.0168%" height="15" fill="rgb(215,41,35)" fg:x="40137" fg:w="8"/><text x="84.5413%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.2955%" y="1173" width="0.0126%" height="15" fill="rgb(220,44,45)" fg:x="40139" fg:w="6"/><text x="84.5455%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.3102%" y="1205" width="0.0126%" height="15" fill="rgb(253,197,36)" fg:x="40146" fg:w="6"/><text x="84.5602%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.3102%" y="1189" width="0.0126%" height="15" fill="rgb(245,225,54)" fg:x="40146" fg:w="6"/><text x="84.5602%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="84.3102%" y="1237" width="0.0210%" height="15" fill="rgb(239,94,37)" fg:x="40146" fg:w="10"/><text x="84.5602%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="84.3102%" y="1221" width="0.0210%" height="15" fill="rgb(242,217,10)" fg:x="40146" fg:w="10"/><text x="84.5602%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="1173" width="0.0105%" height="15" fill="rgb(250,193,7)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="1157" width="0.0105%" height="15" fill="rgb(230,104,19)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="1141" width="0.0105%" height="15" fill="rgb(230,181,4)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="1125" width="0.0105%" height="15" fill="rgb(216,219,49)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="1109" width="0.0105%" height="15" fill="rgb(254,144,0)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="1093" width="0.0105%" height="15" fill="rgb(205,209,38)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.3333%" y="1077" width="0.0105%" height="15" fill="rgb(240,21,42)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.3333%" y="1061" width="0.0105%" height="15" fill="rgb(241,132,3)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="1045" width="0.0105%" height="15" fill="rgb(225,14,2)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="1029" width="0.0105%" height="15" fill="rgb(210,141,35)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.3333%" y="1013" width="0.0105%" height="15" fill="rgb(251,14,44)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.3333%" y="997" width="0.0105%" height="15" fill="rgb(247,48,18)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="981" width="0.0105%" height="15" fill="rgb(225,0,40)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="965" width="0.0105%" height="15" fill="rgb(221,31,33)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="949" width="0.0105%" height="15" fill="rgb(237,42,40)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="933" width="0.0105%" height="15" fill="rgb(233,51,29)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="917" width="0.0105%" height="15" fill="rgb(226,58,20)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="901" width="0.0105%" height="15" fill="rgb(208,98,7)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.3333%" y="885" width="0.0105%" height="15" fill="rgb(228,143,44)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.3333%" y="869" width="0.0105%" height="15" fill="rgb(246,55,38)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="853" width="0.0105%" height="15" fill="rgb(247,87,16)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="837" width="0.0105%" height="15" fill="rgb(234,129,42)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="821" width="0.0105%" height="15" fill="rgb(220,82,16)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="805" width="0.0105%" height="15" fill="rgb(211,88,4)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.3333%" y="789" width="0.0105%" height="15" fill="rgb(248,151,21)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.3333%" y="773" width="0.0105%" height="15" fill="rgb(238,163,6)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="757" width="0.0105%" height="15" fill="rgb(209,183,11)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="741" width="0.0105%" height="15" fill="rgb(219,37,20)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.3333%" y="725" width="0.0105%" height="15" fill="rgb(210,158,4)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.3333%" y="709" width="0.0105%" height="15" fill="rgb(221,167,53)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.3333%" y="693" width="0.0105%" height="15" fill="rgb(237,151,45)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.3333%" y="677" width="0.0105%" height="15" fill="rgb(231,39,3)" fg:x="40157" fg:w="5"/><text x="84.5833%" y="687.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (194 samples, 0.41%)</title><rect x="83.9406%" y="1333" width="0.4074%" height="15" fill="rgb(212,167,28)" fg:x="39970" fg:w="194"/><text x="84.1906%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (178 samples, 0.37%)</title><rect x="83.9742%" y="1317" width="0.3738%" height="15" fill="rgb(232,178,8)" fg:x="39986" fg:w="178"/><text x="84.2242%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (19 samples, 0.04%)</title><rect x="84.3081%" y="1301" width="0.0399%" height="15" fill="rgb(225,151,20)" fg:x="40145" fg:w="19"/><text x="84.5581%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (19 samples, 0.04%)</title><rect x="84.3081%" y="1285" width="0.0399%" height="15" fill="rgb(238,3,37)" fg:x="40145" fg:w="19"/><text x="84.5581%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="84.3081%" y="1269" width="0.0399%" height="15" fill="rgb(251,147,42)" fg:x="40145" fg:w="19"/><text x="84.5581%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="84.3102%" y="1253" width="0.0378%" height="15" fill="rgb(208,173,10)" fg:x="40146" fg:w="18"/><text x="84.5602%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="84.3312%" y="1237" width="0.0168%" height="15" fill="rgb(246,225,4)" fg:x="40156" fg:w="8"/><text x="84.5812%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="84.3312%" y="1221" width="0.0168%" height="15" fill="rgb(248,102,6)" fg:x="40156" fg:w="8"/><text x="84.5812%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="84.3312%" y="1205" width="0.0168%" height="15" fill="rgb(232,6,21)" fg:x="40156" fg:w="8"/><text x="84.5812%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="84.3333%" y="1189" width="0.0147%" height="15" fill="rgb(221,179,22)" fg:x="40157" fg:w="7"/><text x="84.5833%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="84.3501%" y="1301" width="0.0210%" height="15" fill="rgb(252,50,20)" fg:x="40165" fg:w="10"/><text x="84.6001%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="84.3984%" y="1237" width="0.0105%" height="15" fill="rgb(222,56,38)" fg:x="40188" fg:w="5"/><text x="84.6484%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="84.4131%" y="1221" width="0.0168%" height="15" fill="rgb(206,193,29)" fg:x="40195" fg:w="8"/><text x="84.6631%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.4194%" y="1205" width="0.0105%" height="15" fill="rgb(239,192,45)" fg:x="40198" fg:w="5"/><text x="84.6694%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="84.4299%" y="1221" width="0.0147%" height="15" fill="rgb(254,18,36)" fg:x="40203" fg:w="7"/><text x="84.6799%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.4320%" y="1205" width="0.0126%" height="15" fill="rgb(221,127,11)" fg:x="40204" fg:w="6"/><text x="84.6820%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="84.3942%" y="1253" width="0.0525%" height="15" fill="rgb(234,146,35)" fg:x="40186" fg:w="25"/><text x="84.6442%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="84.4110%" y="1237" width="0.0357%" height="15" fill="rgb(254,201,37)" fg:x="40194" fg:w="17"/><text x="84.6610%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="84.4509%" y="1221" width="0.0126%" height="15" fill="rgb(211,202,23)" fg:x="40213" fg:w="6"/><text x="84.7009%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="84.4467%" y="1253" width="0.0315%" height="15" fill="rgb(237,91,2)" fg:x="40211" fg:w="15"/><text x="84.6967%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="84.4488%" y="1237" width="0.0294%" height="15" fill="rgb(226,228,36)" fg:x="40212" fg:w="14"/><text x="84.6988%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="84.4635%" y="1221" width="0.0147%" height="15" fill="rgb(213,63,50)" fg:x="40219" fg:w="7"/><text x="84.7135%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="84.4656%" y="1205" width="0.0126%" height="15" fill="rgb(235,194,19)" fg:x="40220" fg:w="6"/><text x="84.7156%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.4656%" y="1189" width="0.0126%" height="15" fill="rgb(207,204,18)" fg:x="40220" fg:w="6"/><text x="84.7156%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.4677%" y="1173" width="0.0105%" height="15" fill="rgb(248,8,7)" fg:x="40221" fg:w="5"/><text x="84.7177%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (52 samples, 0.11%)</title><rect x="84.3753%" y="1285" width="0.1092%" height="15" fill="rgb(223,145,47)" fg:x="40177" fg:w="52"/><text x="84.6253%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (47 samples, 0.10%)</title><rect x="84.3858%" y="1269" width="0.0987%" height="15" fill="rgb(228,84,11)" fg:x="40182" fg:w="47"/><text x="84.6358%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.5160%" y="1205" width="0.0105%" height="15" fill="rgb(218,76,45)" fg:x="40244" fg:w="5"/><text x="84.7660%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="84.5013%" y="1237" width="0.0504%" height="15" fill="rgb(223,80,15)" fg:x="40237" fg:w="24"/><text x="84.7513%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="84.5118%" y="1221" width="0.0399%" height="15" fill="rgb(219,218,33)" fg:x="40242" fg:w="19"/><text x="84.7618%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="84.5328%" y="1205" width="0.0189%" height="15" fill="rgb(208,51,11)" fg:x="40252" fg:w="9"/><text x="84.7828%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="84.5328%" y="1189" width="0.0189%" height="15" fill="rgb(229,165,39)" fg:x="40252" fg:w="9"/><text x="84.7828%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="84.5328%" y="1173" width="0.0189%" height="15" fill="rgb(241,100,24)" fg:x="40252" fg:w="9"/><text x="84.7828%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="84.5328%" y="1157" width="0.0189%" height="15" fill="rgb(228,14,23)" fg:x="40252" fg:w="9"/><text x="84.7828%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="84.5391%" y="1141" width="0.0126%" height="15" fill="rgb(247,116,52)" fg:x="40255" fg:w="6"/><text x="84.7891%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.5391%" y="1125" width="0.0126%" height="15" fill="rgb(216,149,33)" fg:x="40255" fg:w="6"/><text x="84.7891%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.5391%" y="1109" width="0.0126%" height="15" fill="rgb(238,142,29)" fg:x="40255" fg:w="6"/><text x="84.7891%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.5517%" y="1237" width="0.0105%" height="15" fill="rgb(224,83,40)" fg:x="40261" fg:w="5"/><text x="84.8017%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (49 samples, 0.10%)</title><rect x="84.4845%" y="1285" width="0.1029%" height="15" fill="rgb(234,165,11)" fg:x="40229" fg:w="49"/><text x="84.7345%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (47 samples, 0.10%)</title><rect x="84.4887%" y="1269" width="0.0987%" height="15" fill="rgb(215,96,23)" fg:x="40231" fg:w="47"/><text x="84.7387%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (41 samples, 0.09%)</title><rect x="84.5013%" y="1253" width="0.0861%" height="15" fill="rgb(233,179,26)" fg:x="40237" fg:w="41"/><text x="84.7513%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="84.5622%" y="1237" width="0.0252%" height="15" fill="rgb(225,129,33)" fg:x="40266" fg:w="12"/><text x="84.8122%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="84.5643%" y="1221" width="0.0231%" height="15" fill="rgb(237,49,13)" fg:x="40267" fg:w="11"/><text x="84.8143%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="84.5643%" y="1205" width="0.0231%" height="15" fill="rgb(211,3,31)" fg:x="40267" fg:w="11"/><text x="84.8143%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="84.5643%" y="1189" width="0.0231%" height="15" fill="rgb(216,152,19)" fg:x="40267" fg:w="11"/><text x="84.8143%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.5748%" y="1173" width="0.0126%" height="15" fill="rgb(251,121,35)" fg:x="40272" fg:w="6"/><text x="84.8248%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="84.5748%" y="1157" width="0.0126%" height="15" fill="rgb(210,217,47)" fg:x="40272" fg:w="6"/><text x="84.8248%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.5748%" y="1141" width="0.0126%" height="15" fill="rgb(244,116,22)" fg:x="40272" fg:w="6"/><text x="84.8248%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.5748%" y="1125" width="0.0126%" height="15" fill="rgb(228,17,21)" fg:x="40272" fg:w="6"/><text x="84.8248%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.6000%" y="1157" width="0.0105%" height="15" fill="rgb(240,149,34)" fg:x="40284" fg:w="5"/><text x="84.8500%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.6000%" y="1141" width="0.0105%" height="15" fill="rgb(208,125,47)" fg:x="40284" fg:w="5"/><text x="84.8500%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (129 samples, 0.27%)</title><rect x="84.3480%" y="1333" width="0.2709%" height="15" fill="rgb(249,186,39)" fg:x="40164" fg:w="129"/><text x="84.5980%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (128 samples, 0.27%)</title><rect x="84.3501%" y="1317" width="0.2688%" height="15" fill="rgb(240,220,33)" fg:x="40165" fg:w="128"/><text x="84.6001%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (117 samples, 0.25%)</title><rect x="84.3732%" y="1301" width="0.2457%" height="15" fill="rgb(243,110,23)" fg:x="40176" fg:w="117"/><text x="84.6232%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (15 samples, 0.03%)</title><rect x="84.5874%" y="1285" width="0.0315%" height="15" fill="rgb(219,163,46)" fg:x="40278" fg:w="15"/><text x="84.8374%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (15 samples, 0.03%)</title><rect x="84.5874%" y="1269" width="0.0315%" height="15" fill="rgb(216,126,30)" fg:x="40278" fg:w="15"/><text x="84.8374%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="84.5874%" y="1253" width="0.0315%" height="15" fill="rgb(208,139,11)" fg:x="40278" fg:w="15"/><text x="84.8374%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="84.5895%" y="1237" width="0.0294%" height="15" fill="rgb(213,118,36)" fg:x="40279" fg:w="14"/><text x="84.8395%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="84.6000%" y="1221" width="0.0189%" height="15" fill="rgb(226,43,17)" fg:x="40284" fg:w="9"/><text x="84.8500%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="84.6000%" y="1205" width="0.0189%" height="15" fill="rgb(254,217,4)" fg:x="40284" fg:w="9"/><text x="84.8500%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="84.6000%" y="1189" width="0.0189%" height="15" fill="rgb(210,134,47)" fg:x="40284" fg:w="9"/><text x="84.8500%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="84.6000%" y="1173" width="0.0189%" height="15" fill="rgb(237,24,49)" fg:x="40284" fg:w="9"/><text x="84.8500%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.6315%" y="1205" width="0.0105%" height="15" fill="rgb(251,39,46)" fg:x="40299" fg:w="5"/><text x="84.8815%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="84.6294%" y="1237" width="0.0231%" height="15" fill="rgb(251,220,3)" fg:x="40298" fg:w="11"/><text x="84.8794%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="84.6315%" y="1221" width="0.0210%" height="15" fill="rgb(228,105,12)" fg:x="40299" fg:w="10"/><text x="84.8815%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="84.6252%" y="1269" width="0.0378%" height="15" fill="rgb(215,196,1)" fg:x="40296" fg:w="18"/><text x="84.8752%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="84.6294%" y="1253" width="0.0336%" height="15" fill="rgb(214,33,39)" fg:x="40298" fg:w="16"/><text x="84.8794%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="84.6735%" y="1173" width="0.0168%" height="15" fill="rgb(220,19,52)" fg:x="40319" fg:w="8"/><text x="84.9235%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="84.6735%" y="1157" width="0.0168%" height="15" fill="rgb(221,78,38)" fg:x="40319" fg:w="8"/><text x="84.9235%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.6798%" y="1141" width="0.0105%" height="15" fill="rgb(253,30,16)" fg:x="40322" fg:w="5"/><text x="84.9298%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.6798%" y="1125" width="0.0105%" height="15" fill="rgb(242,65,0)" fg:x="40322" fg:w="5"/><text x="84.9298%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="84.6693%" y="1205" width="0.0315%" height="15" fill="rgb(235,201,12)" fg:x="40317" fg:w="15"/><text x="84.9193%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="84.6735%" y="1189" width="0.0273%" height="15" fill="rgb(233,161,9)" fg:x="40319" fg:w="13"/><text x="84.9235%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (385 samples, 0.81%)</title><rect x="83.9049%" y="1365" width="0.8085%" height="15" fill="rgb(241,207,41)" fg:x="39953" fg:w="385"/><text x="84.1549%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (369 samples, 0.77%)</title><rect x="83.9385%" y="1349" width="0.7749%" height="15" fill="rgb(212,69,46)" fg:x="39969" fg:w="369"/><text x="84.1885%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (45 samples, 0.09%)</title><rect x="84.6189%" y="1333" width="0.0945%" height="15" fill="rgb(239,69,45)" fg:x="40293" fg:w="45"/><text x="84.8689%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (44 samples, 0.09%)</title><rect x="84.6210%" y="1317" width="0.0924%" height="15" fill="rgb(242,117,48)" fg:x="40294" fg:w="44"/><text x="84.8710%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (44 samples, 0.09%)</title><rect x="84.6210%" y="1301" width="0.0924%" height="15" fill="rgb(228,41,36)" fg:x="40294" fg:w="44"/><text x="84.8710%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (42 samples, 0.09%)</title><rect x="84.6252%" y="1285" width="0.0882%" height="15" fill="rgb(212,3,32)" fg:x="40296" fg:w="42"/><text x="84.8752%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (22 samples, 0.05%)</title><rect x="84.6672%" y="1269" width="0.0462%" height="15" fill="rgb(233,41,49)" fg:x="40316" fg:w="22"/><text x="84.9172%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (21 samples, 0.04%)</title><rect x="84.6693%" y="1253" width="0.0441%" height="15" fill="rgb(252,170,49)" fg:x="40317" fg:w="21"/><text x="84.9193%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="84.6693%" y="1237" width="0.0441%" height="15" fill="rgb(229,53,26)" fg:x="40317" fg:w="21"/><text x="84.9193%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="84.6693%" y="1221" width="0.0441%" height="15" fill="rgb(217,157,12)" fg:x="40317" fg:w="21"/><text x="84.9193%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.7008%" y="1205" width="0.0126%" height="15" fill="rgb(227,17,9)" fg:x="40332" fg:w="6"/><text x="84.9508%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="84.7008%" y="1189" width="0.0126%" height="15" fill="rgb(218,84,12)" fg:x="40332" fg:w="6"/><text x="84.9508%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.7029%" y="1173" width="0.0105%" height="15" fill="rgb(212,79,24)" fg:x="40333" fg:w="5"/><text x="84.9529%" y="1183.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="84.7407%" y="1269" width="0.0105%" height="15" fill="rgb(217,222,37)" fg:x="40351" fg:w="5"/><text x="84.9907%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.7533%" y="1253" width="0.0126%" height="15" fill="rgb(246,208,8)" fg:x="40357" fg:w="6"/><text x="85.0033%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="84.7407%" y="1285" width="0.0378%" height="15" fill="rgb(244,133,10)" fg:x="40351" fg:w="18"/><text x="84.9907%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="84.7512%" y="1269" width="0.0273%" height="15" fill="rgb(209,219,41)" fg:x="40356" fg:w="13"/><text x="85.0012%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="84.7659%" y="1253" width="0.0126%" height="15" fill="rgb(253,175,45)" fg:x="40363" fg:w="6"/><text x="85.0159%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.7995%" y="1189" width="0.0105%" height="15" fill="rgb(235,100,37)" fg:x="40379" fg:w="5"/><text x="85.0495%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.7995%" y="1173" width="0.0105%" height="15" fill="rgb(225,87,19)" fg:x="40379" fg:w="5"/><text x="85.0495%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (47 samples, 0.10%)</title><rect x="84.7239%" y="1317" width="0.0987%" height="15" fill="rgb(217,152,17)" fg:x="40343" fg:w="47"/><text x="84.9739%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (41 samples, 0.09%)</title><rect x="84.7365%" y="1301" width="0.0861%" height="15" fill="rgb(235,72,13)" fg:x="40349" fg:w="41"/><text x="84.9865%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (21 samples, 0.04%)</title><rect x="84.7785%" y="1285" width="0.0441%" height="15" fill="rgb(233,140,18)" fg:x="40369" fg:w="21"/><text x="85.0285%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="84.7785%" y="1269" width="0.0441%" height="15" fill="rgb(207,212,28)" fg:x="40369" fg:w="21"/><text x="85.0285%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="84.7848%" y="1253" width="0.0378%" height="15" fill="rgb(220,130,25)" fg:x="40372" fg:w="18"/><text x="85.0348%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="84.7911%" y="1237" width="0.0315%" height="15" fill="rgb(205,55,34)" fg:x="40375" fg:w="15"/><text x="85.0411%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="84.7932%" y="1221" width="0.0294%" height="15" fill="rgb(237,54,35)" fg:x="40376" fg:w="14"/><text x="85.0432%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="84.7995%" y="1205" width="0.0231%" height="15" fill="rgb(208,67,23)" fg:x="40379" fg:w="11"/><text x="85.0495%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.8100%" y="1189" width="0.0126%" height="15" fill="rgb(206,207,50)" fg:x="40384" fg:w="6"/><text x="85.0600%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="84.8100%" y="1173" width="0.0126%" height="15" fill="rgb(213,211,42)" fg:x="40384" fg:w="6"/><text x="85.0600%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.8100%" y="1157" width="0.0126%" height="15" fill="rgb(252,197,50)" fg:x="40384" fg:w="6"/><text x="85.0600%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.8100%" y="1141" width="0.0126%" height="15" fill="rgb(251,211,41)" fg:x="40384" fg:w="6"/><text x="85.0600%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="84.8121%" y="1125" width="0.0105%" height="15" fill="rgb(229,211,5)" fg:x="40385" fg:w="5"/><text x="85.0621%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.8121%" y="1109" width="0.0105%" height="15" fill="rgb(239,36,31)" fg:x="40385" fg:w="5"/><text x="85.0621%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.8121%" y="1093" width="0.0105%" height="15" fill="rgb(248,67,31)" fg:x="40385" fg:w="5"/><text x="85.0621%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="84.8310%" y="1269" width="0.0231%" height="15" fill="rgb(249,55,44)" fg:x="40394" fg:w="11"/><text x="85.0810%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="84.8373%" y="1253" width="0.0168%" height="15" fill="rgb(216,82,12)" fg:x="40397" fg:w="8"/><text x="85.0873%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="84.8583%" y="1237" width="0.0105%" height="15" fill="rgb(242,174,1)" fg:x="40407" fg:w="5"/><text x="85.1083%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (28 samples, 0.06%)</title><rect x="84.8226%" y="1317" width="0.0588%" height="15" fill="rgb(208,120,29)" fg:x="40390" fg:w="28"/><text x="85.0726%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (27 samples, 0.06%)</title><rect x="84.8247%" y="1301" width="0.0567%" height="15" fill="rgb(221,105,43)" fg:x="40391" fg:w="27"/><text x="85.0747%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (24 samples, 0.05%)</title><rect x="84.8310%" y="1285" width="0.0504%" height="15" fill="rgb(234,124,22)" fg:x="40394" fg:w="24"/><text x="85.0810%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="84.8541%" y="1269" width="0.0273%" height="15" fill="rgb(212,23,30)" fg:x="40405" fg:w="13"/><text x="85.1041%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="84.8541%" y="1253" width="0.0273%" height="15" fill="rgb(219,122,53)" fg:x="40405" fg:w="13"/><text x="85.1041%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.8688%" y="1237" width="0.0126%" height="15" fill="rgb(248,84,24)" fg:x="40412" fg:w="6"/><text x="85.1188%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="84.8857%" y="1189" width="0.0252%" height="15" fill="rgb(245,115,18)" fg:x="40420" fg:w="12"/><text x="85.1357%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="84.8878%" y="1173" width="0.0231%" height="15" fill="rgb(227,176,51)" fg:x="40421" fg:w="11"/><text x="85.1378%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="84.8962%" y="1157" width="0.0147%" height="15" fill="rgb(229,63,42)" fg:x="40425" fg:w="7"/><text x="85.1462%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="84.8962%" y="1141" width="0.0147%" height="15" fill="rgb(247,202,24)" fg:x="40425" fg:w="7"/><text x="85.1462%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="84.8962%" y="1125" width="0.0147%" height="15" fill="rgb(244,173,20)" fg:x="40425" fg:w="7"/><text x="85.1462%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.9109%" y="1141" width="0.0105%" height="15" fill="rgb(242,81,47)" fg:x="40432" fg:w="5"/><text x="85.1609%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.9109%" y="1125" width="0.0105%" height="15" fill="rgb(231,185,54)" fg:x="40432" fg:w="5"/><text x="85.1609%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.9214%" y="1141" width="0.0105%" height="15" fill="rgb(243,55,32)" fg:x="40437" fg:w="5"/><text x="85.1714%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.9214%" y="1125" width="0.0105%" height="15" fill="rgb(208,167,19)" fg:x="40437" fg:w="5"/><text x="85.1714%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.9214%" y="1109" width="0.0105%" height="15" fill="rgb(231,72,35)" fg:x="40437" fg:w="5"/><text x="85.1714%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="84.8835%" y="1221" width="0.0525%" height="15" fill="rgb(250,173,51)" fg:x="40419" fg:w="25"/><text x="85.1335%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="84.8835%" y="1205" width="0.0525%" height="15" fill="rgb(209,5,22)" fg:x="40419" fg:w="25"/><text x="85.1335%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="84.9109%" y="1189" width="0.0252%" height="15" fill="rgb(250,174,19)" fg:x="40432" fg:w="12"/><text x="85.1609%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="84.9109%" y="1173" width="0.0252%" height="15" fill="rgb(217,3,49)" fg:x="40432" fg:w="12"/><text x="85.1609%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="84.9109%" y="1157" width="0.0252%" height="15" fill="rgb(218,225,5)" fg:x="40432" fg:w="12"/><text x="85.1609%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (17 samples, 0.04%)</title><rect x="84.9361%" y="1221" width="0.0357%" height="15" fill="rgb(236,89,11)" fg:x="40444" fg:w="17"/><text x="85.1861%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="84.9361%" y="1205" width="0.0357%" height="15" fill="rgb(206,33,28)" fg:x="40444" fg:w="17"/><text x="85.1861%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="84.9382%" y="1189" width="0.0336%" height="15" fill="rgb(241,56,42)" fg:x="40445" fg:w="16"/><text x="85.1882%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="84.9466%" y="1173" width="0.0252%" height="15" fill="rgb(222,44,11)" fg:x="40449" fg:w="12"/><text x="85.1966%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="84.9466%" y="1157" width="0.0252%" height="15" fill="rgb(234,111,20)" fg:x="40449" fg:w="12"/><text x="85.1966%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="84.9466%" y="1141" width="0.0252%" height="15" fill="rgb(237,77,6)" fg:x="40449" fg:w="12"/><text x="85.1966%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="84.9508%" y="1125" width="0.0210%" height="15" fill="rgb(235,111,23)" fg:x="40451" fg:w="10"/><text x="85.2008%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.9592%" y="1109" width="0.0126%" height="15" fill="rgb(251,135,29)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="84.9592%" y="1093" width="0.0126%" height="15" fill="rgb(217,57,1)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.9592%" y="1077" width="0.0126%" height="15" fill="rgb(249,119,31)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.9592%" y="1061" width="0.0126%" height="15" fill="rgb(233,164,33)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.9592%" y="1045" width="0.0126%" height="15" fill="rgb(250,217,43)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="84.9592%" y="1029" width="0.0126%" height="15" fill="rgb(232,154,50)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="84.9592%" y="1013" width="0.0126%" height="15" fill="rgb(227,190,8)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="84.9592%" y="997" width="0.0126%" height="15" fill="rgb(209,217,32)" fg:x="40455" fg:w="6"/><text x="85.2092%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (44 samples, 0.09%)</title><rect x="84.8835%" y="1253" width="0.0924%" height="15" fill="rgb(243,203,50)" fg:x="40419" fg:w="44"/><text x="85.1335%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (44 samples, 0.09%)</title><rect x="84.8835%" y="1237" width="0.0924%" height="15" fill="rgb(232,152,27)" fg:x="40419" fg:w="44"/><text x="85.1335%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="84.9760%" y="1253" width="0.0105%" height="15" fill="rgb(240,34,29)" fg:x="40463" fg:w="5"/><text x="85.2260%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.9760%" y="1237" width="0.0105%" height="15" fill="rgb(215,185,52)" fg:x="40463" fg:w="5"/><text x="85.2260%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (136 samples, 0.29%)</title><rect x="84.7134%" y="1365" width="0.2856%" height="15" fill="rgb(240,89,49)" fg:x="40338" fg:w="136"/><text x="84.9634%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (136 samples, 0.29%)</title><rect x="84.7134%" y="1349" width="0.2856%" height="15" fill="rgb(225,12,52)" fg:x="40338" fg:w="136"/><text x="84.9634%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (132 samples, 0.28%)</title><rect x="84.7218%" y="1333" width="0.2772%" height="15" fill="rgb(239,128,45)" fg:x="40342" fg:w="132"/><text x="84.9718%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (56 samples, 0.12%)</title><rect x="84.8814%" y="1317" width="0.1176%" height="15" fill="rgb(211,78,47)" fg:x="40418" fg:w="56"/><text x="85.1314%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (56 samples, 0.12%)</title><rect x="84.8814%" y="1301" width="0.1176%" height="15" fill="rgb(232,31,21)" fg:x="40418" fg:w="56"/><text x="85.1314%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (56 samples, 0.12%)</title><rect x="84.8814%" y="1285" width="0.1176%" height="15" fill="rgb(222,168,14)" fg:x="40418" fg:w="56"/><text x="85.1314%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (55 samples, 0.12%)</title><rect x="84.8835%" y="1269" width="0.1155%" height="15" fill="rgb(209,128,24)" fg:x="40419" fg:w="55"/><text x="85.1335%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="84.9865%" y="1253" width="0.0126%" height="15" fill="rgb(249,35,13)" fg:x="40468" fg:w="6"/><text x="85.2365%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="84.9886%" y="1237" width="0.0105%" height="15" fill="rgb(218,7,2)" fg:x="40469" fg:w="5"/><text x="85.2386%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.9886%" y="1221" width="0.0105%" height="15" fill="rgb(238,107,27)" fg:x="40469" fg:w="5"/><text x="85.2386%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.9886%" y="1205" width="0.0105%" height="15" fill="rgb(217,88,38)" fg:x="40469" fg:w="5"/><text x="85.2386%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="84.9886%" y="1189" width="0.0105%" height="15" fill="rgb(230,207,0)" fg:x="40469" fg:w="5"/><text x="85.2386%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="84.9886%" y="1173" width="0.0105%" height="15" fill="rgb(249,64,54)" fg:x="40469" fg:w="5"/><text x="85.2386%" y="1183.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="85.0096%" y="1317" width="0.0126%" height="15" fill="rgb(231,7,11)" fg:x="40479" fg:w="6"/><text x="85.2596%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.0579%" y="1141" width="0.0147%" height="15" fill="rgb(205,149,21)" fg:x="40502" fg:w="7"/><text x="85.3079%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (7 samples, 0.01%)</title><rect x="85.0579%" y="1125" width="0.0147%" height="15" fill="rgb(215,126,34)" fg:x="40502" fg:w="7"/><text x="85.3079%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="85.0558%" y="1173" width="0.0189%" height="15" fill="rgb(241,132,45)" fg:x="40501" fg:w="9"/><text x="85.3058%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="85.0579%" y="1157" width="0.0168%" height="15" fill="rgb(252,69,32)" fg:x="40502" fg:w="8"/><text x="85.3079%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="85.0537%" y="1205" width="0.0294%" height="15" fill="rgb(232,204,19)" fg:x="40500" fg:w="14"/><text x="85.3037%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="85.0558%" y="1189" width="0.0273%" height="15" fill="rgb(249,15,47)" fg:x="40501" fg:w="13"/><text x="85.3058%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="85.0495%" y="1237" width="0.0399%" height="15" fill="rgb(209,227,23)" fg:x="40498" fg:w="19"/><text x="85.2995%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="85.0537%" y="1221" width="0.0357%" height="15" fill="rgb(248,92,24)" fg:x="40500" fg:w="17"/><text x="85.3037%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="85.0957%" y="1189" width="0.0126%" height="15" fill="rgb(247,59,2)" fg:x="40520" fg:w="6"/><text x="85.3457%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.0978%" y="1173" width="0.0105%" height="15" fill="rgb(221,30,5)" fg:x="40521" fg:w="5"/><text x="85.3478%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (36 samples, 0.08%)</title><rect x="85.0411%" y="1269" width="0.0756%" height="15" fill="rgb(208,108,53)" fg:x="40494" fg:w="36"/><text x="85.2911%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (32 samples, 0.07%)</title><rect x="85.0495%" y="1253" width="0.0672%" height="15" fill="rgb(211,183,26)" fg:x="40498" fg:w="32"/><text x="85.2995%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="85.0894%" y="1237" width="0.0273%" height="15" fill="rgb(232,132,4)" fg:x="40517" fg:w="13"/><text x="85.3394%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="85.0894%" y="1221" width="0.0273%" height="15" fill="rgb(253,128,37)" fg:x="40517" fg:w="13"/><text x="85.3394%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="85.0957%" y="1205" width="0.0210%" height="15" fill="rgb(221,58,24)" fg:x="40520" fg:w="10"/><text x="85.3457%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="85.1251%" y="1221" width="0.0168%" height="15" fill="rgb(230,54,45)" fg:x="40534" fg:w="8"/><text x="85.3751%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="85.1293%" y="1205" width="0.0126%" height="15" fill="rgb(254,21,18)" fg:x="40536" fg:w="6"/><text x="85.3793%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (21 samples, 0.04%)</title><rect x="85.1167%" y="1269" width="0.0441%" height="15" fill="rgb(221,108,0)" fg:x="40530" fg:w="21"/><text x="85.3667%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="85.1167%" y="1253" width="0.0441%" height="15" fill="rgb(206,95,1)" fg:x="40530" fg:w="21"/><text x="85.3667%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="85.1230%" y="1237" width="0.0378%" height="15" fill="rgb(237,52,5)" fg:x="40533" fg:w="18"/><text x="85.3730%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.1503%" y="1221" width="0.0105%" height="15" fill="rgb(218,150,34)" fg:x="40546" fg:w="5"/><text x="85.4003%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.1503%" y="1205" width="0.0105%" height="15" fill="rgb(235,194,28)" fg:x="40546" fg:w="5"/><text x="85.4003%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.1503%" y="1189" width="0.0105%" height="15" fill="rgb(245,92,18)" fg:x="40546" fg:w="5"/><text x="85.4003%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.1503%" y="1173" width="0.0105%" height="15" fill="rgb(253,203,53)" fg:x="40546" fg:w="5"/><text x="85.4003%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (70 samples, 0.15%)</title><rect x="85.0264%" y="1301" width="0.1470%" height="15" fill="rgb(249,185,47)" fg:x="40487" fg:w="70"/><text x="85.2764%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (64 samples, 0.13%)</title><rect x="85.0390%" y="1285" width="0.1344%" height="15" fill="rgb(252,194,52)" fg:x="40493" fg:w="64"/><text x="85.2890%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="85.1608%" y="1269" width="0.0126%" height="15" fill="rgb(210,53,36)" fg:x="40551" fg:w="6"/><text x="85.4108%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.1629%" y="1253" width="0.0105%" height="15" fill="rgb(237,37,25)" fg:x="40552" fg:w="5"/><text x="85.4129%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.1629%" y="1237" width="0.0105%" height="15" fill="rgb(242,116,27)" fg:x="40552" fg:w="5"/><text x="85.4129%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="85.1734%" y="1301" width="0.0336%" height="15" fill="rgb(213,185,26)" fg:x="40557" fg:w="16"/><text x="85.4234%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="85.1734%" y="1285" width="0.0336%" height="15" fill="rgb(225,204,8)" fg:x="40557" fg:w="16"/><text x="85.4234%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="85.1818%" y="1269" width="0.0252%" height="15" fill="rgb(254,111,37)" fg:x="40561" fg:w="12"/><text x="85.4318%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.2196%" y="1173" width="0.0147%" height="15" fill="rgb(242,35,9)" fg:x="40579" fg:w="7"/><text x="85.4696%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2238%" y="1157" width="0.0105%" height="15" fill="rgb(232,138,49)" fg:x="40581" fg:w="5"/><text x="85.4738%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="85.2175%" y="1205" width="0.0273%" height="15" fill="rgb(247,56,4)" fg:x="40578" fg:w="13"/><text x="85.4675%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="85.2196%" y="1189" width="0.0252%" height="15" fill="rgb(226,179,17)" fg:x="40579" fg:w="12"/><text x="85.4696%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="85.2448%" y="1205" width="0.0252%" height="15" fill="rgb(216,163,45)" fg:x="40591" fg:w="12"/><text x="85.4948%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="85.2469%" y="1189" width="0.0231%" height="15" fill="rgb(211,157,3)" fg:x="40592" fg:w="11"/><text x="85.4969%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.2553%" y="1173" width="0.0147%" height="15" fill="rgb(234,44,20)" fg:x="40596" fg:w="7"/><text x="85.5053%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.2595%" y="1157" width="0.0105%" height="15" fill="rgb(254,138,23)" fg:x="40598" fg:w="5"/><text x="85.5095%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.2595%" y="1141" width="0.0105%" height="15" fill="rgb(206,119,39)" fg:x="40598" fg:w="5"/><text x="85.5095%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2595%" y="1125" width="0.0105%" height="15" fill="rgb(231,105,52)" fg:x="40598" fg:w="5"/><text x="85.5095%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2595%" y="1109" width="0.0105%" height="15" fill="rgb(250,20,5)" fg:x="40598" fg:w="5"/><text x="85.5095%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="85.2175%" y="1237" width="0.0672%" height="15" fill="rgb(215,198,30)" fg:x="40578" fg:w="32"/><text x="85.4675%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (32 samples, 0.07%)</title><rect x="85.2175%" y="1221" width="0.0672%" height="15" fill="rgb(246,142,8)" fg:x="40578" fg:w="32"/><text x="85.4675%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="85.2700%" y="1205" width="0.0147%" height="15" fill="rgb(243,26,38)" fg:x="40603" fg:w="7"/><text x="85.5200%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="85.2700%" y="1189" width="0.0147%" height="15" fill="rgb(205,133,28)" fg:x="40603" fg:w="7"/><text x="85.5200%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.2700%" y="1173" width="0.0147%" height="15" fill="rgb(212,34,0)" fg:x="40603" fg:w="7"/><text x="85.5200%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.2700%" y="1157" width="0.0147%" height="15" fill="rgb(251,226,22)" fg:x="40603" fg:w="7"/><text x="85.5200%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.2700%" y="1141" width="0.0147%" height="15" fill="rgb(252,119,9)" fg:x="40603" fg:w="7"/><text x="85.5200%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="85.2721%" y="1125" width="0.0126%" height="15" fill="rgb(213,150,50)" fg:x="40604" fg:w="6"/><text x="85.5221%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.2742%" y="1109" width="0.0105%" height="15" fill="rgb(212,24,39)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.2742%" y="1093" width="0.0105%" height="15" fill="rgb(213,46,39)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="1077" width="0.0105%" height="15" fill="rgb(239,106,12)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="1061" width="0.0105%" height="15" fill="rgb(249,229,21)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="1045" width="0.0105%" height="15" fill="rgb(212,158,3)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="1029" width="0.0105%" height="15" fill="rgb(253,26,48)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="1013" width="0.0105%" height="15" fill="rgb(238,178,20)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="997" width="0.0105%" height="15" fill="rgb(208,86,15)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="981" width="0.0105%" height="15" fill="rgb(239,42,53)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="965" width="0.0105%" height="15" fill="rgb(245,226,8)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.2742%" y="949" width="0.0105%" height="15" fill="rgb(216,176,32)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.2742%" y="933" width="0.0105%" height="15" fill="rgb(231,186,21)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="917" width="0.0105%" height="15" fill="rgb(205,95,49)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="901" width="0.0105%" height="15" fill="rgb(217,145,8)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.2742%" y="885" width="0.0105%" height="15" fill="rgb(239,144,48)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.2742%" y="869" width="0.0105%" height="15" fill="rgb(214,189,23)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="853" width="0.0105%" height="15" fill="rgb(229,157,17)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="837" width="0.0105%" height="15" fill="rgb(230,5,48)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="821" width="0.0105%" height="15" fill="rgb(224,156,48)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="805" width="0.0105%" height="15" fill="rgb(223,14,29)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="789" width="0.0105%" height="15" fill="rgb(229,96,36)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="773" width="0.0105%" height="15" fill="rgb(231,102,53)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="757" width="0.0105%" height="15" fill="rgb(210,77,38)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="741" width="0.0105%" height="15" fill="rgb(235,131,6)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.2742%" y="725" width="0.0105%" height="15" fill="rgb(252,55,38)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.2742%" y="709" width="0.0105%" height="15" fill="rgb(246,38,14)" fg:x="40605" fg:w="5"/><text x="85.5242%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (44 samples, 0.09%)</title><rect x="85.2070%" y="1285" width="0.0924%" height="15" fill="rgb(242,27,5)" fg:x="40573" fg:w="44"/><text x="85.4570%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (43 samples, 0.09%)</title><rect x="85.2091%" y="1269" width="0.0903%" height="15" fill="rgb(228,65,35)" fg:x="40574" fg:w="43"/><text x="85.4591%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (39 samples, 0.08%)</title><rect x="85.2175%" y="1253" width="0.0819%" height="15" fill="rgb(245,93,11)" fg:x="40578" fg:w="39"/><text x="85.4675%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (142 samples, 0.30%)</title><rect x="85.0033%" y="1349" width="0.2982%" height="15" fill="rgb(213,1,31)" fg:x="40476" fg:w="142"/><text x="85.2533%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (140 samples, 0.29%)</title><rect x="85.0075%" y="1333" width="0.2940%" height="15" fill="rgb(237,205,14)" fg:x="40478" fg:w="140"/><text x="85.2575%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (133 samples, 0.28%)</title><rect x="85.0222%" y="1317" width="0.2793%" height="15" fill="rgb(232,118,45)" fg:x="40485" fg:w="133"/><text x="85.2722%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (45 samples, 0.09%)</title><rect x="85.2070%" y="1301" width="0.0945%" height="15" fill="rgb(218,5,6)" fg:x="40573" fg:w="45"/><text x="85.4570%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (684 samples, 1.44%)</title><rect x="83.8671%" y="1413" width="1.4365%" height="15" fill="rgb(251,87,51)" fg:x="39935" fg:w="684"/><text x="84.1171%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (681 samples, 1.43%)</title><rect x="83.8734%" y="1397" width="1.4302%" height="15" fill="rgb(207,225,20)" fg:x="39938" fg:w="681"/><text x="84.1234%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (667 samples, 1.40%)</title><rect x="83.9028%" y="1381" width="1.4008%" height="15" fill="rgb(222,78,54)" fg:x="39952" fg:w="667"/><text x="84.1528%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (145 samples, 0.30%)</title><rect x="84.9991%" y="1365" width="0.3045%" height="15" fill="rgb(232,85,16)" fg:x="40474" fg:w="145"/><text x="85.2491%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (690 samples, 1.45%)</title><rect x="83.8566%" y="1429" width="1.4491%" height="15" fill="rgb(244,25,33)" fg:x="39930" fg:w="690"/><text x="84.1066%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5,126 samples, 10.77%)</title><rect x="74.5427%" y="1461" width="10.7651%" height="15" fill="rgb(233,24,36)" fg:x="35495" fg:w="5126"/><text x="74.7927%" y="1471.50">sqlparser_bench-..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5,072 samples, 10.65%)</title><rect x="74.6561%" y="1445" width="10.6517%" height="15" fill="rgb(253,49,54)" fg:x="35549" fg:w="5072"/><text x="74.9061%" y="1455.50">sqlparser_bench-..</text></g><g><title>libsystem_m.dylib`exp (24 samples, 0.05%)</title><rect x="85.3267%" y="1429" width="0.0504%" height="15" fill="rgb(245,12,22)" fg:x="40630" fg:w="24"/><text x="85.5767%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (7 samples, 0.01%)</title><rect x="85.3771%" y="1413" width="0.0147%" height="15" fill="rgb(253,141,28)" fg:x="40654" fg:w="7"/><text x="85.6271%" y="1423.50"></text></g><g><title>libsystem_m.dylib`exp (18 samples, 0.04%)</title><rect x="85.4023%" y="1397" width="0.0378%" height="15" fill="rgb(225,207,27)" fg:x="40666" fg:w="18"/><text x="85.6523%" y="1407.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="85.4590%" y="1365" width="0.0399%" height="15" fill="rgb(220,84,2)" fg:x="40693" fg:w="19"/><text x="85.7090%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="85.4989%" y="1365" width="0.0105%" height="15" fill="rgb(224,37,37)" fg:x="40712" fg:w="5"/><text x="85.7489%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="85.4989%" y="1349" width="0.0105%" height="15" fill="rgb(220,143,18)" fg:x="40712" fg:w="5"/><text x="85.7489%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="85.5157%" y="1333" width="0.0126%" height="15" fill="rgb(210,88,33)" fg:x="40720" fg:w="6"/><text x="85.7657%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="85.5325%" y="1301" width="0.0126%" height="15" fill="rgb(219,87,51)" fg:x="40728" fg:w="6"/><text x="85.7825%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.5451%" y="1285" width="0.0105%" height="15" fill="rgb(211,7,35)" fg:x="40734" fg:w="5"/><text x="85.7951%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="85.5325%" y="1317" width="0.0273%" height="15" fill="rgb(232,77,2)" fg:x="40728" fg:w="13"/><text x="85.7825%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.5451%" y="1301" width="0.0147%" height="15" fill="rgb(249,94,25)" fg:x="40734" fg:w="7"/><text x="85.7951%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="85.5640%" y="1285" width="0.0105%" height="15" fill="rgb(215,112,2)" fg:x="40743" fg:w="5"/><text x="85.8140%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="85.5745%" y="1269" width="0.0126%" height="15" fill="rgb(226,115,48)" fg:x="40748" fg:w="6"/><text x="85.8245%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (37 samples, 0.08%)</title><rect x="85.5136%" y="1349" width="0.0777%" height="15" fill="rgb(249,196,10)" fg:x="40719" fg:w="37"/><text x="85.7636%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="85.5325%" y="1333" width="0.0588%" height="15" fill="rgb(237,109,14)" fg:x="40728" fg:w="28"/><text x="85.7825%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="85.5598%" y="1317" width="0.0315%" height="15" fill="rgb(217,103,53)" fg:x="40741" fg:w="15"/><text x="85.8098%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="85.5640%" y="1301" width="0.0273%" height="15" fill="rgb(244,137,9)" fg:x="40743" fg:w="13"/><text x="85.8140%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="85.5745%" y="1285" width="0.0168%" height="15" fill="rgb(227,201,3)" fg:x="40748" fg:w="8"/><text x="85.8245%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="85.5976%" y="1317" width="0.0189%" height="15" fill="rgb(243,94,6)" fg:x="40759" fg:w="9"/><text x="85.8476%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="85.6165%" y="1317" width="0.0105%" height="15" fill="rgb(235,118,5)" fg:x="40768" fg:w="5"/><text x="85.8665%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="85.6165%" y="1301" width="0.0105%" height="15" fill="rgb(247,10,30)" fg:x="40768" fg:w="5"/><text x="85.8665%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="85.6333%" y="1285" width="0.0126%" height="15" fill="rgb(205,26,28)" fg:x="40776" fg:w="6"/><text x="85.8833%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="85.6291%" y="1301" width="0.0294%" height="15" fill="rgb(206,99,35)" fg:x="40774" fg:w="14"/><text x="85.8791%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="85.6459%" y="1285" width="0.0126%" height="15" fill="rgb(238,130,40)" fg:x="40782" fg:w="6"/><text x="85.8959%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="85.6669%" y="1253" width="0.0168%" height="15" fill="rgb(224,126,31)" fg:x="40792" fg:w="8"/><text x="85.9169%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="85.6732%" y="1237" width="0.0105%" height="15" fill="rgb(254,105,17)" fg:x="40795" fg:w="5"/><text x="85.9232%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="85.6732%" y="1221" width="0.0105%" height="15" fill="rgb(216,87,36)" fg:x="40795" fg:w="5"/><text x="85.9232%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="85.6837%" y="1205" width="0.0105%" height="15" fill="rgb(240,21,12)" fg:x="40800" fg:w="5"/><text x="85.9337%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (18 samples, 0.04%)</title><rect x="85.6585%" y="1301" width="0.0378%" height="15" fill="rgb(245,192,34)" fg:x="40788" fg:w="18"/><text x="85.9085%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="85.6585%" y="1285" width="0.0378%" height="15" fill="rgb(226,100,49)" fg:x="40788" fg:w="18"/><text x="85.9085%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="85.6669%" y="1269" width="0.0294%" height="15" fill="rgb(245,188,27)" fg:x="40792" fg:w="14"/><text x="85.9169%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="85.6837%" y="1253" width="0.0126%" height="15" fill="rgb(212,170,8)" fg:x="40800" fg:w="6"/><text x="85.9337%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="85.6837%" y="1237" width="0.0126%" height="15" fill="rgb(217,113,29)" fg:x="40800" fg:w="6"/><text x="85.9337%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (6 samples, 0.01%)</title><rect x="85.6837%" y="1221" width="0.0126%" height="15" fill="rgb(237,30,3)" fg:x="40800" fg:w="6"/><text x="85.9337%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (55 samples, 0.12%)</title><rect x="85.5913%" y="1349" width="0.1155%" height="15" fill="rgb(227,19,28)" fg:x="40756" fg:w="55"/><text x="85.8413%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (55 samples, 0.12%)</title><rect x="85.5913%" y="1333" width="0.1155%" height="15" fill="rgb(239,172,45)" fg:x="40756" fg:w="55"/><text x="85.8413%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="85.6270%" y="1317" width="0.0798%" height="15" fill="rgb(254,55,39)" fg:x="40773" fg:w="38"/><text x="85.8770%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.6963%" y="1301" width="0.0105%" height="15" fill="rgb(249,208,12)" fg:x="40806" fg:w="5"/><text x="85.9463%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.6963%" y="1285" width="0.0105%" height="15" fill="rgb(240,52,13)" fg:x="40806" fg:w="5"/><text x="85.9463%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.6963%" y="1269" width="0.0105%" height="15" fill="rgb(252,149,13)" fg:x="40806" fg:w="5"/><text x="85.9463%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.6963%" y="1253" width="0.0105%" height="15" fill="rgb(232,81,48)" fg:x="40806" fg:w="5"/><text x="85.9463%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (124 samples, 0.26%)</title><rect x="85.4485%" y="1381" width="0.2604%" height="15" fill="rgb(222,144,2)" fg:x="40688" fg:w="124"/><text x="85.6985%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (95 samples, 0.20%)</title><rect x="85.5094%" y="1365" width="0.1995%" height="15" fill="rgb(216,81,32)" fg:x="40717" fg:w="95"/><text x="85.7594%" y="1375.50"></text></g><g><title>libsystem_m.dylib`exp (18 samples, 0.04%)</title><rect x="85.7236%" y="1349" width="0.0378%" height="15" fill="rgb(244,78,51)" fg:x="40819" fg:w="18"/><text x="85.9736%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="85.7719%" y="1317" width="0.0210%" height="15" fill="rgb(217,66,21)" fg:x="40842" fg:w="10"/><text x="86.0219%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="85.8034%" y="1301" width="0.0231%" height="15" fill="rgb(247,101,42)" fg:x="40857" fg:w="11"/><text x="86.0534%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="85.8139%" y="1285" width="0.0126%" height="15" fill="rgb(227,81,39)" fg:x="40862" fg:w="6"/><text x="86.0639%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="85.8160%" y="1269" width="0.0105%" height="15" fill="rgb(220,223,44)" fg:x="40863" fg:w="5"/><text x="86.0660%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.8160%" y="1253" width="0.0105%" height="15" fill="rgb(205,218,2)" fg:x="40863" fg:w="5"/><text x="86.0660%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="85.8160%" y="1237" width="0.0105%" height="15" fill="rgb(212,207,28)" fg:x="40863" fg:w="5"/><text x="86.0660%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.8391%" y="1253" width="0.0105%" height="15" fill="rgb(224,12,41)" fg:x="40874" fg:w="5"/><text x="86.0891%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (41 samples, 0.09%)</title><rect x="85.7677%" y="1333" width="0.0861%" height="15" fill="rgb(216,118,12)" fg:x="40840" fg:w="41"/><text x="86.0177%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="85.8013%" y="1317" width="0.0525%" height="15" fill="rgb(252,97,46)" fg:x="40856" fg:w="25"/><text x="86.0513%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="85.8265%" y="1301" width="0.0273%" height="15" fill="rgb(244,206,19)" fg:x="40868" fg:w="13"/><text x="86.0765%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="85.8307%" y="1285" width="0.0231%" height="15" fill="rgb(231,84,31)" fg:x="40870" fg:w="11"/><text x="86.0807%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.8391%" y="1269" width="0.0147%" height="15" fill="rgb(244,133,0)" fg:x="40874" fg:w="7"/><text x="86.0891%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="85.8664%" y="1269" width="0.0105%" height="15" fill="rgb(223,15,50)" fg:x="40887" fg:w="5"/><text x="86.1164%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="85.8769%" y="1221" width="0.0105%" height="15" fill="rgb(250,118,49)" fg:x="40892" fg:w="5"/><text x="86.1269%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="85.8769%" y="1253" width="0.0126%" height="15" fill="rgb(248,25,38)" fg:x="40892" fg:w="6"/><text x="86.1269%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (6 samples, 0.01%)</title><rect x="85.8769%" y="1237" width="0.0126%" height="15" fill="rgb(215,70,14)" fg:x="40892" fg:w="6"/><text x="86.1269%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="85.8643%" y="1285" width="0.0273%" height="15" fill="rgb(215,28,15)" fg:x="40886" fg:w="13"/><text x="86.1143%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.8769%" y="1269" width="0.0147%" height="15" fill="rgb(243,6,28)" fg:x="40892" fg:w="7"/><text x="86.1269%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="85.8916%" y="1285" width="0.0168%" height="15" fill="rgb(222,130,1)" fg:x="40899" fg:w="8"/><text x="86.1416%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.8937%" y="1269" width="0.0147%" height="15" fill="rgb(236,166,44)" fg:x="40900" fg:w="7"/><text x="86.1437%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="85.9084%" y="1221" width="0.0231%" height="15" fill="rgb(221,108,14)" fg:x="40907" fg:w="11"/><text x="86.1584%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="85.9105%" y="1205" width="0.0210%" height="15" fill="rgb(252,3,45)" fg:x="40908" fg:w="10"/><text x="86.1605%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="85.9147%" y="1189" width="0.0168%" height="15" fill="rgb(237,68,30)" fg:x="40910" fg:w="8"/><text x="86.1647%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="85.9147%" y="1173" width="0.0168%" height="15" fill="rgb(211,79,22)" fg:x="40910" fg:w="8"/><text x="86.1647%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="85.9147%" y="1157" width="0.0168%" height="15" fill="rgb(252,185,21)" fg:x="40910" fg:w="8"/><text x="86.1647%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="85.9168%" y="1141" width="0.0147%" height="15" fill="rgb(225,189,26)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="85.9168%" y="1125" width="0.0147%" height="15" fill="rgb(241,30,40)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.9168%" y="1109" width="0.0147%" height="15" fill="rgb(235,215,44)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.9168%" y="1093" width="0.0147%" height="15" fill="rgb(205,8,29)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.9168%" y="1077" width="0.0147%" height="15" fill="rgb(241,137,42)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.9168%" y="1061" width="0.0147%" height="15" fill="rgb(237,155,2)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="85.9168%" y="1045" width="0.0147%" height="15" fill="rgb(245,29,42)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="85.9168%" y="1029" width="0.0147%" height="15" fill="rgb(234,101,35)" fg:x="40911" fg:w="7"/><text x="86.1668%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (38 samples, 0.08%)</title><rect x="85.8538%" y="1333" width="0.0798%" height="15" fill="rgb(228,64,37)" fg:x="40881" fg:w="38"/><text x="86.1038%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (37 samples, 0.08%)</title><rect x="85.8559%" y="1317" width="0.0777%" height="15" fill="rgb(217,214,36)" fg:x="40882" fg:w="37"/><text x="86.1059%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (34 samples, 0.07%)</title><rect x="85.8622%" y="1301" width="0.0714%" height="15" fill="rgb(243,70,3)" fg:x="40885" fg:w="34"/><text x="86.1122%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="85.9084%" y="1285" width="0.0252%" height="15" fill="rgb(253,158,52)" fg:x="40907" fg:w="12"/><text x="86.1584%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="85.9084%" y="1269" width="0.0252%" height="15" fill="rgb(234,111,54)" fg:x="40907" fg:w="12"/><text x="86.1584%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="85.9084%" y="1253" width="0.0252%" height="15" fill="rgb(217,70,32)" fg:x="40907" fg:w="12"/><text x="86.1584%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="85.9084%" y="1237" width="0.0252%" height="15" fill="rgb(234,18,33)" fg:x="40907" fg:w="12"/><text x="86.1584%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (112 samples, 0.24%)</title><rect x="85.7089%" y="1381" width="0.2352%" height="15" fill="rgb(234,12,49)" fg:x="40812" fg:w="112"/><text x="85.9589%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (109 samples, 0.23%)</title><rect x="85.7152%" y="1365" width="0.2289%" height="15" fill="rgb(236,10,21)" fg:x="40815" fg:w="109"/><text x="85.9652%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (86 samples, 0.18%)</title><rect x="85.7635%" y="1349" width="0.1806%" height="15" fill="rgb(248,182,45)" fg:x="40838" fg:w="86"/><text x="86.0135%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.9336%" y="1333" width="0.0105%" height="15" fill="rgb(217,95,36)" fg:x="40919" fg:w="5"/><text x="86.1836%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.9336%" y="1317" width="0.0105%" height="15" fill="rgb(212,110,31)" fg:x="40919" fg:w="5"/><text x="86.1836%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9336%" y="1301" width="0.0105%" height="15" fill="rgb(206,32,53)" fg:x="40919" fg:w="5"/><text x="86.1836%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.9336%" y="1285" width="0.0105%" height="15" fill="rgb(246,141,37)" fg:x="40919" fg:w="5"/><text x="86.1836%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9336%" y="1269" width="0.0105%" height="15" fill="rgb(219,16,7)" fg:x="40919" fg:w="5"/><text x="86.1836%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9483%" y="1285" width="0.0105%" height="15" fill="rgb(230,205,45)" fg:x="40926" fg:w="5"/><text x="86.1983%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="85.9588%" y="1285" width="0.0105%" height="15" fill="rgb(231,43,49)" fg:x="40931" fg:w="5"/><text x="86.2088%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9588%" y="1269" width="0.0105%" height="15" fill="rgb(212,106,34)" fg:x="40931" fg:w="5"/><text x="86.2088%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="85.9483%" y="1317" width="0.0315%" height="15" fill="rgb(206,83,17)" fg:x="40926" fg:w="15"/><text x="86.1983%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="85.9483%" y="1301" width="0.0315%" height="15" fill="rgb(244,154,49)" fg:x="40926" fg:w="15"/><text x="86.1983%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="85.9693%" y="1285" width="0.0105%" height="15" fill="rgb(244,149,49)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="85.9693%" y="1269" width="0.0105%" height="15" fill="rgb(227,134,18)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9693%" y="1253" width="0.0105%" height="15" fill="rgb(237,116,36)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.9693%" y="1237" width="0.0105%" height="15" fill="rgb(205,129,40)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="85.9693%" y="1221" width="0.0105%" height="15" fill="rgb(236,178,4)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="85.9693%" y="1205" width="0.0105%" height="15" fill="rgb(251,76,53)" fg:x="40936" fg:w="5"/><text x="86.2193%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (285 samples, 0.60%)</title><rect x="85.3918%" y="1413" width="0.5985%" height="15" fill="rgb(242,92,40)" fg:x="40661" fg:w="285"/><text x="85.6418%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (260 samples, 0.55%)</title><rect x="85.4443%" y="1397" width="0.5460%" height="15" fill="rgb(209,45,30)" fg:x="40686" fg:w="260"/><text x="85.6943%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (22 samples, 0.05%)</title><rect x="85.9441%" y="1381" width="0.0462%" height="15" fill="rgb(218,157,36)" fg:x="40924" fg:w="22"/><text x="86.1941%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (22 samples, 0.05%)</title><rect x="85.9441%" y="1365" width="0.0462%" height="15" fill="rgb(222,186,16)" fg:x="40924" fg:w="22"/><text x="86.1941%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="85.9441%" y="1349" width="0.0462%" height="15" fill="rgb(254,72,35)" fg:x="40924" fg:w="22"/><text x="86.1941%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="85.9483%" y="1333" width="0.0420%" height="15" fill="rgb(224,25,35)" fg:x="40926" fg:w="20"/><text x="86.1983%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (23 samples, 0.05%)</title><rect x="86.0008%" y="1381" width="0.0483%" height="15" fill="rgb(206,135,52)" fg:x="40951" fg:w="23"/><text x="86.2508%" y="1391.50"></text></g><g><title>libsystem_m.dylib`exp (19 samples, 0.04%)</title><rect x="86.0554%" y="1349" width="0.0399%" height="15" fill="rgb(229,174,47)" fg:x="40977" fg:w="19"/><text x="86.3054%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (5 samples, 0.01%)</title><rect x="86.0953%" y="1349" width="0.0105%" height="15" fill="rgb(242,184,21)" fg:x="40996" fg:w="5"/><text x="86.3453%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (5 samples, 0.01%)</title><rect x="86.0953%" y="1333" width="0.0105%" height="15" fill="rgb(213,22,45)" fg:x="40996" fg:w="5"/><text x="86.3453%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (5 samples, 0.01%)</title><rect x="86.0953%" y="1317" width="0.0105%" height="15" fill="rgb(237,81,54)" fg:x="40996" fg:w="5"/><text x="86.3453%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.1226%" y="1301" width="0.0105%" height="15" fill="rgb(248,177,18)" fg:x="41009" fg:w="5"/><text x="86.3726%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="86.1058%" y="1333" width="0.0441%" height="15" fill="rgb(254,31,16)" fg:x="41001" fg:w="21"/><text x="86.3558%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="86.1205%" y="1317" width="0.0294%" height="15" fill="rgb(235,20,31)" fg:x="41008" fg:w="14"/><text x="86.3705%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="86.1331%" y="1301" width="0.0168%" height="15" fill="rgb(240,56,43)" fg:x="41014" fg:w="8"/><text x="86.3831%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="86.1331%" y="1285" width="0.0168%" height="15" fill="rgb(237,197,51)" fg:x="41014" fg:w="8"/><text x="86.3831%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="86.1373%" y="1269" width="0.0126%" height="15" fill="rgb(241,162,44)" fg:x="41016" fg:w="6"/><text x="86.3873%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="86.1499%" y="1301" width="0.0189%" height="15" fill="rgb(224,23,20)" fg:x="41022" fg:w="9"/><text x="86.3999%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.1751%" y="1285" width="0.0147%" height="15" fill="rgb(250,109,34)" fg:x="41034" fg:w="7"/><text x="86.4251%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (75 samples, 0.16%)</title><rect x="86.0533%" y="1365" width="0.1575%" height="15" fill="rgb(214,175,50)" fg:x="40976" fg:w="75"/><text x="86.3033%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (50 samples, 0.11%)</title><rect x="86.1058%" y="1349" width="0.1050%" height="15" fill="rgb(213,182,5)" fg:x="41001" fg:w="50"/><text x="86.3558%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (29 samples, 0.06%)</title><rect x="86.1499%" y="1333" width="0.0609%" height="15" fill="rgb(209,199,19)" fg:x="41022" fg:w="29"/><text x="86.3999%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="86.1499%" y="1317" width="0.0609%" height="15" fill="rgb(236,224,42)" fg:x="41022" fg:w="29"/><text x="86.3999%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="86.1751%" y="1301" width="0.0357%" height="15" fill="rgb(246,226,29)" fg:x="41034" fg:w="17"/><text x="86.4251%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="86.1898%" y="1285" width="0.0210%" height="15" fill="rgb(227,223,11)" fg:x="41041" fg:w="10"/><text x="86.4398%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="86.1898%" y="1269" width="0.0210%" height="15" fill="rgb(219,7,51)" fg:x="41041" fg:w="10"/><text x="86.4398%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="86.1940%" y="1253" width="0.0168%" height="15" fill="rgb(245,167,10)" fg:x="41043" fg:w="8"/><text x="86.4440%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="86.2234%" y="1333" width="0.0147%" height="15" fill="rgb(237,224,16)" fg:x="41057" fg:w="7"/><text x="86.4734%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="86.2444%" y="1301" width="0.0105%" height="15" fill="rgb(226,132,13)" fg:x="41067" fg:w="5"/><text x="86.4944%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.2612%" y="1285" width="0.0126%" height="15" fill="rgb(214,140,3)" fg:x="41075" fg:w="6"/><text x="86.5112%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.2633%" y="1269" width="0.0105%" height="15" fill="rgb(221,177,4)" fg:x="41076" fg:w="5"/><text x="86.5133%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="86.2444%" y="1317" width="0.0336%" height="15" fill="rgb(238,139,3)" fg:x="41067" fg:w="16"/><text x="86.4944%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="86.2612%" y="1301" width="0.0168%" height="15" fill="rgb(216,17,39)" fg:x="41075" fg:w="8"/><text x="86.5112%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="86.2948%" y="1269" width="0.0147%" height="15" fill="rgb(238,120,9)" fg:x="41091" fg:w="7"/><text x="86.5448%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.2948%" y="1253" width="0.0147%" height="15" fill="rgb(244,92,53)" fg:x="41091" fg:w="7"/><text x="86.5448%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.2948%" y="1237" width="0.0147%" height="15" fill="rgb(224,148,33)" fg:x="41091" fg:w="7"/><text x="86.5448%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (20 samples, 0.04%)</title><rect x="86.2780%" y="1317" width="0.0420%" height="15" fill="rgb(243,6,36)" fg:x="41083" fg:w="20"/><text x="86.5280%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="86.2780%" y="1301" width="0.0420%" height="15" fill="rgb(230,102,11)" fg:x="41083" fg:w="20"/><text x="86.5280%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="86.2864%" y="1285" width="0.0336%" height="15" fill="rgb(234,148,36)" fg:x="41087" fg:w="16"/><text x="86.5364%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="86.3095%" y="1269" width="0.0105%" height="15" fill="rgb(251,153,25)" fg:x="41098" fg:w="5"/><text x="86.5595%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="86.3095%" y="1253" width="0.0105%" height="15" fill="rgb(215,129,8)" fg:x="41098" fg:w="5"/><text x="86.5595%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.3095%" y="1237" width="0.0105%" height="15" fill="rgb(224,128,35)" fg:x="41098" fg:w="5"/><text x="86.5595%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.3221%" y="1221" width="0.0147%" height="15" fill="rgb(237,56,52)" fg:x="41104" fg:w="7"/><text x="86.5721%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.3221%" y="1205" width="0.0147%" height="15" fill="rgb(234,213,19)" fg:x="41104" fg:w="7"/><text x="86.5721%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.3200%" y="1253" width="0.0231%" height="15" fill="rgb(252,82,23)" fg:x="41103" fg:w="11"/><text x="86.5700%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="86.3221%" y="1237" width="0.0210%" height="15" fill="rgb(254,201,21)" fg:x="41104" fg:w="10"/><text x="86.5721%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (72 samples, 0.15%)</title><rect x="86.2108%" y="1365" width="0.1512%" height="15" fill="rgb(250,186,11)" fg:x="41051" fg:w="72"/><text x="86.4608%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (69 samples, 0.14%)</title><rect x="86.2171%" y="1349" width="0.1449%" height="15" fill="rgb(211,174,5)" fg:x="41054" fg:w="69"/><text x="86.4671%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (57 samples, 0.12%)</title><rect x="86.2423%" y="1333" width="0.1197%" height="15" fill="rgb(214,121,10)" fg:x="41066" fg:w="57"/><text x="86.4923%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (20 samples, 0.04%)</title><rect x="86.3200%" y="1317" width="0.0420%" height="15" fill="rgb(241,66,2)" fg:x="41103" fg:w="20"/><text x="86.5700%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (20 samples, 0.04%)</title><rect x="86.3200%" y="1301" width="0.0420%" height="15" fill="rgb(220,167,19)" fg:x="41103" fg:w="20"/><text x="86.5700%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="86.3200%" y="1285" width="0.0420%" height="15" fill="rgb(231,54,50)" fg:x="41103" fg:w="20"/><text x="86.5700%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="86.3200%" y="1269" width="0.0420%" height="15" fill="rgb(239,217,53)" fg:x="41103" fg:w="20"/><text x="86.5700%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="86.3452%" y="1253" width="0.0168%" height="15" fill="rgb(248,8,0)" fg:x="41115" fg:w="8"/><text x="86.5952%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="86.3473%" y="1237" width="0.0147%" height="15" fill="rgb(229,118,37)" fg:x="41116" fg:w="7"/><text x="86.5973%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.3473%" y="1221" width="0.0147%" height="15" fill="rgb(253,223,43)" fg:x="41116" fg:w="7"/><text x="86.5973%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.3473%" y="1205" width="0.0147%" height="15" fill="rgb(211,77,36)" fg:x="41116" fg:w="7"/><text x="86.5973%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.3767%" y="1205" width="0.0105%" height="15" fill="rgb(219,3,53)" fg:x="41130" fg:w="5"/><text x="86.6267%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="86.3662%" y="1237" width="0.0294%" height="15" fill="rgb(244,45,42)" fg:x="41125" fg:w="14"/><text x="86.6162%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="86.3767%" y="1221" width="0.0189%" height="15" fill="rgb(225,95,27)" fg:x="41130" fg:w="9"/><text x="86.6267%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="86.4019%" y="1189" width="0.0168%" height="15" fill="rgb(207,74,8)" fg:x="41142" fg:w="8"/><text x="86.6519%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.4040%" y="1173" width="0.0147%" height="15" fill="rgb(243,63,36)" fg:x="41143" fg:w="7"/><text x="86.6540%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.4187%" y="1189" width="0.0105%" height="15" fill="rgb(211,180,12)" fg:x="41150" fg:w="5"/><text x="86.6687%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.4187%" y="1173" width="0.0105%" height="15" fill="rgb(254,166,49)" fg:x="41150" fg:w="5"/><text x="86.6687%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="86.3641%" y="1269" width="0.0672%" height="15" fill="rgb(205,19,0)" fg:x="41124" fg:w="32"/><text x="86.6141%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (31 samples, 0.07%)</title><rect x="86.3662%" y="1253" width="0.0651%" height="15" fill="rgb(224,172,32)" fg:x="41125" fg:w="31"/><text x="86.6162%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (17 samples, 0.04%)</title><rect x="86.3956%" y="1237" width="0.0357%" height="15" fill="rgb(254,136,30)" fg:x="41139" fg:w="17"/><text x="86.6456%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="86.3956%" y="1221" width="0.0357%" height="15" fill="rgb(246,19,35)" fg:x="41139" fg:w="17"/><text x="86.6456%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="86.4019%" y="1205" width="0.0294%" height="15" fill="rgb(219,24,36)" fg:x="41142" fg:w="14"/><text x="86.6519%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.4481%" y="965" width="0.0105%" height="15" fill="rgb(251,55,1)" fg:x="41164" fg:w="5"/><text x="86.6981%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.4481%" y="949" width="0.0105%" height="15" fill="rgb(218,117,39)" fg:x="41164" fg:w="5"/><text x="86.6981%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="86.4334%" y="1221" width="0.0378%" height="15" fill="rgb(248,169,11)" fg:x="41157" fg:w="18"/><text x="86.6834%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="86.4376%" y="1205" width="0.0336%" height="15" fill="rgb(244,40,44)" fg:x="41159" fg:w="16"/><text x="86.6876%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="86.4439%" y="1189" width="0.0273%" height="15" fill="rgb(234,62,37)" fg:x="41162" fg:w="13"/><text x="86.6939%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="86.4439%" y="1173" width="0.0273%" height="15" fill="rgb(207,117,42)" fg:x="41162" fg:w="13"/><text x="86.6939%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="86.4439%" y="1157" width="0.0273%" height="15" fill="rgb(213,43,2)" fg:x="41162" fg:w="13"/><text x="86.6939%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="86.4481%" y="1141" width="0.0231%" height="15" fill="rgb(244,202,51)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.4481%" y="1125" width="0.0231%" height="15" fill="rgb(253,174,46)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.4481%" y="1109" width="0.0231%" height="15" fill="rgb(251,23,1)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="86.4481%" y="1093" width="0.0231%" height="15" fill="rgb(253,26,1)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="86.4481%" y="1077" width="0.0231%" height="15" fill="rgb(216,89,31)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.4481%" y="1061" width="0.0231%" height="15" fill="rgb(209,109,5)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.4481%" y="1045" width="0.0231%" height="15" fill="rgb(229,63,13)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.4481%" y="1029" width="0.0231%" height="15" fill="rgb(238,137,54)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.4481%" y="1013" width="0.0231%" height="15" fill="rgb(228,1,9)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.4481%" y="997" width="0.0231%" height="15" fill="rgb(249,120,48)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.4481%" y="981" width="0.0231%" height="15" fill="rgb(209,72,36)" fg:x="41164" fg:w="11"/><text x="86.6981%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="86.4586%" y="965" width="0.0126%" height="15" fill="rgb(247,98,49)" fg:x="41169" fg:w="6"/><text x="86.7086%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.4586%" y="949" width="0.0126%" height="15" fill="rgb(233,75,36)" fg:x="41169" fg:w="6"/><text x="86.7086%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="86.4586%" y="933" width="0.0126%" height="15" fill="rgb(225,14,24)" fg:x="41169" fg:w="6"/><text x="86.7086%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="86.4712%" y="1221" width="0.0126%" height="15" fill="rgb(237,193,20)" fg:x="41175" fg:w="6"/><text x="86.7212%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.4712%" y="1205" width="0.0126%" height="15" fill="rgb(239,122,19)" fg:x="41175" fg:w="6"/><text x="86.7212%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.4733%" y="1189" width="0.0105%" height="15" fill="rgb(231,220,10)" fg:x="41176" fg:w="5"/><text x="86.7233%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (26 samples, 0.05%)</title><rect x="86.4313%" y="1269" width="0.0546%" height="15" fill="rgb(220,66,15)" fg:x="41156" fg:w="26"/><text x="86.6813%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (26 samples, 0.05%)</title><rect x="86.4313%" y="1253" width="0.0546%" height="15" fill="rgb(215,171,52)" fg:x="41156" fg:w="26"/><text x="86.6813%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="86.4334%" y="1237" width="0.0525%" height="15" fill="rgb(241,169,50)" fg:x="41157" fg:w="25"/><text x="86.6834%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (60 samples, 0.13%)</title><rect x="86.3620%" y="1301" width="0.1260%" height="15" fill="rgb(236,189,0)" fg:x="41123" fg:w="60"/><text x="86.6120%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (59 samples, 0.12%)</title><rect x="86.3641%" y="1285" width="0.1239%" height="15" fill="rgb(217,147,20)" fg:x="41124" fg:w="59"/><text x="86.6141%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.5069%" y="981" width="0.0105%" height="15" fill="rgb(206,188,39)" fg:x="41192" fg:w="5"/><text x="86.7569%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.5069%" y="965" width="0.0105%" height="15" fill="rgb(227,118,25)" fg:x="41192" fg:w="5"/><text x="86.7569%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="86.5006%" y="1205" width="0.0315%" height="15" fill="rgb(248,171,40)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="86.5006%" y="1189" width="0.0315%" height="15" fill="rgb(251,90,54)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="86.5006%" y="1173" width="0.0315%" height="15" fill="rgb(234,11,46)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="86.5006%" y="1157" width="0.0315%" height="15" fill="rgb(229,134,13)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="86.5006%" y="1141" width="0.0315%" height="15" fill="rgb(223,129,3)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="86.5006%" y="1125" width="0.0315%" height="15" fill="rgb(221,124,13)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (15 samples, 0.03%)</title><rect x="86.5006%" y="1109" width="0.0315%" height="15" fill="rgb(234,3,18)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (15 samples, 0.03%)</title><rect x="86.5006%" y="1093" width="0.0315%" height="15" fill="rgb(249,199,20)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="86.5006%" y="1077" width="0.0315%" height="15" fill="rgb(224,134,6)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="86.5006%" y="1061" width="0.0315%" height="15" fill="rgb(254,83,26)" fg:x="41189" fg:w="15"/><text x="86.7506%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="86.5069%" y="1045" width="0.0252%" height="15" fill="rgb(217,88,9)" fg:x="41192" fg:w="12"/><text x="86.7569%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="86.5069%" y="1029" width="0.0252%" height="15" fill="rgb(225,73,2)" fg:x="41192" fg:w="12"/><text x="86.7569%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="86.5069%" y="1013" width="0.0252%" height="15" fill="rgb(226,44,39)" fg:x="41192" fg:w="12"/><text x="86.7569%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="86.5069%" y="997" width="0.0252%" height="15" fill="rgb(228,53,17)" fg:x="41192" fg:w="12"/><text x="86.7569%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="86.5174%" y="981" width="0.0147%" height="15" fill="rgb(212,27,27)" fg:x="41197" fg:w="7"/><text x="86.7674%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.5174%" y="965" width="0.0147%" height="15" fill="rgb(241,50,6)" fg:x="41197" fg:w="7"/><text x="86.7674%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.5174%" y="949" width="0.0147%" height="15" fill="rgb(225,28,51)" fg:x="41197" fg:w="7"/><text x="86.7674%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (18 samples, 0.04%)</title><rect x="86.4964%" y="1253" width="0.0378%" height="15" fill="rgb(215,33,16)" fg:x="41187" fg:w="18"/><text x="86.7464%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="86.4964%" y="1237" width="0.0378%" height="15" fill="rgb(243,40,39)" fg:x="41187" fg:w="18"/><text x="86.7464%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="86.4964%" y="1221" width="0.0378%" height="15" fill="rgb(225,11,42)" fg:x="41187" fg:w="18"/><text x="86.7464%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (25 samples, 0.05%)</title><rect x="86.4880%" y="1301" width="0.0525%" height="15" fill="rgb(241,220,38)" fg:x="41183" fg:w="25"/><text x="86.7380%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="86.4880%" y="1285" width="0.0525%" height="15" fill="rgb(244,52,35)" fg:x="41183" fg:w="25"/><text x="86.7380%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="86.4880%" y="1269" width="0.0525%" height="15" fill="rgb(246,42,46)" fg:x="41183" fg:w="25"/><text x="86.7380%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (276 samples, 0.58%)</title><rect x="85.9903%" y="1413" width="0.5796%" height="15" fill="rgb(205,184,13)" fg:x="40946" fg:w="276"/><text x="86.2403%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (272 samples, 0.57%)</title><rect x="85.9987%" y="1397" width="0.5712%" height="15" fill="rgb(209,48,36)" fg:x="40950" fg:w="272"/><text x="86.2487%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (248 samples, 0.52%)</title><rect x="86.0491%" y="1381" width="0.5208%" height="15" fill="rgb(244,34,51)" fg:x="40974" fg:w="248"/><text x="86.2991%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (99 samples, 0.21%)</title><rect x="86.3620%" y="1365" width="0.2079%" height="15" fill="rgb(221,107,33)" fg:x="41123" fg:w="99"/><text x="86.6120%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (99 samples, 0.21%)</title><rect x="86.3620%" y="1349" width="0.2079%" height="15" fill="rgb(224,203,12)" fg:x="41123" fg:w="99"/><text x="86.6120%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (99 samples, 0.21%)</title><rect x="86.3620%" y="1333" width="0.2079%" height="15" fill="rgb(230,215,18)" fg:x="41123" fg:w="99"/><text x="86.6120%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (99 samples, 0.21%)</title><rect x="86.3620%" y="1317" width="0.2079%" height="15" fill="rgb(206,185,35)" fg:x="41123" fg:w="99"/><text x="86.6120%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="86.5405%" y="1301" width="0.0294%" height="15" fill="rgb(228,140,34)" fg:x="41208" fg:w="14"/><text x="86.7905%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="86.5405%" y="1285" width="0.0294%" height="15" fill="rgb(208,93,13)" fg:x="41208" fg:w="14"/><text x="86.7905%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="86.5405%" y="1269" width="0.0294%" height="15" fill="rgb(221,193,39)" fg:x="41208" fg:w="14"/><text x="86.7905%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.5468%" y="1253" width="0.0231%" height="15" fill="rgb(241,132,34)" fg:x="41211" fg:w="11"/><text x="86.7968%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="86.5594%" y="1237" width="0.0105%" height="15" fill="rgb(221,141,10)" fg:x="41217" fg:w="5"/><text x="86.8094%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="86.5762%" y="1365" width="0.0147%" height="15" fill="rgb(226,90,31)" fg:x="41225" fg:w="7"/><text x="86.8262%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="86.6224%" y="1253" width="0.0252%" height="15" fill="rgb(243,75,5)" fg:x="41247" fg:w="12"/><text x="86.8724%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="86.6308%" y="1237" width="0.0168%" height="15" fill="rgb(227,156,21)" fg:x="41251" fg:w="8"/><text x="86.8808%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.6371%" y="1221" width="0.0105%" height="15" fill="rgb(250,195,8)" fg:x="41254" fg:w="5"/><text x="86.8871%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="86.6581%" y="1205" width="0.0168%" height="15" fill="rgb(220,134,5)" fg:x="41264" fg:w="8"/><text x="86.9081%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.6644%" y="1189" width="0.0105%" height="15" fill="rgb(246,106,34)" fg:x="41267" fg:w="5"/><text x="86.9144%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="86.6476%" y="1253" width="0.0315%" height="15" fill="rgb(205,1,4)" fg:x="41259" fg:w="15"/><text x="86.8976%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="86.6476%" y="1237" width="0.0315%" height="15" fill="rgb(224,151,29)" fg:x="41259" fg:w="15"/><text x="86.8976%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="86.6581%" y="1221" width="0.0210%" height="15" fill="rgb(251,196,0)" fg:x="41264" fg:w="10"/><text x="86.9081%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (33 samples, 0.07%)</title><rect x="86.6161%" y="1285" width="0.0693%" height="15" fill="rgb(212,127,0)" fg:x="41244" fg:w="33"/><text x="86.8661%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="86.6224%" y="1269" width="0.0630%" height="15" fill="rgb(236,71,53)" fg:x="41247" fg:w="30"/><text x="86.8724%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="86.6980%" y="1237" width="0.0462%" height="15" fill="rgb(227,99,0)" fg:x="41283" fg:w="22"/><text x="86.9480%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="86.7043%" y="1221" width="0.0399%" height="15" fill="rgb(239,89,21)" fg:x="41286" fg:w="19"/><text x="86.9543%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="86.7127%" y="1205" width="0.0315%" height="15" fill="rgb(243,122,19)" fg:x="41290" fg:w="15"/><text x="86.9627%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="86.7127%" y="1189" width="0.0315%" height="15" fill="rgb(229,192,45)" fg:x="41290" fg:w="15"/><text x="86.9627%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="86.7148%" y="1173" width="0.0294%" height="15" fill="rgb(235,165,35)" fg:x="41291" fg:w="14"/><text x="86.9648%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="86.7211%" y="1157" width="0.0231%" height="15" fill="rgb(253,202,0)" fg:x="41294" fg:w="11"/><text x="86.9711%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="86.7211%" y="1141" width="0.0231%" height="15" fill="rgb(235,51,20)" fg:x="41294" fg:w="11"/><text x="86.9711%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.7211%" y="1125" width="0.0231%" height="15" fill="rgb(218,95,46)" fg:x="41294" fg:w="11"/><text x="86.9711%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.7211%" y="1109" width="0.0231%" height="15" fill="rgb(212,81,10)" fg:x="41294" fg:w="11"/><text x="86.9711%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="86.7295%" y="1093" width="0.0147%" height="15" fill="rgb(240,59,0)" fg:x="41298" fg:w="7"/><text x="86.9795%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.7295%" y="1077" width="0.0147%" height="15" fill="rgb(212,191,42)" fg:x="41298" fg:w="7"/><text x="86.9795%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.7295%" y="1061" width="0.0147%" height="15" fill="rgb(233,140,3)" fg:x="41298" fg:w="7"/><text x="86.9795%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="86.7337%" y="1045" width="0.0105%" height="15" fill="rgb(215,69,23)" fg:x="41300" fg:w="5"/><text x="86.9837%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="86.7337%" y="1029" width="0.0105%" height="15" fill="rgb(240,202,20)" fg:x="41300" fg:w="5"/><text x="86.9837%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.7337%" y="1013" width="0.0105%" height="15" fill="rgb(209,146,50)" fg:x="41300" fg:w="5"/><text x="86.9837%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.7337%" y="997" width="0.0105%" height="15" fill="rgb(253,102,54)" fg:x="41300" fg:w="5"/><text x="86.9837%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.7610%" y="1189" width="0.0105%" height="15" fill="rgb(250,173,47)" fg:x="41313" fg:w="5"/><text x="87.0110%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.7610%" y="1173" width="0.0105%" height="15" fill="rgb(232,142,7)" fg:x="41313" fg:w="5"/><text x="87.0110%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="86.7442%" y="1237" width="0.0294%" height="15" fill="rgb(230,157,47)" fg:x="41305" fg:w="14"/><text x="86.9942%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="86.7442%" y="1221" width="0.0294%" height="15" fill="rgb(214,177,35)" fg:x="41305" fg:w="14"/><text x="86.9942%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.7505%" y="1205" width="0.0231%" height="15" fill="rgb(234,119,46)" fg:x="41308" fg:w="11"/><text x="87.0005%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (43 samples, 0.09%)</title><rect x="86.6854%" y="1285" width="0.0903%" height="15" fill="rgb(241,180,50)" fg:x="41277" fg:w="43"/><text x="86.9354%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (43 samples, 0.09%)</title><rect x="86.6854%" y="1269" width="0.0903%" height="15" fill="rgb(221,54,25)" fg:x="41277" fg:w="43"/><text x="86.9354%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="86.6959%" y="1253" width="0.0798%" height="15" fill="rgb(209,157,44)" fg:x="41282" fg:w="38"/><text x="86.9459%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.7757%" y="1221" width="0.0105%" height="15" fill="rgb(246,115,41)" fg:x="41320" fg:w="5"/><text x="87.0257%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.7757%" y="1205" width="0.0105%" height="15" fill="rgb(229,86,1)" fg:x="41320" fg:w="5"/><text x="87.0257%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (86 samples, 0.18%)</title><rect x="86.6077%" y="1317" width="0.1806%" height="15" fill="rgb(240,108,53)" fg:x="41240" fg:w="86"/><text x="86.8577%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (84 samples, 0.18%)</title><rect x="86.6119%" y="1301" width="0.1764%" height="15" fill="rgb(227,134,2)" fg:x="41242" fg:w="84"/><text x="86.8619%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="86.7757%" y="1285" width="0.0126%" height="15" fill="rgb(213,129,25)" fg:x="41320" fg:w="6"/><text x="87.0257%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="86.7757%" y="1269" width="0.0126%" height="15" fill="rgb(226,35,21)" fg:x="41320" fg:w="6"/><text x="87.0257%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.7757%" y="1253" width="0.0126%" height="15" fill="rgb(208,129,26)" fg:x="41320" fg:w="6"/><text x="87.0257%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="86.7757%" y="1237" width="0.0126%" height="15" fill="rgb(224,83,6)" fg:x="41320" fg:w="6"/><text x="87.0257%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.8135%" y="1237" width="0.0105%" height="15" fill="rgb(227,52,39)" fg:x="41338" fg:w="5"/><text x="87.0635%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.8135%" y="1221" width="0.0105%" height="15" fill="rgb(241,30,17)" fg:x="41338" fg:w="5"/><text x="87.0635%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="86.7967%" y="1269" width="0.0294%" height="15" fill="rgb(246,186,42)" fg:x="41330" fg:w="14"/><text x="87.0467%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="86.8072%" y="1253" width="0.0189%" height="15" fill="rgb(221,169,15)" fg:x="41335" fg:w="9"/><text x="87.0572%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="86.8261%" y="1269" width="0.0168%" height="15" fill="rgb(235,108,21)" fg:x="41344" fg:w="8"/><text x="87.0761%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="86.8261%" y="1253" width="0.0168%" height="15" fill="rgb(219,148,30)" fg:x="41344" fg:w="8"/><text x="87.0761%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.8324%" y="1237" width="0.0105%" height="15" fill="rgb(220,109,5)" fg:x="41347" fg:w="5"/><text x="87.0824%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.8324%" y="1221" width="0.0105%" height="15" fill="rgb(213,203,48)" fg:x="41347" fg:w="5"/><text x="87.0824%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (27 samples, 0.06%)</title><rect x="86.7883%" y="1317" width="0.0567%" height="15" fill="rgb(244,71,33)" fg:x="41326" fg:w="27"/><text x="87.0383%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (27 samples, 0.06%)</title><rect x="86.7883%" y="1301" width="0.0567%" height="15" fill="rgb(209,23,2)" fg:x="41326" fg:w="27"/><text x="87.0383%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (24 samples, 0.05%)</title><rect x="86.7946%" y="1285" width="0.0504%" height="15" fill="rgb(219,97,7)" fg:x="41329" fg:w="24"/><text x="87.0446%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="86.8513%" y="1221" width="0.0210%" height="15" fill="rgb(216,161,23)" fg:x="41356" fg:w="10"/><text x="87.1013%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="86.8555%" y="1205" width="0.0168%" height="15" fill="rgb(207,45,42)" fg:x="41358" fg:w="8"/><text x="87.1055%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="86.8576%" y="1189" width="0.0147%" height="15" fill="rgb(241,61,4)" fg:x="41359" fg:w="7"/><text x="87.1076%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.8597%" y="1173" width="0.0126%" height="15" fill="rgb(236,170,1)" fg:x="41360" fg:w="6"/><text x="87.1097%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.8618%" y="1157" width="0.0105%" height="15" fill="rgb(239,72,5)" fg:x="41361" fg:w="5"/><text x="87.1118%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="86.8492%" y="1253" width="0.0294%" height="15" fill="rgb(214,13,50)" fg:x="41355" fg:w="14"/><text x="87.0992%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="86.8513%" y="1237" width="0.0273%" height="15" fill="rgb(224,88,9)" fg:x="41356" fg:w="13"/><text x="87.1013%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.8786%" y="1205" width="0.0105%" height="15" fill="rgb(238,192,34)" fg:x="41369" fg:w="5"/><text x="87.1286%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.8786%" y="1189" width="0.0105%" height="15" fill="rgb(217,203,50)" fg:x="41369" fg:w="5"/><text x="87.1286%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="86.8786%" y="1253" width="0.0336%" height="15" fill="rgb(241,123,32)" fg:x="41369" fg:w="16"/><text x="87.1286%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="86.8786%" y="1237" width="0.0336%" height="15" fill="rgb(248,151,39)" fg:x="41369" fg:w="16"/><text x="87.1286%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="86.8786%" y="1221" width="0.0336%" height="15" fill="rgb(208,89,6)" fg:x="41369" fg:w="16"/><text x="87.1286%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (10 samples, 0.02%)</title><rect x="86.8912%" y="1205" width="0.0210%" height="15" fill="rgb(254,43,26)" fg:x="41375" fg:w="10"/><text x="87.1412%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (10 samples, 0.02%)</title><rect x="86.8912%" y="1189" width="0.0210%" height="15" fill="rgb(216,158,13)" fg:x="41375" fg:w="10"/><text x="87.1412%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="86.8912%" y="1173" width="0.0210%" height="15" fill="rgb(212,47,37)" fg:x="41375" fg:w="10"/><text x="87.1412%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="86.8912%" y="1157" width="0.0210%" height="15" fill="rgb(254,16,10)" fg:x="41375" fg:w="10"/><text x="87.1412%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="86.8975%" y="1141" width="0.0147%" height="15" fill="rgb(223,228,16)" fg:x="41378" fg:w="7"/><text x="87.1475%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.8975%" y="1125" width="0.0147%" height="15" fill="rgb(249,108,50)" fg:x="41378" fg:w="7"/><text x="87.1475%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="86.8975%" y="1109" width="0.0147%" height="15" fill="rgb(208,220,5)" fg:x="41378" fg:w="7"/><text x="87.1475%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="86.8996%" y="1093" width="0.0126%" height="15" fill="rgb(217,89,48)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="86.8996%" y="1077" width="0.0126%" height="15" fill="rgb(212,113,41)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.8996%" y="1061" width="0.0126%" height="15" fill="rgb(231,127,5)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="86.8996%" y="1045" width="0.0126%" height="15" fill="rgb(217,141,17)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="86.8996%" y="1029" width="0.0126%" height="15" fill="rgb(245,125,54)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="86.8996%" y="1013" width="0.0126%" height="15" fill="rgb(248,125,3)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="86.8996%" y="997" width="0.0126%" height="15" fill="rgb(236,119,51)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="86.8996%" y="981" width="0.0126%" height="15" fill="rgb(239,99,8)" fg:x="41379" fg:w="6"/><text x="87.1496%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="86.9017%" y="965" width="0.0105%" height="15" fill="rgb(224,228,4)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="86.9017%" y="949" width="0.0105%" height="15" fill="rgb(220,131,45)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.9017%" y="933" width="0.0105%" height="15" fill="rgb(215,62,5)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.9017%" y="917" width="0.0105%" height="15" fill="rgb(253,12,24)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.9017%" y="901" width="0.0105%" height="15" fill="rgb(248,120,50)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.9017%" y="885" width="0.0105%" height="15" fill="rgb(245,194,10)" fg:x="41380" fg:w="5"/><text x="87.1517%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (159 samples, 0.33%)</title><rect x="86.5930%" y="1349" width="0.3339%" height="15" fill="rgb(241,149,38)" fg:x="41233" fg:w="159"/><text x="86.8430%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (155 samples, 0.33%)</title><rect x="86.6014%" y="1333" width="0.3255%" height="15" fill="rgb(219,215,7)" fg:x="41237" fg:w="155"/><text x="86.8514%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (39 samples, 0.08%)</title><rect x="86.8450%" y="1317" width="0.0819%" height="15" fill="rgb(208,120,31)" fg:x="41353" fg:w="39"/><text x="87.0950%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (39 samples, 0.08%)</title><rect x="86.8450%" y="1301" width="0.0819%" height="15" fill="rgb(244,30,8)" fg:x="41353" fg:w="39"/><text x="87.0950%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (39 samples, 0.08%)</title><rect x="86.8450%" y="1285" width="0.0819%" height="15" fill="rgb(238,35,44)" fg:x="41353" fg:w="39"/><text x="87.0950%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="86.8471%" y="1269" width="0.0798%" height="15" fill="rgb(243,218,37)" fg:x="41354" fg:w="38"/><text x="87.0971%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="86.9122%" y="1253" width="0.0147%" height="15" fill="rgb(218,169,10)" fg:x="41385" fg:w="7"/><text x="87.1622%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="86.9122%" y="1237" width="0.0147%" height="15" fill="rgb(221,144,10)" fg:x="41385" fg:w="7"/><text x="87.1622%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.9122%" y="1221" width="0.0147%" height="15" fill="rgb(226,41,38)" fg:x="41385" fg:w="7"/><text x="87.1622%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.9164%" y="1205" width="0.0105%" height="15" fill="rgb(228,3,1)" fg:x="41387" fg:w="5"/><text x="87.1664%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="86.9374%" y="1269" width="0.0147%" height="15" fill="rgb(209,129,12)" fg:x="41397" fg:w="7"/><text x="87.1874%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.9416%" y="1253" width="0.0105%" height="15" fill="rgb(213,136,33)" fg:x="41399" fg:w="5"/><text x="87.1916%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="86.9353%" y="1301" width="0.0273%" height="15" fill="rgb(209,181,29)" fg:x="41396" fg:w="13"/><text x="87.1853%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="86.9374%" y="1285" width="0.0252%" height="15" fill="rgb(234,173,18)" fg:x="41397" fg:w="12"/><text x="87.1874%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.9521%" y="1269" width="0.0105%" height="15" fill="rgb(227,73,47)" fg:x="41404" fg:w="5"/><text x="87.2021%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.9521%" y="1253" width="0.0105%" height="15" fill="rgb(234,9,34)" fg:x="41404" fg:w="5"/><text x="87.2021%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="86.9626%" y="1301" width="0.0231%" height="15" fill="rgb(235,172,15)" fg:x="41409" fg:w="11"/><text x="87.2126%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="86.9626%" y="1285" width="0.0231%" height="15" fill="rgb(245,61,2)" fg:x="41409" fg:w="11"/><text x="87.2126%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="86.9626%" y="1269" width="0.0231%" height="15" fill="rgb(238,39,47)" fg:x="41409" fg:w="11"/><text x="87.2126%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="86.9752%" y="1253" width="0.0105%" height="15" fill="rgb(234,37,24)" fg:x="41415" fg:w="5"/><text x="87.2252%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="86.9752%" y="1237" width="0.0105%" height="15" fill="rgb(248,223,24)" fg:x="41415" fg:w="5"/><text x="87.2252%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (37 samples, 0.08%)</title><rect x="86.9269%" y="1349" width="0.0777%" height="15" fill="rgb(223,12,15)" fg:x="41392" fg:w="37"/><text x="87.1769%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (37 samples, 0.08%)</title><rect x="86.9269%" y="1333" width="0.0777%" height="15" fill="rgb(249,6,3)" fg:x="41392" fg:w="37"/><text x="87.1769%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (33 samples, 0.07%)</title><rect x="86.9353%" y="1317" width="0.0693%" height="15" fill="rgb(237,105,33)" fg:x="41396" fg:w="33"/><text x="87.1853%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="86.9857%" y="1301" width="0.0189%" height="15" fill="rgb(252,208,35)" fg:x="41420" fg:w="9"/><text x="87.2357%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="86.9857%" y="1285" width="0.0189%" height="15" fill="rgb(215,181,35)" fg:x="41420" fg:w="9"/><text x="87.2357%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="86.9857%" y="1269" width="0.0189%" height="15" fill="rgb(246,212,3)" fg:x="41420" fg:w="9"/><text x="87.2357%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="86.9857%" y="1253" width="0.0189%" height="15" fill="rgb(247,156,24)" fg:x="41420" fg:w="9"/><text x="87.2357%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="86.9941%" y="1237" width="0.0105%" height="15" fill="rgb(248,9,31)" fg:x="41424" fg:w="5"/><text x="87.2441%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="86.9941%" y="1221" width="0.0105%" height="15" fill="rgb(234,26,45)" fg:x="41424" fg:w="5"/><text x="87.2441%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="86.9941%" y="1205" width="0.0105%" height="15" fill="rgb(249,11,32)" fg:x="41424" fg:w="5"/><text x="87.2441%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.0214%" y="1189" width="0.0126%" height="15" fill="rgb(249,162,33)" fg:x="41437" fg:w="6"/><text x="87.2714%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="87.0214%" y="1221" width="0.0252%" height="15" fill="rgb(232,4,32)" fg:x="41437" fg:w="12"/><text x="87.2714%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="87.0214%" y="1205" width="0.0252%" height="15" fill="rgb(212,5,45)" fg:x="41437" fg:w="12"/><text x="87.2714%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="87.0340%" y="1189" width="0.0126%" height="15" fill="rgb(227,95,13)" fg:x="41443" fg:w="6"/><text x="87.2840%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.0340%" y="1173" width="0.0126%" height="15" fill="rgb(223,205,10)" fg:x="41443" fg:w="6"/><text x="87.2840%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="87.0130%" y="1253" width="0.0504%" height="15" fill="rgb(222,178,8)" fg:x="41433" fg:w="24"/><text x="87.2630%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="87.0214%" y="1237" width="0.0420%" height="15" fill="rgb(216,13,22)" fg:x="41437" fg:w="20"/><text x="87.2714%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="87.0466%" y="1221" width="0.0168%" height="15" fill="rgb(240,167,12)" fg:x="41449" fg:w="8"/><text x="87.2966%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="87.0466%" y="1205" width="0.0168%" height="15" fill="rgb(235,68,35)" fg:x="41449" fg:w="8"/><text x="87.2966%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="87.0466%" y="1189" width="0.0168%" height="15" fill="rgb(253,40,27)" fg:x="41449" fg:w="8"/><text x="87.2966%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="87.0466%" y="1173" width="0.0168%" height="15" fill="rgb(214,19,28)" fg:x="41449" fg:w="8"/><text x="87.2966%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="87.0508%" y="1157" width="0.0126%" height="15" fill="rgb(210,167,45)" fg:x="41451" fg:w="6"/><text x="87.3008%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="87.0529%" y="1141" width="0.0105%" height="15" fill="rgb(232,97,40)" fg:x="41452" fg:w="5"/><text x="87.3029%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.0529%" y="1125" width="0.0105%" height="15" fill="rgb(250,35,23)" fg:x="41452" fg:w="5"/><text x="87.3029%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="87.0634%" y="1253" width="0.0168%" height="15" fill="rgb(248,47,53)" fg:x="41457" fg:w="8"/><text x="87.3134%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="87.0634%" y="1237" width="0.0168%" height="15" fill="rgb(226,58,50)" fg:x="41457" fg:w="8"/><text x="87.3134%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="87.0697%" y="1221" width="0.0105%" height="15" fill="rgb(217,105,26)" fg:x="41460" fg:w="5"/><text x="87.3197%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.0802%" y="1189" width="0.0105%" height="15" fill="rgb(208,64,1)" fg:x="41465" fg:w="5"/><text x="87.3302%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (44 samples, 0.09%)</title><rect x="87.0109%" y="1285" width="0.0924%" height="15" fill="rgb(214,80,1)" fg:x="41432" fg:w="44"/><text x="87.2609%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (43 samples, 0.09%)</title><rect x="87.0130%" y="1269" width="0.0903%" height="15" fill="rgb(206,175,26)" fg:x="41433" fg:w="43"/><text x="87.2630%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="87.0802%" y="1253" width="0.0231%" height="15" fill="rgb(235,156,37)" fg:x="41465" fg:w="11"/><text x="87.3302%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="87.0802%" y="1237" width="0.0231%" height="15" fill="rgb(213,100,9)" fg:x="41465" fg:w="11"/><text x="87.3302%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="87.0802%" y="1221" width="0.0231%" height="15" fill="rgb(241,15,13)" fg:x="41465" fg:w="11"/><text x="87.3302%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="87.0802%" y="1205" width="0.0231%" height="15" fill="rgb(205,97,43)" fg:x="41465" fg:w="11"/><text x="87.3302%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="87.0907%" y="1189" width="0.0126%" height="15" fill="rgb(216,106,32)" fg:x="41470" fg:w="6"/><text x="87.3407%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.0907%" y="1173" width="0.0126%" height="15" fill="rgb(226,200,8)" fg:x="41470" fg:w="6"/><text x="87.3407%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="87.0907%" y="1157" width="0.0126%" height="15" fill="rgb(244,54,29)" fg:x="41470" fg:w="6"/><text x="87.3407%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="87.0928%" y="1141" width="0.0105%" height="15" fill="rgb(252,169,12)" fg:x="41471" fg:w="5"/><text x="87.3428%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="87.0928%" y="1125" width="0.0105%" height="15" fill="rgb(231,199,11)" fg:x="41471" fg:w="5"/><text x="87.3428%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.0928%" y="1109" width="0.0105%" height="15" fill="rgb(233,191,18)" fg:x="41471" fg:w="5"/><text x="87.3428%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="87.0928%" y="1093" width="0.0105%" height="15" fill="rgb(215,83,47)" fg:x="41471" fg:w="5"/><text x="87.3428%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.1159%" y="1189" width="0.0105%" height="15" fill="rgb(251,67,19)" fg:x="41482" fg:w="5"/><text x="87.3659%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="87.1159%" y="1173" width="0.0105%" height="15" fill="rgb(240,7,20)" fg:x="41482" fg:w="5"/><text x="87.3659%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="87.1264%" y="1189" width="0.0168%" height="15" fill="rgb(210,150,26)" fg:x="41487" fg:w="8"/><text x="87.3764%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="87.1264%" y="1173" width="0.0168%" height="15" fill="rgb(228,75,42)" fg:x="41487" fg:w="8"/><text x="87.3764%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="87.1264%" y="1157" width="0.0168%" height="15" fill="rgb(237,134,48)" fg:x="41487" fg:w="8"/><text x="87.3764%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="87.1306%" y="1141" width="0.0126%" height="15" fill="rgb(205,80,50)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="87.1306%" y="1125" width="0.0126%" height="15" fill="rgb(217,74,48)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.1306%" y="1109" width="0.0126%" height="15" fill="rgb(205,82,50)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="87.1306%" y="1093" width="0.0126%" height="15" fill="rgb(228,1,33)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.1306%" y="1077" width="0.0126%" height="15" fill="rgb(214,50,23)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="87.1306%" y="1061" width="0.0126%" height="15" fill="rgb(210,62,9)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.1306%" y="1045" width="0.0126%" height="15" fill="rgb(210,104,37)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="87.1306%" y="1029" width="0.0126%" height="15" fill="rgb(232,104,43)" fg:x="41489" fg:w="6"/><text x="87.3806%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="87.1117%" y="1221" width="0.0336%" height="15" fill="rgb(244,52,6)" fg:x="41480" fg:w="16"/><text x="87.3617%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="87.1159%" y="1205" width="0.0294%" height="15" fill="rgb(211,174,52)" fg:x="41482" fg:w="14"/><text x="87.3659%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (880 samples, 1.85%)</title><rect x="85.3078%" y="1461" width="1.8481%" height="15" fill="rgb(229,48,4)" fg:x="40621" fg:w="880"/><text x="85.5578%" y="1471.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (878 samples, 1.84%)</title><rect x="85.3120%" y="1445" width="1.8439%" height="15" fill="rgb(205,155,16)" fg:x="40623" fg:w="878"/><text x="85.5620%" y="1455.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (847 samples, 1.78%)</title><rect x="85.3771%" y="1429" width="1.7788%" height="15" fill="rgb(211,141,53)" fg:x="40654" fg:w="847"/><text x="85.6271%" y="1439.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (279 samples, 0.59%)</title><rect x="86.5699%" y="1413" width="0.5859%" height="15" fill="rgb(240,148,11)" fg:x="41222" fg:w="279"/><text x="86.8199%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (278 samples, 0.58%)</title><rect x="86.5720%" y="1397" width="0.5838%" height="15" fill="rgb(214,45,23)" fg:x="41223" fg:w="278"/><text x="86.8220%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (278 samples, 0.58%)</title><rect x="86.5720%" y="1381" width="0.5838%" height="15" fill="rgb(248,74,26)" fg:x="41223" fg:w="278"/><text x="86.8220%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (269 samples, 0.56%)</title><rect x="86.5909%" y="1365" width="0.5649%" height="15" fill="rgb(218,121,16)" fg:x="41232" fg:w="269"/><text x="86.8409%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (72 samples, 0.15%)</title><rect x="87.0046%" y="1349" width="0.1512%" height="15" fill="rgb(218,10,47)" fg:x="41429" fg:w="72"/><text x="87.2546%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (72 samples, 0.15%)</title><rect x="87.0046%" y="1333" width="0.1512%" height="15" fill="rgb(227,99,14)" fg:x="41429" fg:w="72"/><text x="87.2546%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (71 samples, 0.15%)</title><rect x="87.0067%" y="1317" width="0.1491%" height="15" fill="rgb(229,83,46)" fg:x="41430" fg:w="71"/><text x="87.2567%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (69 samples, 0.14%)</title><rect x="87.0109%" y="1301" width="0.1449%" height="15" fill="rgb(228,25,1)" fg:x="41432" fg:w="69"/><text x="87.2609%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (21 samples, 0.04%)</title><rect x="87.1117%" y="1285" width="0.0441%" height="15" fill="rgb(252,190,15)" fg:x="41480" fg:w="21"/><text x="87.3617%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (21 samples, 0.04%)</title><rect x="87.1117%" y="1269" width="0.0441%" height="15" fill="rgb(213,103,51)" fg:x="41480" fg:w="21"/><text x="87.3617%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="87.1117%" y="1253" width="0.0441%" height="15" fill="rgb(220,38,44)" fg:x="41480" fg:w="21"/><text x="87.3617%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="87.1117%" y="1237" width="0.0441%" height="15" fill="rgb(210,45,26)" fg:x="41480" fg:w="21"/><text x="87.3617%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="87.1453%" y="1221" width="0.0105%" height="15" fill="rgb(205,95,48)" fg:x="41496" fg:w="5"/><text x="87.3953%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="87.1453%" y="1205" width="0.0105%" height="15" fill="rgb(225,179,37)" fg:x="41496" fg:w="5"/><text x="87.3953%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.1453%" y="1189" width="0.0105%" height="15" fill="rgb(230,209,3)" fg:x="41496" fg:w="5"/><text x="87.3953%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="87.1453%" y="1173" width="0.0105%" height="15" fill="rgb(248,12,46)" fg:x="41496" fg:w="5"/><text x="87.3953%" y="1183.50"></text></g><g><title>libsystem_kernel.dylib`swtch_pri (12 samples, 0.03%)</title><rect x="87.1558%" y="1445" width="0.0252%" height="15" fill="rgb(234,18,0)" fg:x="41501" fg:w="12"/><text x="87.4058%" y="1455.50"></text></g><g><title>libsystem_m.dylib`exp (16 samples, 0.03%)</title><rect x="87.1915%" y="1413" width="0.0336%" height="15" fill="rgb(238,197,14)" fg:x="41518" fg:w="16"/><text x="87.4415%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (7 samples, 0.01%)</title><rect x="87.2273%" y="1413" width="0.0147%" height="15" fill="rgb(251,162,48)" fg:x="41535" fg:w="7"/><text x="87.4773%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (7 samples, 0.01%)</title><rect x="87.2273%" y="1397" width="0.0147%" height="15" fill="rgb(237,73,42)" fg:x="41535" fg:w="7"/><text x="87.4773%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (7 samples, 0.01%)</title><rect x="87.2273%" y="1381" width="0.0147%" height="15" fill="rgb(211,108,8)" fg:x="41535" fg:w="7"/><text x="87.4773%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (7 samples, 0.01%)</title><rect x="87.2273%" y="1365" width="0.0147%" height="15" fill="rgb(213,45,22)" fg:x="41535" fg:w="7"/><text x="87.4773%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (7 samples, 0.01%)</title><rect x="87.2273%" y="1349" width="0.0147%" height="15" fill="rgb(252,154,5)" fg:x="41535" fg:w="7"/><text x="87.4773%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="87.2315%" y="1333" width="0.0105%" height="15" fill="rgb(221,79,52)" fg:x="41537" fg:w="5"/><text x="87.4815%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (16 samples, 0.03%)</title><rect x="87.2567%" y="1381" width="0.0336%" height="15" fill="rgb(229,220,36)" fg:x="41549" fg:w="16"/><text x="87.5067%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::Producer::fold_with (6 samples, 0.01%)</title><rect x="87.2903%" y="1381" width="0.0126%" height="15" fill="rgb(211,17,16)" fg:x="41565" fg:w="6"/><text x="87.5403%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (6 samples, 0.01%)</title><rect x="87.2903%" y="1365" width="0.0126%" height="15" fill="rgb(222,55,31)" fg:x="41565" fg:w="6"/><text x="87.5403%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::compare::estimates::stats (6 samples, 0.01%)</title><rect x="87.2903%" y="1349" width="0.0126%" height="15" fill="rgb(221,221,31)" fg:x="41565" fg:w="6"/><text x="87.5403%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="87.2903%" y="1333" width="0.0126%" height="15" fill="rgb(227,168,26)" fg:x="41565" fg:w="6"/><text x="87.5403%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="87.2903%" y="1317" width="0.0126%" height="15" fill="rgb(224,139,9)" fg:x="41565" fg:w="6"/><text x="87.5403%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (17 samples, 0.04%)</title><rect x="87.3092%" y="1349" width="0.0357%" height="15" fill="rgb(254,172,0)" fg:x="41574" fg:w="17"/><text x="87.5592%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (17 samples, 0.04%)</title><rect x="87.3596%" y="1317" width="0.0357%" height="15" fill="rgb(235,203,1)" fg:x="41598" fg:w="17"/><text x="87.6096%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (20 samples, 0.04%)</title><rect x="87.4037%" y="1285" width="0.0420%" height="15" fill="rgb(216,205,24)" fg:x="41619" fg:w="20"/><text x="87.6537%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="87.4541%" y="1253" width="0.0147%" height="15" fill="rgb(233,24,6)" fg:x="41643" fg:w="7"/><text x="87.7041%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::impls::_&lt;impl core::ops::function::Fn&lt;A&gt; for &amp;F&gt;::call (15 samples, 0.03%)</title><rect x="87.4772%" y="1205" width="0.0315%" height="15" fill="rgb(244,110,9)" fg:x="41654" fg:w="15"/><text x="87.7272%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (9 samples, 0.02%)</title><rect x="87.4898%" y="1189" width="0.0189%" height="15" fill="rgb(239,222,42)" fg:x="41660" fg:w="9"/><text x="87.7398%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="87.4688%" y="1237" width="0.0714%" height="15" fill="rgb(218,145,13)" fg:x="41650" fg:w="34"/><text x="87.7188%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (32 samples, 0.07%)</title><rect x="87.4730%" y="1221" width="0.0672%" height="15" fill="rgb(207,69,11)" fg:x="41652" fg:w="32"/><text x="87.7230%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`oorandom::Rand64::rand_range (7 samples, 0.01%)</title><rect x="87.5255%" y="1205" width="0.0147%" height="15" fill="rgb(220,223,22)" fg:x="41677" fg:w="7"/><text x="87.7755%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="87.5402%" y="1237" width="0.0168%" height="15" fill="rgb(245,102,5)" fg:x="41684" fg:w="8"/><text x="87.7902%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="87.5402%" y="1221" width="0.0168%" height="15" fill="rgb(211,148,2)" fg:x="41684" fg:w="8"/><text x="87.7902%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (51 samples, 0.11%)</title><rect x="87.4520%" y="1269" width="0.1071%" height="15" fill="rgb(241,13,44)" fg:x="41642" fg:w="51"/><text x="87.7020%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (43 samples, 0.09%)</title><rect x="87.4688%" y="1253" width="0.0903%" height="15" fill="rgb(219,137,21)" fg:x="41650" fg:w="43"/><text x="87.7188%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="87.5591%" y="1237" width="0.0105%" height="15" fill="rgb(242,206,5)" fg:x="41693" fg:w="5"/><text x="87.8091%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (8 samples, 0.02%)</title><rect x="87.5738%" y="1205" width="0.0168%" height="15" fill="rgb(217,114,22)" fg:x="41700" fg:w="8"/><text x="87.8238%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="87.5738%" y="1221" width="0.0294%" height="15" fill="rgb(253,206,42)" fg:x="41700" fg:w="14"/><text x="87.8238%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="87.5927%" y="1205" width="0.0105%" height="15" fill="rgb(236,102,18)" fg:x="41709" fg:w="5"/><text x="87.8427%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="87.5927%" y="1189" width="0.0105%" height="15" fill="rgb(208,59,49)" fg:x="41709" fg:w="5"/><text x="87.8427%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="87.6074%" y="1189" width="0.0147%" height="15" fill="rgb(215,194,28)" fg:x="41716" fg:w="7"/><text x="87.8574%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (34 samples, 0.07%)</title><rect x="87.5591%" y="1269" width="0.0714%" height="15" fill="rgb(243,207,11)" fg:x="41693" fg:w="34"/><text x="87.8091%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="87.5591%" y="1253" width="0.0714%" height="15" fill="rgb(254,179,35)" fg:x="41693" fg:w="34"/><text x="87.8091%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="87.5717%" y="1237" width="0.0588%" height="15" fill="rgb(235,97,3)" fg:x="41699" fg:w="28"/><text x="87.8217%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="87.6032%" y="1221" width="0.0273%" height="15" fill="rgb(215,155,33)" fg:x="41714" fg:w="13"/><text x="87.8532%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="87.6053%" y="1205" width="0.0252%" height="15" fill="rgb(223,128,12)" fg:x="41715" fg:w="12"/><text x="87.8553%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (112 samples, 0.24%)</title><rect x="87.3974%" y="1301" width="0.2352%" height="15" fill="rgb(208,157,18)" fg:x="41616" fg:w="112"/><text x="87.6474%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (88 samples, 0.18%)</title><rect x="87.4478%" y="1285" width="0.1848%" height="15" fill="rgb(249,70,54)" fg:x="41640" fg:w="88"/><text x="87.6978%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="87.6494%" y="1269" width="0.0315%" height="15" fill="rgb(244,118,24)" fg:x="41736" fg:w="15"/><text x="87.8994%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="87.6872%" y="1237" width="0.0126%" height="15" fill="rgb(211,54,0)" fg:x="41754" fg:w="6"/><text x="87.9372%" y="1247.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="87.7040%" y="1205" width="0.0189%" height="15" fill="rgb(245,137,45)" fg:x="41762" fg:w="9"/><text x="87.9540%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="87.7040%" y="1221" width="0.0273%" height="15" fill="rgb(232,154,31)" fg:x="41762" fg:w="13"/><text x="87.9540%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="87.6872%" y="1253" width="0.0672%" height="15" fill="rgb(253,6,39)" fg:x="41754" fg:w="32"/><text x="87.9372%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="87.7019%" y="1237" width="0.0525%" height="15" fill="rgb(234,183,24)" fg:x="41761" fg:w="25"/><text x="87.9519%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="87.7313%" y="1221" width="0.0231%" height="15" fill="rgb(252,84,40)" fg:x="41775" fg:w="11"/><text x="87.9813%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="87.7313%" y="1205" width="0.0231%" height="15" fill="rgb(224,65,2)" fg:x="41775" fg:w="11"/><text x="87.9813%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="87.7439%" y="1189" width="0.0105%" height="15" fill="rgb(229,38,24)" fg:x="41781" fg:w="5"/><text x="87.9939%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (5 samples, 0.01%)</title><rect x="87.7439%" y="1173" width="0.0105%" height="15" fill="rgb(218,131,50)" fg:x="41781" fg:w="5"/><text x="87.9939%" y="1183.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="87.7649%" y="1221" width="0.0189%" height="15" fill="rgb(233,106,18)" fg:x="41791" fg:w="9"/><text x="88.0149%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="87.7922%" y="1189" width="0.0147%" height="15" fill="rgb(220,216,11)" fg:x="41804" fg:w="7"/><text x="88.0422%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="87.7838%" y="1205" width="0.0315%" height="15" fill="rgb(251,100,45)" fg:x="41800" fg:w="15"/><text x="88.0338%" y="1215.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="87.8237%" y="1173" width="0.0105%" height="15" fill="rgb(235,143,32)" fg:x="41819" fg:w="5"/><text x="88.0737%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="87.8153%" y="1205" width="0.0294%" height="15" fill="rgb(248,124,34)" fg:x="41815" fg:w="14"/><text x="88.0653%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="87.8174%" y="1189" width="0.0273%" height="15" fill="rgb(225,221,4)" fg:x="41816" fg:w="13"/><text x="88.0674%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (44 samples, 0.09%)</title><rect x="87.7544%" y="1253" width="0.0924%" height="15" fill="rgb(242,27,43)" fg:x="41786" fg:w="44"/><text x="88.0044%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (42 samples, 0.09%)</title><rect x="87.7586%" y="1237" width="0.0882%" height="15" fill="rgb(227,54,8)" fg:x="41788" fg:w="42"/><text x="88.0086%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="87.7838%" y="1221" width="0.0630%" height="15" fill="rgb(253,139,49)" fg:x="41800" fg:w="30"/><text x="88.0338%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (107 samples, 0.22%)</title><rect x="87.6326%" y="1301" width="0.2247%" height="15" fill="rgb(231,26,43)" fg:x="41728" fg:w="107"/><text x="87.8826%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (104 samples, 0.22%)</title><rect x="87.6389%" y="1285" width="0.2184%" height="15" fill="rgb(207,121,39)" fg:x="41731" fg:w="104"/><text x="87.8889%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (83 samples, 0.17%)</title><rect x="87.6830%" y="1269" width="0.1743%" height="15" fill="rgb(223,101,35)" fg:x="41752" fg:w="83"/><text x="87.9330%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="87.8468%" y="1253" width="0.0105%" height="15" fill="rgb(232,87,23)" fg:x="41830" fg:w="5"/><text x="88.0968%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="87.8468%" y="1237" width="0.0105%" height="15" fill="rgb(225,180,29)" fg:x="41830" fg:w="5"/><text x="88.0968%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="87.8468%" y="1221" width="0.0105%" height="15" fill="rgb(225,25,17)" fg:x="41830" fg:w="5"/><text x="88.0968%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="87.8468%" y="1205" width="0.0105%" height="15" fill="rgb(223,8,52)" fg:x="41830" fg:w="5"/><text x="88.0968%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (241 samples, 0.51%)</title><rect x="87.3554%" y="1333" width="0.5061%" height="15" fill="rgb(246,42,21)" fg:x="41596" fg:w="241"/><text x="87.6054%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (221 samples, 0.46%)</title><rect x="87.3974%" y="1317" width="0.4641%" height="15" fill="rgb(205,64,43)" fg:x="41616" fg:w="221"/><text x="87.6474%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$exp (5 samples, 0.01%)</title><rect x="87.8615%" y="1317" width="0.0105%" height="15" fill="rgb(221,160,13)" fg:x="41837" fg:w="5"/><text x="88.1115%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (15 samples, 0.03%)</title><rect x="87.8783%" y="1301" width="0.0315%" height="15" fill="rgb(239,58,35)" fg:x="41845" fg:w="15"/><text x="88.1283%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (13 samples, 0.03%)</title><rect x="87.9203%" y="1269" width="0.0273%" height="15" fill="rgb(251,26,40)" fg:x="41865" fg:w="13"/><text x="88.1703%" y="1279.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="87.9518%" y="1237" width="0.0105%" height="15" fill="rgb(247,0,4)" fg:x="41880" fg:w="5"/><text x="88.2018%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="87.9623%" y="1221" width="0.0126%" height="15" fill="rgb(218,130,10)" fg:x="41885" fg:w="6"/><text x="88.2123%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="87.9497%" y="1253" width="0.0420%" height="15" fill="rgb(239,32,7)" fg:x="41879" fg:w="20"/><text x="88.1997%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="87.9623%" y="1237" width="0.0294%" height="15" fill="rgb(210,192,24)" fg:x="41885" fg:w="14"/><text x="88.2123%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="87.9749%" y="1221" width="0.0168%" height="15" fill="rgb(226,212,17)" fg:x="41891" fg:w="8"/><text x="88.2249%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="87.9770%" y="1205" width="0.0147%" height="15" fill="rgb(219,201,28)" fg:x="41892" fg:w="7"/><text x="88.2270%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.0064%" y="1205" width="0.0168%" height="15" fill="rgb(235,207,41)" fg:x="41906" fg:w="8"/><text x="88.2564%" y="1215.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="88.0232%" y="1173" width="0.0189%" height="15" fill="rgb(241,95,54)" fg:x="41914" fg:w="9"/><text x="88.2732%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (66 samples, 0.14%)</title><rect x="87.9161%" y="1285" width="0.1386%" height="15" fill="rgb(248,12,23)" fg:x="41863" fg:w="66"/><text x="88.1661%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (50 samples, 0.11%)</title><rect x="87.9497%" y="1269" width="0.1050%" height="15" fill="rgb(228,173,4)" fg:x="41879" fg:w="50"/><text x="88.1997%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (30 samples, 0.06%)</title><rect x="87.9917%" y="1253" width="0.0630%" height="15" fill="rgb(254,99,5)" fg:x="41899" fg:w="30"/><text x="88.2417%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (28 samples, 0.06%)</title><rect x="87.9959%" y="1237" width="0.0588%" height="15" fill="rgb(212,184,17)" fg:x="41901" fg:w="28"/><text x="88.2459%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (23 samples, 0.05%)</title><rect x="88.0064%" y="1221" width="0.0483%" height="15" fill="rgb(252,174,1)" fg:x="41906" fg:w="23"/><text x="88.2564%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="88.0232%" y="1205" width="0.0315%" height="15" fill="rgb(241,118,51)" fg:x="41914" fg:w="15"/><text x="88.2732%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="88.0232%" y="1189" width="0.0315%" height="15" fill="rgb(227,94,47)" fg:x="41914" fg:w="15"/><text x="88.2732%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (6 samples, 0.01%)</title><rect x="88.0421%" y="1173" width="0.0126%" height="15" fill="rgb(229,104,2)" fg:x="41923" fg:w="6"/><text x="88.2921%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (6 samples, 0.01%)</title><rect x="88.0421%" y="1157" width="0.0126%" height="15" fill="rgb(219,28,31)" fg:x="41923" fg:w="6"/><text x="88.2921%" y="1167.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="88.0610%" y="1253" width="0.0210%" height="15" fill="rgb(233,109,36)" fg:x="41932" fg:w="10"/><text x="88.3110%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (8 samples, 0.02%)</title><rect x="88.0904%" y="1221" width="0.0168%" height="15" fill="rgb(246,88,11)" fg:x="41946" fg:w="8"/><text x="88.3404%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="88.0841%" y="1237" width="0.0420%" height="15" fill="rgb(209,212,17)" fg:x="41943" fg:w="20"/><text x="88.3341%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.1072%" y="1221" width="0.0189%" height="15" fill="rgb(243,59,29)" fg:x="41954" fg:w="9"/><text x="88.3572%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="88.1135%" y="1205" width="0.0126%" height="15" fill="rgb(244,205,48)" fg:x="41957" fg:w="6"/><text x="88.3635%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.1156%" y="1189" width="0.0105%" height="15" fill="rgb(227,30,6)" fg:x="41958" fg:w="5"/><text x="88.3656%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="88.1324%" y="1205" width="0.0105%" height="15" fill="rgb(220,205,48)" fg:x="41966" fg:w="5"/><text x="88.3824%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.1429%" y="1189" width="0.0126%" height="15" fill="rgb(250,94,14)" fg:x="41971" fg:w="6"/><text x="88.3929%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="88.1555%" y="1189" width="0.0147%" height="15" fill="rgb(216,119,42)" fg:x="41977" fg:w="7"/><text x="88.4055%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.1555%" y="1173" width="0.0147%" height="15" fill="rgb(232,155,0)" fg:x="41977" fg:w="7"/><text x="88.4055%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (23 samples, 0.05%)</title><rect x="88.1261%" y="1237" width="0.0483%" height="15" fill="rgb(212,24,32)" fg:x="41963" fg:w="23"/><text x="88.3761%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="88.1303%" y="1221" width="0.0441%" height="15" fill="rgb(216,69,20)" fg:x="41965" fg:w="21"/><text x="88.3803%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="88.1429%" y="1205" width="0.0315%" height="15" fill="rgb(229,73,31)" fg:x="41971" fg:w="15"/><text x="88.3929%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (62 samples, 0.13%)</title><rect x="88.0547%" y="1285" width="0.1302%" height="15" fill="rgb(224,219,20)" fg:x="41929" fg:w="62"/><text x="88.3047%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (62 samples, 0.13%)</title><rect x="88.0547%" y="1269" width="0.1302%" height="15" fill="rgb(215,146,41)" fg:x="41929" fg:w="62"/><text x="88.3047%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (49 samples, 0.10%)</title><rect x="88.0820%" y="1253" width="0.1029%" height="15" fill="rgb(244,71,31)" fg:x="41942" fg:w="49"/><text x="88.3320%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.1744%" y="1237" width="0.0105%" height="15" fill="rgb(224,24,11)" fg:x="41986" fg:w="5"/><text x="88.4244%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.1744%" y="1221" width="0.0105%" height="15" fill="rgb(229,76,15)" fg:x="41986" fg:w="5"/><text x="88.4244%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.1744%" y="1205" width="0.0105%" height="15" fill="rgb(209,93,2)" fg:x="41986" fg:w="5"/><text x="88.4244%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.1891%" y="1157" width="0.0105%" height="15" fill="rgb(216,200,50)" fg:x="41993" fg:w="5"/><text x="88.4391%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.1891%" y="1141" width="0.0105%" height="15" fill="rgb(211,67,34)" fg:x="41993" fg:w="5"/><text x="88.4391%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.2017%" y="1109" width="0.0105%" height="15" fill="rgb(225,87,47)" fg:x="41999" fg:w="5"/><text x="88.4517%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="88.1891%" y="1189" width="0.0315%" height="15" fill="rgb(217,185,16)" fg:x="41993" fg:w="15"/><text x="88.4391%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="88.1891%" y="1173" width="0.0315%" height="15" fill="rgb(205,0,0)" fg:x="41993" fg:w="15"/><text x="88.4391%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="88.1996%" y="1157" width="0.0210%" height="15" fill="rgb(207,116,45)" fg:x="41998" fg:w="10"/><text x="88.4496%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="88.1996%" y="1141" width="0.0210%" height="15" fill="rgb(221,156,26)" fg:x="41998" fg:w="10"/><text x="88.4496%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.2017%" y="1125" width="0.0189%" height="15" fill="rgb(213,140,4)" fg:x="41999" fg:w="9"/><text x="88.4517%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (23 samples, 0.05%)</title><rect x="88.1849%" y="1221" width="0.0483%" height="15" fill="rgb(231,224,15)" fg:x="41991" fg:w="23"/><text x="88.4349%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="88.1891%" y="1205" width="0.0441%" height="15" fill="rgb(244,76,20)" fg:x="41993" fg:w="21"/><text x="88.4391%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="88.2332%" y="1221" width="0.0168%" height="15" fill="rgb(238,117,7)" fg:x="42014" fg:w="8"/><text x="88.4832%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.2332%" y="1205" width="0.0168%" height="15" fill="rgb(235,1,10)" fg:x="42014" fg:w="8"/><text x="88.4832%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.2374%" y="1189" width="0.0126%" height="15" fill="rgb(216,165,6)" fg:x="42016" fg:w="6"/><text x="88.4874%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (188 samples, 0.39%)</title><rect x="87.8615%" y="1333" width="0.3948%" height="15" fill="rgb(246,91,35)" fg:x="41837" fg:w="188"/><text x="88.1115%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (183 samples, 0.38%)</title><rect x="87.8720%" y="1317" width="0.3843%" height="15" fill="rgb(228,96,24)" fg:x="41842" fg:w="183"/><text x="88.1220%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (164 samples, 0.34%)</title><rect x="87.9119%" y="1301" width="0.3444%" height="15" fill="rgb(254,217,53)" fg:x="41861" fg:w="164"/><text x="88.1619%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (34 samples, 0.07%)</title><rect x="88.1849%" y="1285" width="0.0714%" height="15" fill="rgb(209,60,0)" fg:x="41991" fg:w="34"/><text x="88.4349%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (34 samples, 0.07%)</title><rect x="88.1849%" y="1269" width="0.0714%" height="15" fill="rgb(250,93,26)" fg:x="41991" fg:w="34"/><text x="88.4349%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="88.1849%" y="1253" width="0.0714%" height="15" fill="rgb(211,9,40)" fg:x="41991" fg:w="34"/><text x="88.4349%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (34 samples, 0.07%)</title><rect x="88.1849%" y="1237" width="0.0714%" height="15" fill="rgb(242,57,20)" fg:x="41991" fg:w="34"/><text x="88.4349%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.2626%" y="1205" width="0.0105%" height="15" fill="rgb(248,85,48)" fg:x="42028" fg:w="5"/><text x="88.5126%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.2605%" y="1237" width="0.0168%" height="15" fill="rgb(212,117,2)" fg:x="42027" fg:w="8"/><text x="88.5105%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.2626%" y="1221" width="0.0147%" height="15" fill="rgb(243,19,3)" fg:x="42028" fg:w="7"/><text x="88.5126%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="88.2773%" y="1237" width="0.0105%" height="15" fill="rgb(232,217,24)" fg:x="42035" fg:w="5"/><text x="88.5273%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.2773%" y="1221" width="0.0105%" height="15" fill="rgb(224,175,40)" fg:x="42035" fg:w="5"/><text x="88.5273%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="88.2605%" y="1269" width="0.0378%" height="15" fill="rgb(212,162,32)" fg:x="42027" fg:w="18"/><text x="88.5105%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="88.2605%" y="1253" width="0.0378%" height="15" fill="rgb(215,9,4)" fg:x="42027" fg:w="18"/><text x="88.5105%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.2878%" y="1237" width="0.0105%" height="15" fill="rgb(242,42,7)" fg:x="42040" fg:w="5"/><text x="88.5378%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.2878%" y="1221" width="0.0105%" height="15" fill="rgb(242,184,45)" fg:x="42040" fg:w="5"/><text x="88.5378%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.2878%" y="1205" width="0.0105%" height="15" fill="rgb(228,111,51)" fg:x="42040" fg:w="5"/><text x="88.5378%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.2983%" y="1173" width="0.0105%" height="15" fill="rgb(236,147,17)" fg:x="42045" fg:w="5"/><text x="88.5483%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.2983%" y="1157" width="0.0105%" height="15" fill="rgb(210,75,22)" fg:x="42045" fg:w="5"/><text x="88.5483%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="88.2983%" y="1205" width="0.0210%" height="15" fill="rgb(217,159,45)" fg:x="42045" fg:w="10"/><text x="88.5483%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="88.2983%" y="1189" width="0.0210%" height="15" fill="rgb(245,165,53)" fg:x="42045" fg:w="10"/><text x="88.5483%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (485 samples, 1.02%)</title><rect x="87.3071%" y="1365" width="1.0185%" height="15" fill="rgb(251,190,50)" fg:x="41573" fg:w="485"/><text x="87.5571%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (463 samples, 0.97%)</title><rect x="87.3533%" y="1349" width="0.9723%" height="15" fill="rgb(208,203,29)" fg:x="41595" fg:w="463"/><text x="87.6033%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (33 samples, 0.07%)</title><rect x="88.2563%" y="1333" width="0.0693%" height="15" fill="rgb(207,209,35)" fg:x="42025" fg:w="33"/><text x="88.5063%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (32 samples, 0.07%)</title><rect x="88.2584%" y="1317" width="0.0672%" height="15" fill="rgb(230,144,49)" fg:x="42026" fg:w="32"/><text x="88.5084%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="88.2584%" y="1301" width="0.0672%" height="15" fill="rgb(229,31,6)" fg:x="42026" fg:w="32"/><text x="88.5084%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (31 samples, 0.07%)</title><rect x="88.2605%" y="1285" width="0.0651%" height="15" fill="rgb(251,129,24)" fg:x="42027" fg:w="31"/><text x="88.5105%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="88.2983%" y="1269" width="0.0273%" height="15" fill="rgb(235,105,15)" fg:x="42045" fg:w="13"/><text x="88.5483%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="88.2983%" y="1253" width="0.0273%" height="15" fill="rgb(216,52,43)" fg:x="42045" fg:w="13"/><text x="88.5483%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="88.2983%" y="1237" width="0.0273%" height="15" fill="rgb(238,144,41)" fg:x="42045" fg:w="13"/><text x="88.5483%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="88.2983%" y="1221" width="0.0273%" height="15" fill="rgb(243,63,9)" fg:x="42045" fg:w="13"/><text x="88.5483%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (14 samples, 0.03%)</title><rect x="88.3361%" y="1333" width="0.0294%" height="15" fill="rgb(246,208,1)" fg:x="42063" fg:w="14"/><text x="88.5861%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (12 samples, 0.03%)</title><rect x="88.3739%" y="1301" width="0.0252%" height="15" fill="rgb(233,182,18)" fg:x="42081" fg:w="12"/><text x="88.6239%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (10 samples, 0.02%)</title><rect x="88.4054%" y="1269" width="0.0210%" height="15" fill="rgb(242,224,8)" fg:x="42096" fg:w="10"/><text x="88.6554%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.4264%" y="1253" width="0.0168%" height="15" fill="rgb(243,54,37)" fg:x="42106" fg:w="8"/><text x="88.6764%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="88.4012%" y="1285" width="0.0672%" height="15" fill="rgb(233,192,12)" fg:x="42094" fg:w="32"/><text x="88.6512%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="88.4264%" y="1269" width="0.0420%" height="15" fill="rgb(251,192,53)" fg:x="42106" fg:w="20"/><text x="88.6764%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="88.4432%" y="1253" width="0.0252%" height="15" fill="rgb(246,141,26)" fg:x="42114" fg:w="12"/><text x="88.6932%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="88.4432%" y="1237" width="0.0252%" height="15" fill="rgb(239,195,19)" fg:x="42114" fg:w="12"/><text x="88.6932%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.4495%" y="1221" width="0.0189%" height="15" fill="rgb(241,16,39)" fg:x="42117" fg:w="9"/><text x="88.6995%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="88.4579%" y="1205" width="0.0105%" height="15" fill="rgb(223,13,53)" fg:x="42121" fg:w="5"/><text x="88.7079%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.4579%" y="1189" width="0.0105%" height="15" fill="rgb(214,227,0)" fg:x="42121" fg:w="5"/><text x="88.7079%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (8 samples, 0.02%)</title><rect x="88.4768%" y="1253" width="0.0168%" height="15" fill="rgb(228,103,26)" fg:x="42130" fg:w="8"/><text x="88.7268%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="88.4936%" y="1237" width="0.0252%" height="15" fill="rgb(254,177,53)" fg:x="42138" fg:w="12"/><text x="88.7436%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="88.5020%" y="1221" width="0.0168%" height="15" fill="rgb(208,201,34)" fg:x="42142" fg:w="8"/><text x="88.7520%" y="1231.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="88.5188%" y="1205" width="0.0105%" height="15" fill="rgb(212,39,5)" fg:x="42150" fg:w="5"/><text x="88.7688%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="88.5188%" y="1237" width="0.0231%" height="15" fill="rgb(246,117,3)" fg:x="42150" fg:w="11"/><text x="88.7688%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="88.5188%" y="1221" width="0.0231%" height="15" fill="rgb(244,118,39)" fg:x="42150" fg:w="11"/><text x="88.7688%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.5293%" y="1205" width="0.0126%" height="15" fill="rgb(241,64,10)" fg:x="42155" fg:w="6"/><text x="88.7793%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (84 samples, 0.18%)</title><rect x="88.3718%" y="1317" width="0.1764%" height="15" fill="rgb(229,39,44)" fg:x="42080" fg:w="84"/><text x="88.6218%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (70 samples, 0.15%)</title><rect x="88.4012%" y="1301" width="0.1470%" height="15" fill="rgb(230,226,3)" fg:x="42094" fg:w="70"/><text x="88.6512%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (38 samples, 0.08%)</title><rect x="88.4684%" y="1285" width="0.0798%" height="15" fill="rgb(222,13,42)" fg:x="42126" fg:w="38"/><text x="88.7184%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (35 samples, 0.07%)</title><rect x="88.4747%" y="1269" width="0.0735%" height="15" fill="rgb(247,180,54)" fg:x="42129" fg:w="35"/><text x="88.7247%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (26 samples, 0.05%)</title><rect x="88.4936%" y="1253" width="0.0546%" height="15" fill="rgb(205,96,16)" fg:x="42138" fg:w="26"/><text x="88.7436%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (13 samples, 0.03%)</title><rect x="88.5566%" y="1285" width="0.0273%" height="15" fill="rgb(205,100,21)" fg:x="42168" fg:w="13"/><text x="88.8066%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="88.5881%" y="1253" width="0.0126%" height="15" fill="rgb(248,51,4)" fg:x="42183" fg:w="6"/><text x="88.8381%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.6007%" y="1237" width="0.0147%" height="15" fill="rgb(217,197,30)" fg:x="42189" fg:w="7"/><text x="88.8507%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (24 samples, 0.05%)</title><rect x="88.5881%" y="1269" width="0.0504%" height="15" fill="rgb(240,179,40)" fg:x="42183" fg:w="24"/><text x="88.8381%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="88.6007%" y="1253" width="0.0378%" height="15" fill="rgb(212,185,35)" fg:x="42189" fg:w="18"/><text x="88.8507%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="88.6154%" y="1237" width="0.0231%" height="15" fill="rgb(251,222,31)" fg:x="42196" fg:w="11"/><text x="88.8654%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="88.6196%" y="1221" width="0.0189%" height="15" fill="rgb(208,140,36)" fg:x="42198" fg:w="9"/><text x="88.8696%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.6238%" y="1205" width="0.0147%" height="15" fill="rgb(220,148,1)" fg:x="42200" fg:w="7"/><text x="88.8738%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="88.6280%" y="1189" width="0.0105%" height="15" fill="rgb(254,4,28)" fg:x="42202" fg:w="5"/><text x="88.8780%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.6280%" y="1173" width="0.0105%" height="15" fill="rgb(222,185,44)" fg:x="42202" fg:w="5"/><text x="88.8780%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="88.6574%" y="1221" width="0.0126%" height="15" fill="rgb(215,74,39)" fg:x="42216" fg:w="6"/><text x="88.9074%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.6574%" y="1205" width="0.0126%" height="15" fill="rgb(247,86,4)" fg:x="42216" fg:w="6"/><text x="88.9074%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.6595%" y="1189" width="0.0105%" height="15" fill="rgb(231,105,32)" fg:x="42217" fg:w="5"/><text x="88.9095%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (17 samples, 0.04%)</title><rect x="88.6385%" y="1269" width="0.0357%" height="15" fill="rgb(222,65,35)" fg:x="42207" fg:w="17"/><text x="88.8885%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="88.6385%" y="1253" width="0.0357%" height="15" fill="rgb(218,145,35)" fg:x="42207" fg:w="17"/><text x="88.8885%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="88.6490%" y="1237" width="0.0252%" height="15" fill="rgb(208,7,15)" fg:x="42212" fg:w="12"/><text x="88.8990%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="88.6742%" y="1205" width="0.0231%" height="15" fill="rgb(209,83,13)" fg:x="42224" fg:w="11"/><text x="88.9242%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.6784%" y="1189" width="0.0189%" height="15" fill="rgb(218,3,10)" fg:x="42226" fg:w="9"/><text x="88.9284%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="88.6805%" y="1173" width="0.0168%" height="15" fill="rgb(211,219,4)" fg:x="42227" fg:w="8"/><text x="88.9305%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="88.6805%" y="1157" width="0.0168%" height="15" fill="rgb(228,194,12)" fg:x="42227" fg:w="8"/><text x="88.9305%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.6805%" y="1141" width="0.0168%" height="15" fill="rgb(210,175,7)" fg:x="42227" fg:w="8"/><text x="88.9305%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.6826%" y="1125" width="0.0147%" height="15" fill="rgb(243,132,6)" fg:x="42228" fg:w="7"/><text x="88.9326%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (72 samples, 0.15%)</title><rect x="88.5482%" y="1317" width="0.1512%" height="15" fill="rgb(207,72,18)" fg:x="42164" fg:w="72"/><text x="88.7982%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (69 samples, 0.14%)</title><rect x="88.5545%" y="1301" width="0.1449%" height="15" fill="rgb(236,1,18)" fg:x="42167" fg:w="69"/><text x="88.8045%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (55 samples, 0.12%)</title><rect x="88.5839%" y="1285" width="0.1155%" height="15" fill="rgb(227,0,18)" fg:x="42181" fg:w="55"/><text x="88.8339%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="88.6742%" y="1269" width="0.0252%" height="15" fill="rgb(247,37,5)" fg:x="42224" fg:w="12"/><text x="88.9242%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="88.6742%" y="1253" width="0.0252%" height="15" fill="rgb(237,179,24)" fg:x="42224" fg:w="12"/><text x="88.9242%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="88.6742%" y="1237" width="0.0252%" height="15" fill="rgb(226,53,20)" fg:x="42224" fg:w="12"/><text x="88.9242%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="88.6742%" y="1221" width="0.0252%" height="15" fill="rgb(247,75,7)" fg:x="42224" fg:w="12"/><text x="88.9242%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.7036%" y="1189" width="0.0168%" height="15" fill="rgb(233,96,12)" fg:x="42238" fg:w="8"/><text x="88.9536%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7057%" y="1173" width="0.0147%" height="15" fill="rgb(224,125,0)" fg:x="42239" fg:w="7"/><text x="88.9557%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="88.7099%" y="1157" width="0.0105%" height="15" fill="rgb(224,92,25)" fg:x="42241" fg:w="5"/><text x="88.9599%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7099%" y="1141" width="0.0105%" height="15" fill="rgb(224,42,24)" fg:x="42241" fg:w="5"/><text x="88.9599%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="88.7036%" y="1221" width="0.0210%" height="15" fill="rgb(234,132,49)" fg:x="42238" fg:w="10"/><text x="88.9536%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="88.7036%" y="1205" width="0.0210%" height="15" fill="rgb(248,100,35)" fg:x="42238" fg:w="10"/><text x="88.9536%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="88.7246%" y="1221" width="0.0210%" height="15" fill="rgb(239,94,40)" fg:x="42248" fg:w="10"/><text x="88.9746%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="88.7246%" y="1205" width="0.0210%" height="15" fill="rgb(235,139,28)" fg:x="42248" fg:w="10"/><text x="88.9746%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.7267%" y="1189" width="0.0189%" height="15" fill="rgb(217,144,7)" fg:x="42249" fg:w="9"/><text x="88.9767%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.7351%" y="1173" width="0.0105%" height="15" fill="rgb(227,55,4)" fg:x="42253" fg:w="5"/><text x="88.9851%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.7351%" y="1157" width="0.0105%" height="15" fill="rgb(252,82,54)" fg:x="42253" fg:w="5"/><text x="88.9851%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7351%" y="1141" width="0.0105%" height="15" fill="rgb(245,172,4)" fg:x="42253" fg:w="5"/><text x="88.9851%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.7351%" y="1125" width="0.0105%" height="15" fill="rgb(207,26,27)" fg:x="42253" fg:w="5"/><text x="88.9851%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (30 samples, 0.06%)</title><rect x="88.7015%" y="1253" width="0.0630%" height="15" fill="rgb(252,98,18)" fg:x="42237" fg:w="30"/><text x="88.9515%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="88.7015%" y="1237" width="0.0630%" height="15" fill="rgb(244,8,26)" fg:x="42237" fg:w="30"/><text x="88.9515%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="88.7456%" y="1221" width="0.0189%" height="15" fill="rgb(237,173,45)" fg:x="42258" fg:w="9"/><text x="88.9956%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="88.7456%" y="1205" width="0.0189%" height="15" fill="rgb(208,213,49)" fg:x="42258" fg:w="9"/><text x="88.9956%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="88.7456%" y="1189" width="0.0189%" height="15" fill="rgb(212,122,37)" fg:x="42258" fg:w="9"/><text x="88.9956%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.7456%" y="1173" width="0.0189%" height="15" fill="rgb(213,80,17)" fg:x="42258" fg:w="9"/><text x="88.9956%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="88.7498%" y="1157" width="0.0147%" height="15" fill="rgb(206,210,43)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7498%" y="1141" width="0.0147%" height="15" fill="rgb(229,214,3)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7498%" y="1125" width="0.0147%" height="15" fill="rgb(235,213,29)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="88.7498%" y="1109" width="0.0147%" height="15" fill="rgb(248,135,26)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7498%" y="1093" width="0.0147%" height="15" fill="rgb(242,188,12)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7498%" y="1077" width="0.0147%" height="15" fill="rgb(245,38,12)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="88.7498%" y="1061" width="0.0147%" height="15" fill="rgb(218,42,13)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="88.7498%" y="1045" width="0.0147%" height="15" fill="rgb(238,132,49)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7498%" y="1029" width="0.0147%" height="15" fill="rgb(209,196,19)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7498%" y="1013" width="0.0147%" height="15" fill="rgb(244,131,22)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7498%" y="997" width="0.0147%" height="15" fill="rgb(223,18,34)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7498%" y="981" width="0.0147%" height="15" fill="rgb(252,124,54)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7498%" y="965" width="0.0147%" height="15" fill="rgb(229,106,42)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7498%" y="949" width="0.0147%" height="15" fill="rgb(221,129,1)" fg:x="42260" fg:w="7"/><text x="88.9998%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7729%" y="1189" width="0.0105%" height="15" fill="rgb(229,74,15)" fg:x="42271" fg:w="5"/><text x="89.0229%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7834%" y="1125" width="0.0105%" height="15" fill="rgb(210,206,50)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.7834%" y="1109" width="0.0105%" height="15" fill="rgb(251,114,31)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7834%" y="1093" width="0.0105%" height="15" fill="rgb(215,225,28)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.7834%" y="1077" width="0.0105%" height="15" fill="rgb(237,109,14)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.7834%" y="1061" width="0.0105%" height="15" fill="rgb(230,13,37)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.7834%" y="1045" width="0.0105%" height="15" fill="rgb(231,40,28)" fg:x="42276" fg:w="5"/><text x="89.0334%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (231 samples, 0.49%)</title><rect x="88.3256%" y="1365" width="0.4851%" height="15" fill="rgb(231,202,18)" fg:x="42058" fg:w="231"/><text x="88.5756%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (227 samples, 0.48%)</title><rect x="88.3340%" y="1349" width="0.4767%" height="15" fill="rgb(225,33,18)" fg:x="42062" fg:w="227"/><text x="88.5840%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (211 samples, 0.44%)</title><rect x="88.3676%" y="1333" width="0.4431%" height="15" fill="rgb(223,64,47)" fg:x="42078" fg:w="211"/><text x="88.6176%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (53 samples, 0.11%)</title><rect x="88.6994%" y="1317" width="0.1113%" height="15" fill="rgb(234,114,13)" fg:x="42236" fg:w="53"/><text x="88.9494%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (53 samples, 0.11%)</title><rect x="88.6994%" y="1301" width="0.1113%" height="15" fill="rgb(248,56,40)" fg:x="42236" fg:w="53"/><text x="88.9494%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (52 samples, 0.11%)</title><rect x="88.7015%" y="1285" width="0.1092%" height="15" fill="rgb(221,194,21)" fg:x="42237" fg:w="52"/><text x="88.9515%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (52 samples, 0.11%)</title><rect x="88.7015%" y="1269" width="0.1092%" height="15" fill="rgb(242,108,46)" fg:x="42237" fg:w="52"/><text x="88.9515%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (18 samples, 0.04%)</title><rect x="88.7729%" y="1253" width="0.0378%" height="15" fill="rgb(220,106,10)" fg:x="42271" fg:w="18"/><text x="89.0229%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (18 samples, 0.04%)</title><rect x="88.7729%" y="1237" width="0.0378%" height="15" fill="rgb(211,88,4)" fg:x="42271" fg:w="18"/><text x="89.0229%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="88.7729%" y="1221" width="0.0378%" height="15" fill="rgb(214,95,34)" fg:x="42271" fg:w="18"/><text x="89.0229%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="88.7729%" y="1205" width="0.0378%" height="15" fill="rgb(250,160,33)" fg:x="42271" fg:w="18"/><text x="89.0229%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="88.7834%" y="1189" width="0.0273%" height="15" fill="rgb(225,29,10)" fg:x="42276" fg:w="13"/><text x="89.0334%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="88.7834%" y="1173" width="0.0273%" height="15" fill="rgb(224,28,30)" fg:x="42276" fg:w="13"/><text x="89.0334%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="88.7834%" y="1157" width="0.0273%" height="15" fill="rgb(231,77,4)" fg:x="42276" fg:w="13"/><text x="89.0334%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="88.7834%" y="1141" width="0.0273%" height="15" fill="rgb(209,63,21)" fg:x="42276" fg:w="13"/><text x="89.0334%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="88.7939%" y="1125" width="0.0168%" height="15" fill="rgb(226,22,11)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="88.7939%" y="1109" width="0.0168%" height="15" fill="rgb(216,82,30)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.7939%" y="1093" width="0.0168%" height="15" fill="rgb(246,227,38)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="88.7939%" y="1077" width="0.0168%" height="15" fill="rgb(251,203,53)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="88.7939%" y="1061" width="0.0168%" height="15" fill="rgb(254,101,1)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="88.7939%" y="1045" width="0.0168%" height="15" fill="rgb(241,180,5)" fg:x="42281" fg:w="8"/><text x="89.0439%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="88.7960%" y="1029" width="0.0147%" height="15" fill="rgb(218,168,4)" fg:x="42282" fg:w="7"/><text x="89.0460%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="88.7960%" y="1013" width="0.0147%" height="15" fill="rgb(224,223,32)" fg:x="42282" fg:w="7"/><text x="89.0460%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.7960%" y="997" width="0.0147%" height="15" fill="rgb(236,106,22)" fg:x="42282" fg:w="7"/><text x="89.0460%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.7960%" y="981" width="0.0147%" height="15" fill="rgb(206,121,5)" fg:x="42282" fg:w="7"/><text x="89.0460%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="88.7981%" y="965" width="0.0126%" height="15" fill="rgb(233,87,28)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="88.7981%" y="949" width="0.0126%" height="15" fill="rgb(236,137,17)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.7981%" y="933" width="0.0126%" height="15" fill="rgb(209,183,38)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.7981%" y="917" width="0.0126%" height="15" fill="rgb(206,162,44)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.7981%" y="901" width="0.0126%" height="15" fill="rgb(237,70,39)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.7981%" y="885" width="0.0126%" height="15" fill="rgb(212,176,5)" fg:x="42283" fg:w="6"/><text x="89.0481%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.8002%" y="869" width="0.0105%" height="15" fill="rgb(232,95,16)" fg:x="42284" fg:w="5"/><text x="89.0502%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.8002%" y="853" width="0.0105%" height="15" fill="rgb(219,115,35)" fg:x="42284" fg:w="5"/><text x="89.0502%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.8002%" y="837" width="0.0105%" height="15" fill="rgb(251,67,27)" fg:x="42284" fg:w="5"/><text x="89.0502%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.8002%" y="821" width="0.0105%" height="15" fill="rgb(222,95,40)" fg:x="42284" fg:w="5"/><text x="89.0502%" y="831.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="88.8170%" y="1317" width="0.0126%" height="15" fill="rgb(250,35,16)" fg:x="42292" fg:w="6"/><text x="89.0670%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.8569%" y="1205" width="0.0147%" height="15" fill="rgb(224,86,44)" fg:x="42311" fg:w="7"/><text x="89.1069%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.8569%" y="1189" width="0.0147%" height="15" fill="rgb(237,53,53)" fg:x="42311" fg:w="7"/><text x="89.1069%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="88.8485%" y="1237" width="0.0420%" height="15" fill="rgb(208,171,33)" fg:x="42307" fg:w="20"/><text x="89.0985%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="88.8548%" y="1221" width="0.0357%" height="15" fill="rgb(222,64,27)" fg:x="42310" fg:w="17"/><text x="89.1048%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="88.8716%" y="1205" width="0.0189%" height="15" fill="rgb(221,121,35)" fg:x="42318" fg:w="9"/><text x="89.1216%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="88.8716%" y="1189" width="0.0189%" height="15" fill="rgb(228,137,42)" fg:x="42318" fg:w="9"/><text x="89.1216%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.8800%" y="1173" width="0.0105%" height="15" fill="rgb(227,54,21)" fg:x="42322" fg:w="5"/><text x="89.1300%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="88.8968%" y="1189" width="0.0147%" height="15" fill="rgb(240,168,33)" fg:x="42330" fg:w="7"/><text x="89.1468%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9010%" y="1173" width="0.0105%" height="15" fill="rgb(243,159,6)" fg:x="42332" fg:w="5"/><text x="89.1510%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="88.9115%" y="1189" width="0.0126%" height="15" fill="rgb(205,211,41)" fg:x="42337" fg:w="6"/><text x="89.1615%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9136%" y="1173" width="0.0105%" height="15" fill="rgb(253,30,1)" fg:x="42338" fg:w="5"/><text x="89.1636%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9136%" y="1157" width="0.0105%" height="15" fill="rgb(226,80,18)" fg:x="42338" fg:w="5"/><text x="89.1636%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (17 samples, 0.04%)</title><rect x="88.8905%" y="1237" width="0.0357%" height="15" fill="rgb(253,156,46)" fg:x="42327" fg:w="17"/><text x="89.1405%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="88.8905%" y="1221" width="0.0357%" height="15" fill="rgb(248,87,27)" fg:x="42327" fg:w="17"/><text x="89.1405%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="88.8947%" y="1205" width="0.0315%" height="15" fill="rgb(227,122,2)" fg:x="42329" fg:w="15"/><text x="89.1447%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (52 samples, 0.11%)</title><rect x="88.8401%" y="1269" width="0.1092%" height="15" fill="rgb(229,94,39)" fg:x="42303" fg:w="52"/><text x="89.0901%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (48 samples, 0.10%)</title><rect x="88.8485%" y="1253" width="0.1008%" height="15" fill="rgb(225,173,31)" fg:x="42307" fg:w="48"/><text x="89.0985%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="88.9262%" y="1237" width="0.0231%" height="15" fill="rgb(239,176,30)" fg:x="42344" fg:w="11"/><text x="89.1762%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="88.9262%" y="1221" width="0.0231%" height="15" fill="rgb(212,104,21)" fg:x="42344" fg:w="11"/><text x="89.1762%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="88.9262%" y="1205" width="0.0231%" height="15" fill="rgb(240,209,40)" fg:x="42344" fg:w="11"/><text x="89.1762%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.9346%" y="1189" width="0.0147%" height="15" fill="rgb(234,195,5)" fg:x="42348" fg:w="7"/><text x="89.1846%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="88.9367%" y="1173" width="0.0126%" height="15" fill="rgb(238,213,1)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="88.9367%" y="1157" width="0.0126%" height="15" fill="rgb(235,182,54)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.9367%" y="1141" width="0.0126%" height="15" fill="rgb(229,50,46)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.9367%" y="1125" width="0.0126%" height="15" fill="rgb(219,145,13)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="88.9367%" y="1109" width="0.0126%" height="15" fill="rgb(220,226,10)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="88.9367%" y="1093" width="0.0126%" height="15" fill="rgb(248,47,30)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="88.9367%" y="1077" width="0.0126%" height="15" fill="rgb(231,209,44)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="88.9367%" y="1061" width="0.0126%" height="15" fill="rgb(209,80,30)" fg:x="42349" fg:w="6"/><text x="89.1867%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.9388%" y="1045" width="0.0105%" height="15" fill="rgb(232,9,14)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.9388%" y="1029" width="0.0105%" height="15" fill="rgb(243,91,43)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="1013" width="0.0105%" height="15" fill="rgb(231,90,52)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="997" width="0.0105%" height="15" fill="rgb(253,192,44)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.9388%" y="981" width="0.0105%" height="15" fill="rgb(241,66,31)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.9388%" y="965" width="0.0105%" height="15" fill="rgb(235,81,37)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="949" width="0.0105%" height="15" fill="rgb(223,221,9)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="933" width="0.0105%" height="15" fill="rgb(242,180,7)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="917" width="0.0105%" height="15" fill="rgb(243,78,19)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="901" width="0.0105%" height="15" fill="rgb(233,23,17)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="885" width="0.0105%" height="15" fill="rgb(252,122,45)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="869" width="0.0105%" height="15" fill="rgb(247,108,20)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.9388%" y="853" width="0.0105%" height="15" fill="rgb(235,84,21)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.9388%" y="837" width="0.0105%" height="15" fill="rgb(247,129,10)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="821" width="0.0105%" height="15" fill="rgb(208,173,14)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="805" width="0.0105%" height="15" fill="rgb(236,31,38)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="88.9388%" y="789" width="0.0105%" height="15" fill="rgb(232,65,17)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="88.9388%" y="773" width="0.0105%" height="15" fill="rgb(224,45,49)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="757" width="0.0105%" height="15" fill="rgb(225,2,53)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="741" width="0.0105%" height="15" fill="rgb(248,210,53)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="88.9388%" y="725" width="0.0105%" height="15" fill="rgb(211,1,30)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="88.9388%" y="709" width="0.0105%" height="15" fill="rgb(224,96,15)" fg:x="42350" fg:w="5"/><text x="89.1888%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="88.9535%" y="1221" width="0.0273%" height="15" fill="rgb(252,45,11)" fg:x="42357" fg:w="13"/><text x="89.2035%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="88.9619%" y="1205" width="0.0189%" height="15" fill="rgb(220,125,38)" fg:x="42361" fg:w="9"/><text x="89.2119%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="88.9808%" y="1221" width="0.0189%" height="15" fill="rgb(243,161,33)" fg:x="42370" fg:w="9"/><text x="89.2308%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="88.9808%" y="1205" width="0.0189%" height="15" fill="rgb(248,197,34)" fg:x="42370" fg:w="9"/><text x="89.2308%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="88.9850%" y="1189" width="0.0147%" height="15" fill="rgb(228,165,23)" fg:x="42372" fg:w="7"/><text x="89.2350%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (28 samples, 0.06%)</title><rect x="88.9493%" y="1269" width="0.0588%" height="15" fill="rgb(236,94,38)" fg:x="42355" fg:w="28"/><text x="89.1993%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (28 samples, 0.06%)</title><rect x="88.9493%" y="1253" width="0.0588%" height="15" fill="rgb(220,13,23)" fg:x="42355" fg:w="28"/><text x="89.1993%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (27 samples, 0.06%)</title><rect x="88.9514%" y="1237" width="0.0567%" height="15" fill="rgb(234,26,39)" fg:x="42356" fg:w="27"/><text x="89.2014%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (90 samples, 0.19%)</title><rect x="88.8317%" y="1301" width="0.1890%" height="15" fill="rgb(205,117,44)" fg:x="42299" fg:w="90"/><text x="89.0817%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (86 samples, 0.18%)</title><rect x="88.8401%" y="1285" width="0.1806%" height="15" fill="rgb(250,42,2)" fg:x="42303" fg:w="86"/><text x="89.0901%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.0081%" y="1269" width="0.0126%" height="15" fill="rgb(223,83,14)" fg:x="42383" fg:w="6"/><text x="89.2581%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.0081%" y="1253" width="0.0126%" height="15" fill="rgb(241,147,50)" fg:x="42383" fg:w="6"/><text x="89.2581%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.0081%" y="1237" width="0.0126%" height="15" fill="rgb(218,90,6)" fg:x="42383" fg:w="6"/><text x="89.2581%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.0081%" y="1221" width="0.0126%" height="15" fill="rgb(210,191,5)" fg:x="42383" fg:w="6"/><text x="89.2581%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.0249%" y="1253" width="0.0168%" height="15" fill="rgb(225,139,19)" fg:x="42391" fg:w="8"/><text x="89.2749%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.0270%" y="1237" width="0.0147%" height="15" fill="rgb(210,1,33)" fg:x="42392" fg:w="7"/><text x="89.2770%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.0480%" y="997" width="0.0126%" height="15" fill="rgb(213,50,3)" fg:x="42402" fg:w="6"/><text x="89.2980%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.0480%" y="981" width="0.0126%" height="15" fill="rgb(234,227,4)" fg:x="42402" fg:w="6"/><text x="89.2980%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="89.0417%" y="1253" width="0.0336%" height="15" fill="rgb(246,63,5)" fg:x="42399" fg:w="16"/><text x="89.2917%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="89.0438%" y="1237" width="0.0315%" height="15" fill="rgb(245,136,27)" fg:x="42400" fg:w="15"/><text x="89.2938%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="89.0438%" y="1221" width="0.0315%" height="15" fill="rgb(247,199,27)" fg:x="42400" fg:w="15"/><text x="89.2938%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="89.0480%" y="1205" width="0.0273%" height="15" fill="rgb(252,158,49)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.0480%" y="1189" width="0.0273%" height="15" fill="rgb(254,73,1)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.0480%" y="1173" width="0.0273%" height="15" fill="rgb(248,93,19)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="89.0480%" y="1157" width="0.0273%" height="15" fill="rgb(206,67,5)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.0480%" y="1141" width="0.0273%" height="15" fill="rgb(209,210,4)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.0480%" y="1125" width="0.0273%" height="15" fill="rgb(214,185,36)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="89.0480%" y="1109" width="0.0273%" height="15" fill="rgb(233,191,26)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.0480%" y="1093" width="0.0273%" height="15" fill="rgb(248,94,17)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.0480%" y="1077" width="0.0273%" height="15" fill="rgb(250,64,4)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="89.0480%" y="1061" width="0.0273%" height="15" fill="rgb(218,41,53)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="89.0480%" y="1045" width="0.0273%" height="15" fill="rgb(251,176,28)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.0480%" y="1029" width="0.0273%" height="15" fill="rgb(247,22,9)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.0480%" y="1013" width="0.0273%" height="15" fill="rgb(218,201,14)" fg:x="42402" fg:w="13"/><text x="89.2980%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="89.0606%" y="997" width="0.0147%" height="15" fill="rgb(218,94,10)" fg:x="42408" fg:w="7"/><text x="89.3106%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="89.0606%" y="981" width="0.0147%" height="15" fill="rgb(222,183,52)" fg:x="42408" fg:w="7"/><text x="89.3106%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.0606%" y="965" width="0.0147%" height="15" fill="rgb(242,140,25)" fg:x="42408" fg:w="7"/><text x="89.3106%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.0606%" y="949" width="0.0147%" height="15" fill="rgb(235,197,38)" fg:x="42408" fg:w="7"/><text x="89.3106%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.0627%" y="933" width="0.0126%" height="15" fill="rgb(237,136,15)" fg:x="42409" fg:w="6"/><text x="89.3127%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.0627%" y="917" width="0.0126%" height="15" fill="rgb(223,44,49)" fg:x="42409" fg:w="6"/><text x="89.3127%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.0627%" y="901" width="0.0126%" height="15" fill="rgb(227,71,15)" fg:x="42409" fg:w="6"/><text x="89.3127%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.0627%" y="885" width="0.0126%" height="15" fill="rgb(225,153,20)" fg:x="42409" fg:w="6"/><text x="89.3127%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (32 samples, 0.07%)</title><rect x="89.0207%" y="1301" width="0.0672%" height="15" fill="rgb(210,190,26)" fg:x="42389" fg:w="32"/><text x="89.2707%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (31 samples, 0.07%)</title><rect x="89.0228%" y="1285" width="0.0651%" height="15" fill="rgb(223,147,5)" fg:x="42390" fg:w="31"/><text x="89.2728%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="89.0249%" y="1269" width="0.0630%" height="15" fill="rgb(207,14,23)" fg:x="42391" fg:w="30"/><text x="89.2749%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.0753%" y="1253" width="0.0126%" height="15" fill="rgb(211,195,53)" fg:x="42415" fg:w="6"/><text x="89.3253%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.0753%" y="1237" width="0.0126%" height="15" fill="rgb(237,75,46)" fg:x="42415" fg:w="6"/><text x="89.3253%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.0753%" y="1221" width="0.0126%" height="15" fill="rgb(254,55,14)" fg:x="42415" fg:w="6"/><text x="89.3253%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.0774%" y="1205" width="0.0105%" height="15" fill="rgb(230,185,30)" fg:x="42416" fg:w="5"/><text x="89.3274%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.1026%" y="1173" width="0.0105%" height="15" fill="rgb(220,14,11)" fg:x="42428" fg:w="5"/><text x="89.3526%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="89.0963%" y="1205" width="0.0315%" height="15" fill="rgb(215,169,44)" fg:x="42425" fg:w="15"/><text x="89.3463%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="89.1026%" y="1189" width="0.0252%" height="15" fill="rgb(253,203,20)" fg:x="42428" fg:w="12"/><text x="89.3526%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="89.1131%" y="1173" width="0.0147%" height="15" fill="rgb(229,225,17)" fg:x="42433" fg:w="7"/><text x="89.3631%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.1131%" y="1157" width="0.0147%" height="15" fill="rgb(236,76,26)" fg:x="42433" fg:w="7"/><text x="89.3631%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.1152%" y="1141" width="0.0126%" height="15" fill="rgb(234,15,30)" fg:x="42434" fg:w="6"/><text x="89.3652%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.1278%" y="1157" width="0.0105%" height="15" fill="rgb(211,113,48)" fg:x="42440" fg:w="5"/><text x="89.3778%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.1278%" y="1141" width="0.0105%" height="15" fill="rgb(221,31,36)" fg:x="42440" fg:w="5"/><text x="89.3778%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (26 samples, 0.05%)</title><rect x="89.0942%" y="1237" width="0.0546%" height="15" fill="rgb(215,118,52)" fg:x="42424" fg:w="26"/><text x="89.3442%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="89.0963%" y="1221" width="0.0525%" height="15" fill="rgb(241,151,27)" fg:x="42425" fg:w="25"/><text x="89.3463%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="89.1278%" y="1205" width="0.0210%" height="15" fill="rgb(253,51,3)" fg:x="42440" fg:w="10"/><text x="89.3778%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="89.1278%" y="1189" width="0.0210%" height="15" fill="rgb(216,201,24)" fg:x="42440" fg:w="10"/><text x="89.3778%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="89.1278%" y="1173" width="0.0210%" height="15" fill="rgb(231,107,4)" fg:x="42440" fg:w="10"/><text x="89.3778%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="89.1572%" y="1173" width="0.0210%" height="15" fill="rgb(243,97,54)" fg:x="42454" fg:w="10"/><text x="89.4072%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.1593%" y="1157" width="0.0189%" height="15" fill="rgb(221,32,51)" fg:x="42455" fg:w="9"/><text x="89.4093%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.1593%" y="1141" width="0.0189%" height="15" fill="rgb(218,171,35)" fg:x="42455" fg:w="9"/><text x="89.4093%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.1593%" y="1125" width="0.0189%" height="15" fill="rgb(214,20,53)" fg:x="42455" fg:w="9"/><text x="89.4093%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.1593%" y="1109" width="0.0189%" height="15" fill="rgb(239,9,52)" fg:x="42455" fg:w="9"/><text x="89.4093%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="89.1614%" y="1093" width="0.0168%" height="15" fill="rgb(215,114,45)" fg:x="42456" fg:w="8"/><text x="89.4114%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="89.1635%" y="1077" width="0.0147%" height="15" fill="rgb(208,118,9)" fg:x="42457" fg:w="7"/><text x="89.4135%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.1635%" y="1061" width="0.0147%" height="15" fill="rgb(235,7,39)" fg:x="42457" fg:w="7"/><text x="89.4135%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.1635%" y="1045" width="0.0147%" height="15" fill="rgb(243,225,15)" fg:x="42457" fg:w="7"/><text x="89.4135%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.1656%" y="1029" width="0.0126%" height="15" fill="rgb(225,216,18)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.1656%" y="1013" width="0.0126%" height="15" fill="rgb(233,36,38)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.1656%" y="997" width="0.0126%" height="15" fill="rgb(239,88,23)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.1656%" y="981" width="0.0126%" height="15" fill="rgb(219,181,35)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.1656%" y="965" width="0.0126%" height="15" fill="rgb(215,18,46)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.1656%" y="949" width="0.0126%" height="15" fill="rgb(241,38,11)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.1656%" y="933" width="0.0126%" height="15" fill="rgb(248,169,45)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.1656%" y="917" width="0.0126%" height="15" fill="rgb(239,50,49)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.1656%" y="901" width="0.0126%" height="15" fill="rgb(231,96,31)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.1656%" y="885" width="0.0126%" height="15" fill="rgb(224,193,37)" fg:x="42458" fg:w="6"/><text x="89.4156%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="89.1677%" y="869" width="0.0105%" height="15" fill="rgb(227,153,50)" fg:x="42459" fg:w="5"/><text x="89.4177%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.1677%" y="853" width="0.0105%" height="15" fill="rgb(249,228,3)" fg:x="42459" fg:w="5"/><text x="89.4177%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.1677%" y="837" width="0.0105%" height="15" fill="rgb(219,164,43)" fg:x="42459" fg:w="5"/><text x="89.4177%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (922 samples, 1.94%)</title><rect x="87.2483%" y="1397" width="1.9363%" height="15" fill="rgb(216,45,41)" fg:x="41545" fg:w="922"/><text x="87.4983%" y="1407.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (896 samples, 1.88%)</title><rect x="87.3029%" y="1381" width="1.8817%" height="15" fill="rgb(210,226,51)" fg:x="41571" fg:w="896"/><text x="87.5529%" y="1391.50">s..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (178 samples, 0.37%)</title><rect x="88.8107%" y="1365" width="0.3738%" height="15" fill="rgb(209,117,49)" fg:x="42289" fg:w="178"/><text x="89.0607%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (176 samples, 0.37%)</title><rect x="88.8149%" y="1349" width="0.3696%" height="15" fill="rgb(206,196,24)" fg:x="42291" fg:w="176"/><text x="89.0649%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (176 samples, 0.37%)</title><rect x="88.8149%" y="1333" width="0.3696%" height="15" fill="rgb(253,218,3)" fg:x="42291" fg:w="176"/><text x="89.0649%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (169 samples, 0.35%)</title><rect x="88.8296%" y="1317" width="0.3549%" height="15" fill="rgb(252,166,2)" fg:x="42298" fg:w="169"/><text x="89.0796%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (46 samples, 0.10%)</title><rect x="89.0879%" y="1301" width="0.0966%" height="15" fill="rgb(236,218,26)" fg:x="42421" fg:w="46"/><text x="89.3379%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (46 samples, 0.10%)</title><rect x="89.0879%" y="1285" width="0.0966%" height="15" fill="rgb(254,84,19)" fg:x="42421" fg:w="46"/><text x="89.3379%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (45 samples, 0.09%)</title><rect x="89.0900%" y="1269" width="0.0945%" height="15" fill="rgb(219,137,29)" fg:x="42422" fg:w="45"/><text x="89.3400%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (43 samples, 0.09%)</title><rect x="89.0942%" y="1253" width="0.0903%" height="15" fill="rgb(227,47,52)" fg:x="42424" fg:w="43"/><text x="89.3442%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="89.1551%" y="1237" width="0.0294%" height="15" fill="rgb(229,167,24)" fg:x="42453" fg:w="14"/><text x="89.4051%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="89.1551%" y="1221" width="0.0294%" height="15" fill="rgb(233,164,1)" fg:x="42453" fg:w="14"/><text x="89.4051%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="89.1551%" y="1205" width="0.0294%" height="15" fill="rgb(218,88,48)" fg:x="42453" fg:w="14"/><text x="89.4051%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.1572%" y="1189" width="0.0273%" height="15" fill="rgb(226,214,24)" fg:x="42454" fg:w="13"/><text x="89.4072%" y="1199.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="89.1971%" y="1365" width="0.0147%" height="15" fill="rgb(233,29,12)" fg:x="42473" fg:w="7"/><text x="89.4471%" y="1375.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="89.2349%" y="1333" width="0.0105%" height="15" fill="rgb(219,120,34)" fg:x="42491" fg:w="5"/><text x="89.4849%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="89.2559%" y="1301" width="0.0105%" height="15" fill="rgb(226,78,44)" fg:x="42501" fg:w="5"/><text x="89.5059%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.2706%" y="1285" width="0.0147%" height="15" fill="rgb(240,15,48)" fg:x="42508" fg:w="7"/><text x="89.5206%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.3021%" y="1077" width="0.0105%" height="15" fill="rgb(253,176,7)" fg:x="42523" fg:w="5"/><text x="89.5521%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.3021%" y="1061" width="0.0105%" height="15" fill="rgb(206,166,28)" fg:x="42523" fg:w="5"/><text x="89.5521%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.3021%" y="1109" width="0.0126%" height="15" fill="rgb(241,53,51)" fg:x="42523" fg:w="6"/><text x="89.5521%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.3021%" y="1093" width="0.0126%" height="15" fill="rgb(249,112,30)" fg:x="42523" fg:w="6"/><text x="89.5521%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="89.2538%" y="1317" width="0.0714%" height="15" fill="rgb(217,85,30)" fg:x="42500" fg:w="34"/><text x="89.5038%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="89.2664%" y="1301" width="0.0588%" height="15" fill="rgb(233,49,7)" fg:x="42506" fg:w="28"/><text x="89.5164%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (19 samples, 0.04%)</title><rect x="89.2853%" y="1285" width="0.0399%" height="15" fill="rgb(234,109,9)" fg:x="42515" fg:w="19"/><text x="89.5353%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="89.2853%" y="1269" width="0.0399%" height="15" fill="rgb(253,95,22)" fg:x="42515" fg:w="19"/><text x="89.5353%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="89.2895%" y="1253" width="0.0357%" height="15" fill="rgb(233,176,25)" fg:x="42517" fg:w="17"/><text x="89.5395%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="89.2958%" y="1237" width="0.0294%" height="15" fill="rgb(236,33,39)" fg:x="42520" fg:w="14"/><text x="89.5458%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="89.2958%" y="1221" width="0.0294%" height="15" fill="rgb(223,226,42)" fg:x="42520" fg:w="14"/><text x="89.5458%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="89.2958%" y="1205" width="0.0294%" height="15" fill="rgb(216,99,33)" fg:x="42520" fg:w="14"/><text x="89.5458%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="89.2958%" y="1189" width="0.0294%" height="15" fill="rgb(235,84,23)" fg:x="42520" fg:w="14"/><text x="89.5458%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="89.3021%" y="1173" width="0.0231%" height="15" fill="rgb(232,2,27)" fg:x="42523" fg:w="11"/><text x="89.5521%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="89.3021%" y="1157" width="0.0231%" height="15" fill="rgb(241,23,22)" fg:x="42523" fg:w="11"/><text x="89.5521%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="89.3021%" y="1141" width="0.0231%" height="15" fill="rgb(211,73,27)" fg:x="42523" fg:w="11"/><text x="89.5521%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="89.3021%" y="1125" width="0.0231%" height="15" fill="rgb(235,109,49)" fg:x="42523" fg:w="11"/><text x="89.5521%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="89.3147%" y="1109" width="0.0105%" height="15" fill="rgb(230,99,29)" fg:x="42529" fg:w="5"/><text x="89.5647%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="89.3147%" y="1093" width="0.0105%" height="15" fill="rgb(245,199,7)" fg:x="42529" fg:w="5"/><text x="89.5647%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.3147%" y="1077" width="0.0105%" height="15" fill="rgb(217,179,10)" fg:x="42529" fg:w="5"/><text x="89.5647%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.3147%" y="1061" width="0.0105%" height="15" fill="rgb(254,99,47)" fg:x="42529" fg:w="5"/><text x="89.5647%" y="1071.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="89.3273%" y="1285" width="0.0147%" height="15" fill="rgb(251,121,7)" fg:x="42535" fg:w="7"/><text x="89.5773%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.3420%" y="1269" width="0.0105%" height="15" fill="rgb(250,177,26)" fg:x="42542" fg:w="5"/><text x="89.5920%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (18 samples, 0.04%)</title><rect x="89.3252%" y="1317" width="0.0378%" height="15" fill="rgb(232,88,15)" fg:x="42534" fg:w="18"/><text x="89.5752%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="89.3273%" y="1301" width="0.0357%" height="15" fill="rgb(251,54,54)" fg:x="42535" fg:w="17"/><text x="89.5773%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="89.3420%" y="1285" width="0.0210%" height="15" fill="rgb(208,177,15)" fg:x="42542" fg:w="10"/><text x="89.5920%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (69 samples, 0.14%)</title><rect x="89.2265%" y="1349" width="0.1449%" height="15" fill="rgb(205,97,32)" fg:x="42487" fg:w="69"/><text x="89.4765%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (58 samples, 0.12%)</title><rect x="89.2496%" y="1333" width="0.1218%" height="15" fill="rgb(217,192,13)" fg:x="42498" fg:w="58"/><text x="89.4996%" y="1343.50"></text></g><g><title>libsystem_m.dylib`exp (6 samples, 0.01%)</title><rect x="89.3777%" y="1317" width="0.0126%" height="15" fill="rgb(215,163,41)" fg:x="42559" fg:w="6"/><text x="89.6277%" y="1327.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="89.4008%" y="1285" width="0.0147%" height="15" fill="rgb(246,83,29)" fg:x="42570" fg:w="7"/><text x="89.6508%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="89.3903%" y="1301" width="0.0399%" height="15" fill="rgb(219,2,45)" fg:x="42565" fg:w="19"/><text x="89.6403%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.4176%" y="1285" width="0.0126%" height="15" fill="rgb(242,215,33)" fg:x="42578" fg:w="6"/><text x="89.6676%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.4386%" y="1205" width="0.0168%" height="15" fill="rgb(217,1,6)" fg:x="42588" fg:w="8"/><text x="89.6886%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="89.4386%" y="1189" width="0.0168%" height="15" fill="rgb(207,85,52)" fg:x="42588" fg:w="8"/><text x="89.6886%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="89.4386%" y="1237" width="0.0336%" height="15" fill="rgb(231,171,19)" fg:x="42588" fg:w="16"/><text x="89.6886%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="89.4386%" y="1221" width="0.0336%" height="15" fill="rgb(207,128,4)" fg:x="42588" fg:w="16"/><text x="89.6886%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="89.4554%" y="1205" width="0.0168%" height="15" fill="rgb(219,208,4)" fg:x="42596" fg:w="8"/><text x="89.7054%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.4554%" y="1189" width="0.0168%" height="15" fill="rgb(235,161,42)" fg:x="42596" fg:w="8"/><text x="89.7054%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.4575%" y="1173" width="0.0147%" height="15" fill="rgb(247,218,18)" fg:x="42597" fg:w="7"/><text x="89.7075%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (52 samples, 0.11%)</title><rect x="89.3714%" y="1349" width="0.1092%" height="15" fill="rgb(232,114,51)" fg:x="42556" fg:w="52"/><text x="89.6214%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (51 samples, 0.11%)</title><rect x="89.3735%" y="1333" width="0.1071%" height="15" fill="rgb(222,95,3)" fg:x="42557" fg:w="51"/><text x="89.6235%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (43 samples, 0.09%)</title><rect x="89.3903%" y="1317" width="0.0903%" height="15" fill="rgb(240,65,29)" fg:x="42565" fg:w="43"/><text x="89.6403%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (20 samples, 0.04%)</title><rect x="89.4386%" y="1301" width="0.0420%" height="15" fill="rgb(249,209,20)" fg:x="42588" fg:w="20"/><text x="89.6886%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (20 samples, 0.04%)</title><rect x="89.4386%" y="1285" width="0.0420%" height="15" fill="rgb(241,48,37)" fg:x="42588" fg:w="20"/><text x="89.6886%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="89.4386%" y="1269" width="0.0420%" height="15" fill="rgb(230,140,42)" fg:x="42588" fg:w="20"/><text x="89.6886%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="89.4386%" y="1253" width="0.0420%" height="15" fill="rgb(230,176,45)" fg:x="42588" fg:w="20"/><text x="89.6886%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.4932%" y="1221" width="0.0168%" height="15" fill="rgb(245,112,21)" fg:x="42614" fg:w="8"/><text x="89.7432%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="89.4911%" y="1253" width="0.0399%" height="15" fill="rgb(207,183,35)" fg:x="42613" fg:w="19"/><text x="89.7411%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="89.4932%" y="1237" width="0.0378%" height="15" fill="rgb(227,44,33)" fg:x="42614" fg:w="18"/><text x="89.7432%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="89.5100%" y="1221" width="0.0210%" height="15" fill="rgb(246,120,21)" fg:x="42622" fg:w="10"/><text x="89.7600%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="89.5100%" y="1205" width="0.0210%" height="15" fill="rgb(235,57,52)" fg:x="42622" fg:w="10"/><text x="89.7600%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="89.5100%" y="1189" width="0.0210%" height="15" fill="rgb(238,84,10)" fg:x="42622" fg:w="10"/><text x="89.7600%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="89.5205%" y="1173" width="0.0105%" height="15" fill="rgb(251,200,32)" fg:x="42627" fg:w="5"/><text x="89.7705%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="89.5205%" y="1157" width="0.0105%" height="15" fill="rgb(247,159,13)" fg:x="42627" fg:w="5"/><text x="89.7705%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.5205%" y="1141" width="0.0105%" height="15" fill="rgb(238,64,4)" fg:x="42627" fg:w="5"/><text x="89.7705%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.5205%" y="1125" width="0.0105%" height="15" fill="rgb(221,131,51)" fg:x="42627" fg:w="5"/><text x="89.7705%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="89.5310%" y="1253" width="0.0210%" height="15" fill="rgb(242,5,29)" fg:x="42632" fg:w="10"/><text x="89.7810%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="89.5310%" y="1237" width="0.0210%" height="15" fill="rgb(214,130,32)" fg:x="42632" fg:w="10"/><text x="89.7810%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.5331%" y="1221" width="0.0189%" height="15" fill="rgb(244,210,16)" fg:x="42633" fg:w="9"/><text x="89.7831%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="89.5416%" y="1205" width="0.0105%" height="15" fill="rgb(234,48,26)" fg:x="42637" fg:w="5"/><text x="89.7916%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (32 samples, 0.07%)</title><rect x="89.4869%" y="1285" width="0.0672%" height="15" fill="rgb(231,82,38)" fg:x="42611" fg:w="32"/><text x="89.7369%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="89.4911%" y="1269" width="0.0630%" height="15" fill="rgb(254,128,41)" fg:x="42613" fg:w="30"/><text x="89.7411%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.5542%" y="1237" width="0.0126%" height="15" fill="rgb(212,73,49)" fg:x="42643" fg:w="6"/><text x="89.8042%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.5542%" y="1221" width="0.0126%" height="15" fill="rgb(205,62,54)" fg:x="42643" fg:w="6"/><text x="89.8042%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.5731%" y="1061" width="0.0105%" height="15" fill="rgb(228,0,8)" fg:x="42652" fg:w="5"/><text x="89.8231%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.5731%" y="1045" width="0.0105%" height="15" fill="rgb(251,28,17)" fg:x="42652" fg:w="5"/><text x="89.8231%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.5731%" y="1093" width="0.0189%" height="15" fill="rgb(238,105,27)" fg:x="42652" fg:w="9"/><text x="89.8231%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.5731%" y="1077" width="0.0189%" height="15" fill="rgb(237,216,33)" fg:x="42652" fg:w="9"/><text x="89.8231%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="89.5668%" y="1237" width="0.0336%" height="15" fill="rgb(229,228,25)" fg:x="42649" fg:w="16"/><text x="89.8168%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="89.5689%" y="1221" width="0.0315%" height="15" fill="rgb(233,75,23)" fg:x="42650" fg:w="15"/><text x="89.8189%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="89.5689%" y="1205" width="0.0315%" height="15" fill="rgb(231,207,16)" fg:x="42650" fg:w="15"/><text x="89.8189%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="89.5731%" y="1189" width="0.0273%" height="15" fill="rgb(231,191,45)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="89.5731%" y="1173" width="0.0273%" height="15" fill="rgb(224,133,17)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.5731%" y="1157" width="0.0273%" height="15" fill="rgb(209,178,27)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.5731%" y="1141" width="0.0273%" height="15" fill="rgb(218,37,11)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.5731%" y="1125" width="0.0273%" height="15" fill="rgb(251,226,25)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="89.5731%" y="1109" width="0.0273%" height="15" fill="rgb(209,222,27)" fg:x="42652" fg:w="13"/><text x="89.8231%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (25 samples, 0.05%)</title><rect x="89.5542%" y="1285" width="0.0525%" height="15" fill="rgb(238,22,21)" fg:x="42643" fg:w="25"/><text x="89.8042%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="89.5542%" y="1269" width="0.0525%" height="15" fill="rgb(233,161,25)" fg:x="42643" fg:w="25"/><text x="89.8042%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="89.5542%" y="1253" width="0.0525%" height="15" fill="rgb(226,122,53)" fg:x="42643" fg:w="25"/><text x="89.8042%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.6088%" y="1189" width="0.0105%" height="15" fill="rgb(220,123,17)" fg:x="42669" fg:w="5"/><text x="89.8588%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.6088%" y="1221" width="0.0168%" height="15" fill="rgb(230,224,35)" fg:x="42669" fg:w="8"/><text x="89.8588%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="89.6088%" y="1205" width="0.0168%" height="15" fill="rgb(246,83,8)" fg:x="42669" fg:w="8"/><text x="89.8588%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="89.6256%" y="1221" width="0.0126%" height="15" fill="rgb(230,214,17)" fg:x="42677" fg:w="6"/><text x="89.8756%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.6256%" y="1205" width="0.0126%" height="15" fill="rgb(222,97,18)" fg:x="42677" fg:w="6"/><text x="89.8756%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.6256%" y="1189" width="0.0126%" height="15" fill="rgb(206,79,1)" fg:x="42677" fg:w="6"/><text x="89.8756%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="89.6277%" y="1173" width="0.0105%" height="15" fill="rgb(214,121,34)" fg:x="42678" fg:w="5"/><text x="89.8777%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="89.6277%" y="1157" width="0.0105%" height="15" fill="rgb(249,199,46)" fg:x="42678" fg:w="5"/><text x="89.8777%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.6277%" y="1141" width="0.0105%" height="15" fill="rgb(214,222,46)" fg:x="42678" fg:w="5"/><text x="89.8777%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.6277%" y="1125" width="0.0105%" height="15" fill="rgb(248,168,30)" fg:x="42678" fg:w="5"/><text x="89.8777%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (18 samples, 0.04%)</title><rect x="89.6067%" y="1269" width="0.0378%" height="15" fill="rgb(226,14,28)" fg:x="42668" fg:w="18"/><text x="89.8567%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="89.6067%" y="1253" width="0.0378%" height="15" fill="rgb(253,123,1)" fg:x="42668" fg:w="18"/><text x="89.8567%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="89.6088%" y="1237" width="0.0357%" height="15" fill="rgb(225,24,42)" fg:x="42669" fg:w="17"/><text x="89.8588%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (220 samples, 0.46%)</title><rect x="89.1845%" y="1397" width="0.4620%" height="15" fill="rgb(216,161,37)" fg:x="42467" fg:w="220"/><text x="89.4345%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (220 samples, 0.46%)</title><rect x="89.1845%" y="1381" width="0.4620%" height="15" fill="rgb(251,164,26)" fg:x="42467" fg:w="220"/><text x="89.4345%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (204 samples, 0.43%)</title><rect x="89.2181%" y="1365" width="0.4284%" height="15" fill="rgb(219,177,3)" fg:x="42483" fg:w="204"/><text x="89.4681%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (79 samples, 0.17%)</title><rect x="89.4806%" y="1349" width="0.1659%" height="15" fill="rgb(222,65,0)" fg:x="42608" fg:w="79"/><text x="89.7306%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (79 samples, 0.17%)</title><rect x="89.4806%" y="1333" width="0.1659%" height="15" fill="rgb(223,69,54)" fg:x="42608" fg:w="79"/><text x="89.7306%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (78 samples, 0.16%)</title><rect x="89.4827%" y="1317" width="0.1638%" height="15" fill="rgb(235,30,27)" fg:x="42609" fg:w="78"/><text x="89.7327%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (77 samples, 0.16%)</title><rect x="89.4848%" y="1301" width="0.1617%" height="15" fill="rgb(220,183,50)" fg:x="42610" fg:w="77"/><text x="89.7348%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (19 samples, 0.04%)</title><rect x="89.6067%" y="1285" width="0.0399%" height="15" fill="rgb(248,198,15)" fg:x="42668" fg:w="19"/><text x="89.8567%" y="1295.50"></text></g><g><title>libsystem_kernel.dylib`swtch_pri (5 samples, 0.01%)</title><rect x="89.6466%" y="1381" width="0.0105%" height="15" fill="rgb(222,211,4)" fg:x="42687" fg:w="5"/><text x="89.8966%" y="1391.50"></text></g><g><title>libsystem_m.dylib`exp (9 samples, 0.02%)</title><rect x="89.6613%" y="1349" width="0.0189%" height="15" fill="rgb(214,102,34)" fg:x="42694" fg:w="9"/><text x="89.9113%" y="1359.50"></text></g><g><title>libsystem_m.dylib`exp (11 samples, 0.02%)</title><rect x="89.7033%" y="1285" width="0.0231%" height="15" fill="rgb(245,92,5)" fg:x="42714" fg:w="11"/><text x="89.9533%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.7453%" y="1173" width="0.0168%" height="15" fill="rgb(252,72,51)" fg:x="42734" fg:w="8"/><text x="89.9953%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (8 samples, 0.02%)</title><rect x="89.7453%" y="1157" width="0.0168%" height="15" fill="rgb(252,208,19)" fg:x="42734" fg:w="8"/><text x="89.9953%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="89.7432%" y="1205" width="0.0273%" height="15" fill="rgb(211,69,7)" fg:x="42733" fg:w="13"/><text x="89.9932%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="89.7453%" y="1189" width="0.0252%" height="15" fill="rgb(211,27,16)" fg:x="42734" fg:w="12"/><text x="89.9953%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (22 samples, 0.05%)</title><rect x="89.7369%" y="1237" width="0.0462%" height="15" fill="rgb(219,216,14)" fg:x="42730" fg:w="22"/><text x="89.9869%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="89.7432%" y="1221" width="0.0399%" height="15" fill="rgb(219,71,8)" fg:x="42733" fg:w="19"/><text x="89.9932%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="89.7705%" y="1205" width="0.0126%" height="15" fill="rgb(223,170,53)" fg:x="42746" fg:w="6"/><text x="90.0205%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.7873%" y="1189" width="0.0126%" height="15" fill="rgb(246,21,26)" fg:x="42754" fg:w="6"/><text x="90.0373%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.7894%" y="1173" width="0.0105%" height="15" fill="rgb(248,20,46)" fg:x="42755" fg:w="5"/><text x="90.0394%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="89.7831%" y="1237" width="0.0336%" height="15" fill="rgb(252,94,11)" fg:x="42752" fg:w="16"/><text x="90.0331%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (16 samples, 0.03%)</title><rect x="89.7831%" y="1221" width="0.0336%" height="15" fill="rgb(236,163,8)" fg:x="42752" fg:w="16"/><text x="90.0331%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="89.7873%" y="1205" width="0.0294%" height="15" fill="rgb(217,221,45)" fg:x="42754" fg:w="14"/><text x="90.0373%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="89.7999%" y="1189" width="0.0168%" height="15" fill="rgb(238,38,17)" fg:x="42760" fg:w="8"/><text x="90.0499%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.7999%" y="1173" width="0.0168%" height="15" fill="rgb(242,210,23)" fg:x="42760" fg:w="8"/><text x="90.0499%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.8062%" y="1157" width="0.0105%" height="15" fill="rgb(250,86,53)" fg:x="42763" fg:w="5"/><text x="90.0562%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="89.8062%" y="1141" width="0.0105%" height="15" fill="rgb(223,168,25)" fg:x="42763" fg:w="5"/><text x="90.0562%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.8062%" y="1125" width="0.0105%" height="15" fill="rgb(251,189,4)" fg:x="42763" fg:w="5"/><text x="90.0562%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (43 samples, 0.09%)</title><rect x="89.7306%" y="1269" width="0.0903%" height="15" fill="rgb(245,19,28)" fg:x="42727" fg:w="43"/><text x="89.9806%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (40 samples, 0.08%)</title><rect x="89.7369%" y="1253" width="0.0840%" height="15" fill="rgb(207,10,34)" fg:x="42730" fg:w="40"/><text x="89.9869%" y="1263.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="89.8230%" y="1237" width="0.0147%" height="15" fill="rgb(235,153,31)" fg:x="42771" fg:w="7"/><text x="90.0730%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="89.8398%" y="1221" width="0.0252%" height="15" fill="rgb(228,72,37)" fg:x="42779" fg:w="12"/><text x="90.0898%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.8461%" y="1205" width="0.0189%" height="15" fill="rgb(215,15,16)" fg:x="42782" fg:w="9"/><text x="90.0961%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="89.8545%" y="1189" width="0.0105%" height="15" fill="rgb(250,119,29)" fg:x="42786" fg:w="5"/><text x="90.1045%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.8545%" y="1173" width="0.0105%" height="15" fill="rgb(214,59,1)" fg:x="42786" fg:w="5"/><text x="90.1045%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.8713%" y="1173" width="0.0147%" height="15" fill="rgb(223,109,25)" fg:x="42794" fg:w="7"/><text x="90.1213%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.8734%" y="1157" width="0.0126%" height="15" fill="rgb(230,198,22)" fg:x="42795" fg:w="6"/><text x="90.1234%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (25 samples, 0.05%)</title><rect x="89.8650%" y="1221" width="0.0525%" height="15" fill="rgb(245,184,46)" fg:x="42791" fg:w="25"/><text x="90.1150%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="89.8650%" y="1205" width="0.0525%" height="15" fill="rgb(253,73,16)" fg:x="42791" fg:w="25"/><text x="90.1150%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (23 samples, 0.05%)</title><rect x="89.8692%" y="1189" width="0.0483%" height="15" fill="rgb(206,94,45)" fg:x="42793" fg:w="23"/><text x="90.1192%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="89.8860%" y="1173" width="0.0315%" height="15" fill="rgb(236,83,27)" fg:x="42801" fg:w="15"/><text x="90.1360%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="89.8860%" y="1157" width="0.0315%" height="15" fill="rgb(220,196,8)" fg:x="42801" fg:w="15"/><text x="90.1360%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="89.8944%" y="1141" width="0.0231%" height="15" fill="rgb(254,185,14)" fg:x="42805" fg:w="11"/><text x="90.1444%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="89.8986%" y="1125" width="0.0189%" height="15" fill="rgb(226,50,22)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="89.8986%" y="1109" width="0.0189%" height="15" fill="rgb(253,147,0)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.8986%" y="1093" width="0.0189%" height="15" fill="rgb(252,46,33)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.8986%" y="1077" width="0.0189%" height="15" fill="rgb(242,22,54)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="89.8986%" y="1061" width="0.0189%" height="15" fill="rgb(223,178,32)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.8986%" y="1045" width="0.0189%" height="15" fill="rgb(214,106,53)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.8986%" y="1029" width="0.0189%" height="15" fill="rgb(232,65,50)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="89.8986%" y="1013" width="0.0189%" height="15" fill="rgb(231,110,28)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="89.8986%" y="997" width="0.0189%" height="15" fill="rgb(216,71,40)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.8986%" y="981" width="0.0189%" height="15" fill="rgb(229,89,53)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="89.8986%" y="965" width="0.0189%" height="15" fill="rgb(210,124,14)" fg:x="42807" fg:w="9"/><text x="90.1486%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="89.9028%" y="949" width="0.0147%" height="15" fill="rgb(236,213,6)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.9028%" y="933" width="0.0147%" height="15" fill="rgb(228,41,5)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.9028%" y="917" width="0.0147%" height="15" fill="rgb(221,167,25)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="89.9028%" y="901" width="0.0147%" height="15" fill="rgb(228,144,37)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="89.9028%" y="885" width="0.0147%" height="15" fill="rgb(227,189,38)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.9028%" y="869" width="0.0147%" height="15" fill="rgb(218,8,2)" fg:x="42809" fg:w="7"/><text x="90.1528%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="89.9049%" y="853" width="0.0126%" height="15" fill="rgb(209,61,28)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.9049%" y="837" width="0.0126%" height="15" fill="rgb(233,140,39)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.9049%" y="821" width="0.0126%" height="15" fill="rgb(251,66,48)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="89.9049%" y="805" width="0.0126%" height="15" fill="rgb(210,44,45)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="89.9049%" y="789" width="0.0126%" height="15" fill="rgb(214,136,46)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="89.9049%" y="773" width="0.0126%" height="15" fill="rgb(207,130,50)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="89.9049%" y="757" width="0.0126%" height="15" fill="rgb(228,102,49)" fg:x="42810" fg:w="6"/><text x="90.1549%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="89.9070%" y="741" width="0.0105%" height="15" fill="rgb(253,55,1)" fg:x="42811" fg:w="5"/><text x="90.1570%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="89.9070%" y="725" width="0.0105%" height="15" fill="rgb(238,222,9)" fg:x="42811" fg:w="5"/><text x="90.1570%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.9070%" y="709" width="0.0105%" height="15" fill="rgb(246,99,6)" fg:x="42811" fg:w="5"/><text x="90.1570%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="89.9070%" y="693" width="0.0105%" height="15" fill="rgb(219,110,26)" fg:x="42811" fg:w="5"/><text x="90.1570%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (49 samples, 0.10%)</title><rect x="89.8209%" y="1269" width="0.1029%" height="15" fill="rgb(239,160,33)" fg:x="42770" fg:w="49"/><text x="90.0709%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (49 samples, 0.10%)</title><rect x="89.8209%" y="1253" width="0.1029%" height="15" fill="rgb(220,202,23)" fg:x="42770" fg:w="49"/><text x="90.0709%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (41 samples, 0.09%)</title><rect x="89.8377%" y="1237" width="0.0861%" height="15" fill="rgb(208,80,26)" fg:x="42778" fg:w="41"/><text x="90.0877%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (107 samples, 0.22%)</title><rect x="89.7033%" y="1301" width="0.2247%" height="15" fill="rgb(243,85,7)" fg:x="42714" fg:w="107"/><text x="89.9533%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (94 samples, 0.20%)</title><rect x="89.7306%" y="1285" width="0.1974%" height="15" fill="rgb(228,77,47)" fg:x="42727" fg:w="94"/><text x="89.9806%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (7 samples, 0.01%)</title><rect x="89.9343%" y="1269" width="0.0147%" height="15" fill="rgb(212,226,8)" fg:x="42824" fg:w="7"/><text x="90.1843%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.9553%" y="1221" width="0.0168%" height="15" fill="rgb(241,120,54)" fg:x="42834" fg:w="8"/><text x="90.2053%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="89.9553%" y="1205" width="0.0168%" height="15" fill="rgb(226,80,16)" fg:x="42834" fg:w="8"/><text x="90.2053%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="89.9616%" y="1189" width="0.0105%" height="15" fill="rgb(240,76,13)" fg:x="42837" fg:w="5"/><text x="90.2116%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="89.9616%" y="1173" width="0.0105%" height="15" fill="rgb(252,74,8)" fg:x="42837" fg:w="5"/><text x="90.2116%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="89.9721%" y="1221" width="0.0189%" height="15" fill="rgb(244,155,2)" fg:x="42842" fg:w="9"/><text x="90.2221%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="89.9721%" y="1205" width="0.0189%" height="15" fill="rgb(215,81,35)" fg:x="42842" fg:w="9"/><text x="90.2221%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.9763%" y="1189" width="0.0147%" height="15" fill="rgb(206,55,2)" fg:x="42844" fg:w="7"/><text x="90.2263%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (20 samples, 0.04%)</title><rect x="89.9532%" y="1253" width="0.0420%" height="15" fill="rgb(231,2,34)" fg:x="42833" fg:w="20"/><text x="90.2032%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="89.9553%" y="1237" width="0.0399%" height="15" fill="rgb(242,176,48)" fg:x="42834" fg:w="19"/><text x="90.2053%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="89.9973%" y="1205" width="0.0168%" height="15" fill="rgb(249,31,36)" fg:x="42854" fg:w="8"/><text x="90.2473%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="89.9994%" y="1189" width="0.0147%" height="15" fill="rgb(205,18,17)" fg:x="42855" fg:w="7"/><text x="90.2494%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="90.0141%" y="1205" width="0.0105%" height="15" fill="rgb(254,130,5)" fg:x="42862" fg:w="5"/><text x="90.2641%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.0141%" y="1189" width="0.0105%" height="15" fill="rgb(229,42,45)" fg:x="42862" fg:w="5"/><text x="90.2641%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (22 samples, 0.05%)</title><rect x="89.9952%" y="1253" width="0.0462%" height="15" fill="rgb(245,95,25)" fg:x="42853" fg:w="22"/><text x="90.2452%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="89.9973%" y="1237" width="0.0441%" height="15" fill="rgb(249,193,38)" fg:x="42854" fg:w="21"/><text x="90.2473%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="89.9973%" y="1221" width="0.0441%" height="15" fill="rgb(241,140,43)" fg:x="42854" fg:w="21"/><text x="90.2473%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="90.0246%" y="1205" width="0.0168%" height="15" fill="rgb(245,78,48)" fg:x="42867" fg:w="8"/><text x="90.2746%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="90.0267%" y="1189" width="0.0147%" height="15" fill="rgb(214,92,39)" fg:x="42868" fg:w="7"/><text x="90.2767%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.0267%" y="1173" width="0.0147%" height="15" fill="rgb(211,189,14)" fg:x="42868" fg:w="7"/><text x="90.2767%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.0288%" y="1157" width="0.0126%" height="15" fill="rgb(218,7,24)" fg:x="42869" fg:w="6"/><text x="90.2788%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.0414%" y="1189" width="0.0126%" height="15" fill="rgb(224,200,49)" fg:x="42875" fg:w="6"/><text x="90.2914%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.0414%" y="1173" width="0.0126%" height="15" fill="rgb(218,210,14)" fg:x="42875" fg:w="6"/><text x="90.2914%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (68 samples, 0.14%)</title><rect x="89.9280%" y="1301" width="0.1428%" height="15" fill="rgb(234,142,31)" fg:x="42821" fg:w="68"/><text x="90.1780%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (68 samples, 0.14%)</title><rect x="89.9280%" y="1285" width="0.1428%" height="15" fill="rgb(227,165,2)" fg:x="42821" fg:w="68"/><text x="90.1780%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (57 samples, 0.12%)</title><rect x="89.9511%" y="1269" width="0.1197%" height="15" fill="rgb(232,44,46)" fg:x="42832" fg:w="57"/><text x="90.2011%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="90.0414%" y="1253" width="0.0294%" height="15" fill="rgb(236,149,47)" fg:x="42875" fg:w="14"/><text x="90.2914%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="90.0414%" y="1237" width="0.0294%" height="15" fill="rgb(227,45,31)" fg:x="42875" fg:w="14"/><text x="90.2914%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="90.0414%" y="1221" width="0.0294%" height="15" fill="rgb(240,176,51)" fg:x="42875" fg:w="14"/><text x="90.2914%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="90.0414%" y="1205" width="0.0294%" height="15" fill="rgb(249,146,41)" fg:x="42875" fg:w="14"/><text x="90.2914%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="90.0582%" y="1189" width="0.0126%" height="15" fill="rgb(213,208,4)" fg:x="42883" fg:w="6"/><text x="90.3082%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="90.0582%" y="1173" width="0.0126%" height="15" fill="rgb(245,84,36)" fg:x="42883" fg:w="6"/><text x="90.3082%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.0582%" y="1157" width="0.0126%" height="15" fill="rgb(254,84,18)" fg:x="42883" fg:w="6"/><text x="90.3082%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.0603%" y="1141" width="0.0105%" height="15" fill="rgb(225,38,54)" fg:x="42884" fg:w="5"/><text x="90.3103%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.0603%" y="1125" width="0.0105%" height="15" fill="rgb(246,50,30)" fg:x="42884" fg:w="5"/><text x="90.3103%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.0603%" y="1109" width="0.0105%" height="15" fill="rgb(246,148,9)" fg:x="42884" fg:w="5"/><text x="90.3103%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.0729%" y="1205" width="0.0147%" height="15" fill="rgb(223,75,4)" fg:x="42890" fg:w="7"/><text x="90.3229%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.0750%" y="1189" width="0.0126%" height="15" fill="rgb(239,148,41)" fg:x="42891" fg:w="6"/><text x="90.3250%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="90.0876%" y="1205" width="0.0126%" height="15" fill="rgb(205,195,3)" fg:x="42897" fg:w="6"/><text x="90.3376%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.0876%" y="1189" width="0.0126%" height="15" fill="rgb(254,161,1)" fg:x="42897" fg:w="6"/><text x="90.3376%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.0876%" y="1173" width="0.0126%" height="15" fill="rgb(211,229,8)" fg:x="42897" fg:w="6"/><text x="90.3376%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="90.0729%" y="1237" width="0.0399%" height="15" fill="rgb(220,97,9)" fg:x="42890" fg:w="19"/><text x="90.3229%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="90.0729%" y="1221" width="0.0399%" height="15" fill="rgb(240,218,8)" fg:x="42890" fg:w="19"/><text x="90.3229%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="90.1002%" y="1205" width="0.0126%" height="15" fill="rgb(250,44,0)" fg:x="42903" fg:w="6"/><text x="90.3502%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="90.1002%" y="1189" width="0.0126%" height="15" fill="rgb(236,41,53)" fg:x="42903" fg:w="6"/><text x="90.3502%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.1002%" y="1173" width="0.0126%" height="15" fill="rgb(218,227,13)" fg:x="42903" fg:w="6"/><text x="90.3502%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.1002%" y="1157" width="0.0126%" height="15" fill="rgb(217,94,32)" fg:x="42903" fg:w="6"/><text x="90.3502%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.1023%" y="1141" width="0.0105%" height="15" fill="rgb(213,217,12)" fg:x="42904" fg:w="5"/><text x="90.3523%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.1023%" y="1125" width="0.0105%" height="15" fill="rgb(229,13,46)" fg:x="42904" fg:w="5"/><text x="90.3523%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.1023%" y="1109" width="0.0105%" height="15" fill="rgb(243,139,5)" fg:x="42904" fg:w="5"/><text x="90.3523%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.1023%" y="1093" width="0.0105%" height="15" fill="rgb(249,38,45)" fg:x="42904" fg:w="5"/><text x="90.3523%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="90.1128%" y="1237" width="0.0147%" height="15" fill="rgb(216,70,11)" fg:x="42909" fg:w="7"/><text x="90.3628%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.1128%" y="1221" width="0.0147%" height="15" fill="rgb(253,101,25)" fg:x="42909" fg:w="7"/><text x="90.3628%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.1170%" y="1205" width="0.0105%" height="15" fill="rgb(207,197,30)" fg:x="42911" fg:w="5"/><text x="90.3670%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (31 samples, 0.07%)</title><rect x="90.0708%" y="1285" width="0.0651%" height="15" fill="rgb(238,87,13)" fg:x="42889" fg:w="31"/><text x="90.3208%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (31 samples, 0.07%)</title><rect x="90.0708%" y="1269" width="0.0651%" height="15" fill="rgb(215,155,8)" fg:x="42889" fg:w="31"/><text x="90.3208%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (30 samples, 0.06%)</title><rect x="90.0729%" y="1253" width="0.0630%" height="15" fill="rgb(239,166,38)" fg:x="42890" fg:w="30"/><text x="90.3229%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (215 samples, 0.45%)</title><rect x="89.6886%" y="1333" width="0.4515%" height="15" fill="rgb(240,194,35)" fg:x="42707" fg:w="215"/><text x="89.9386%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (210 samples, 0.44%)</title><rect x="89.6991%" y="1317" width="0.4410%" height="15" fill="rgb(219,10,44)" fg:x="42712" fg:w="210"/><text x="89.9491%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (33 samples, 0.07%)</title><rect x="90.0708%" y="1301" width="0.0693%" height="15" fill="rgb(251,220,35)" fg:x="42889" fg:w="33"/><text x="90.3208%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="90.1422%" y="1301" width="0.0105%" height="15" fill="rgb(218,117,13)" fg:x="42923" fg:w="5"/><text x="90.3922%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (5 samples, 0.01%)</title><rect x="90.1548%" y="1269" width="0.0105%" height="15" fill="rgb(221,213,40)" fg:x="42929" fg:w="5"/><text x="90.4048%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="90.1548%" y="1285" width="0.0210%" height="15" fill="rgb(251,224,35)" fg:x="42929" fg:w="10"/><text x="90.4048%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.1653%" y="1269" width="0.0105%" height="15" fill="rgb(241,33,39)" fg:x="42934" fg:w="5"/><text x="90.4153%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="90.1758%" y="1285" width="0.0168%" height="15" fill="rgb(222,74,17)" fg:x="42939" fg:w="8"/><text x="90.4258%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="90.1758%" y="1269" width="0.0168%" height="15" fill="rgb(225,103,0)" fg:x="42939" fg:w="8"/><text x="90.4258%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.1926%" y="1221" width="0.0147%" height="15" fill="rgb(240,0,12)" fg:x="42947" fg:w="7"/><text x="90.4426%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="90.1926%" y="1205" width="0.0147%" height="15" fill="rgb(233,213,37)" fg:x="42947" fg:w="7"/><text x="90.4426%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="90.2073%" y="1221" width="0.0147%" height="15" fill="rgb(225,84,52)" fg:x="42954" fg:w="7"/><text x="90.4573%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.2073%" y="1205" width="0.0147%" height="15" fill="rgb(247,160,51)" fg:x="42954" fg:w="7"/><text x="90.4573%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="90.2073%" y="1189" width="0.0147%" height="15" fill="rgb(244,60,51)" fg:x="42954" fg:w="7"/><text x="90.4573%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (42 samples, 0.09%)</title><rect x="90.1401%" y="1333" width="0.0882%" height="15" fill="rgb(233,114,7)" fg:x="42922" fg:w="42"/><text x="90.3901%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (41 samples, 0.09%)</title><rect x="90.1422%" y="1317" width="0.0861%" height="15" fill="rgb(246,136,16)" fg:x="42923" fg:w="41"/><text x="90.3922%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (36 samples, 0.08%)</title><rect x="90.1527%" y="1301" width="0.0756%" height="15" fill="rgb(243,114,45)" fg:x="42928" fg:w="36"/><text x="90.4027%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (17 samples, 0.04%)</title><rect x="90.1926%" y="1285" width="0.0357%" height="15" fill="rgb(247,183,43)" fg:x="42947" fg:w="17"/><text x="90.4426%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (17 samples, 0.04%)</title><rect x="90.1926%" y="1269" width="0.0357%" height="15" fill="rgb(251,210,42)" fg:x="42947" fg:w="17"/><text x="90.4426%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="90.1926%" y="1253" width="0.0357%" height="15" fill="rgb(221,88,35)" fg:x="42947" fg:w="17"/><text x="90.4426%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (17 samples, 0.04%)</title><rect x="90.1926%" y="1237" width="0.0357%" height="15" fill="rgb(242,21,20)" fg:x="42947" fg:w="17"/><text x="90.4426%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.2556%" y="1205" width="0.0126%" height="15" fill="rgb(233,226,36)" fg:x="42977" fg:w="6"/><text x="90.5056%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2577%" y="1189" width="0.0105%" height="15" fill="rgb(243,189,34)" fg:x="42978" fg:w="5"/><text x="90.5077%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="90.2493%" y="1237" width="0.0357%" height="15" fill="rgb(207,145,50)" fg:x="42974" fg:w="17"/><text x="90.4993%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="90.2535%" y="1221" width="0.0315%" height="15" fill="rgb(242,1,50)" fg:x="42976" fg:w="15"/><text x="90.5035%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.2745%" y="1205" width="0.0105%" height="15" fill="rgb(231,65,32)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.2745%" y="1189" width="0.0105%" height="15" fill="rgb(208,68,49)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="1173" width="0.0105%" height="15" fill="rgb(253,54,49)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="1157" width="0.0105%" height="15" fill="rgb(245,186,24)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="1141" width="0.0105%" height="15" fill="rgb(209,2,41)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="1125" width="0.0105%" height="15" fill="rgb(242,208,54)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.2745%" y="1109" width="0.0105%" height="15" fill="rgb(225,9,51)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.2745%" y="1093" width="0.0105%" height="15" fill="rgb(207,207,25)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="1077" width="0.0105%" height="15" fill="rgb(253,96,18)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="1061" width="0.0105%" height="15" fill="rgb(252,215,20)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="1045" width="0.0105%" height="15" fill="rgb(245,227,26)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="1029" width="0.0105%" height="15" fill="rgb(241,208,0)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.2745%" y="1013" width="0.0105%" height="15" fill="rgb(224,130,10)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.2745%" y="997" width="0.0105%" height="15" fill="rgb(237,29,0)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="981" width="0.0105%" height="15" fill="rgb(219,27,41)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="965" width="0.0105%" height="15" fill="rgb(245,101,19)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.2745%" y="949" width="0.0105%" height="15" fill="rgb(243,44,37)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.2745%" y="933" width="0.0105%" height="15" fill="rgb(228,213,43)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="917" width="0.0105%" height="15" fill="rgb(219,163,21)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="901" width="0.0105%" height="15" fill="rgb(234,86,24)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.2745%" y="885" width="0.0105%" height="15" fill="rgb(225,10,24)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.2745%" y="869" width="0.0105%" height="15" fill="rgb(218,109,7)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="853" width="0.0105%" height="15" fill="rgb(210,20,26)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="837" width="0.0105%" height="15" fill="rgb(216,18,1)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="821" width="0.0105%" height="15" fill="rgb(206,163,23)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="805" width="0.0105%" height="15" fill="rgb(229,150,31)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.2745%" y="789" width="0.0105%" height="15" fill="rgb(231,10,5)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.2745%" y="773" width="0.0105%" height="15" fill="rgb(250,40,50)" fg:x="42986" fg:w="5"/><text x="90.5245%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="90.2850%" y="1237" width="0.0273%" height="15" fill="rgb(217,119,7)" fg:x="42991" fg:w="13"/><text x="90.5350%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="90.2871%" y="1221" width="0.0252%" height="15" fill="rgb(245,214,40)" fg:x="42992" fg:w="12"/><text x="90.5371%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.2955%" y="1205" width="0.0168%" height="15" fill="rgb(216,187,1)" fg:x="42996" fg:w="8"/><text x="90.5455%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (42 samples, 0.09%)</title><rect x="90.2388%" y="1269" width="0.0882%" height="15" fill="rgb(237,146,21)" fg:x="42969" fg:w="42"/><text x="90.4888%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="90.2472%" y="1253" width="0.0798%" height="15" fill="rgb(210,174,47)" fg:x="42973" fg:w="38"/><text x="90.4972%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="90.3123%" y="1237" width="0.0147%" height="15" fill="rgb(218,111,39)" fg:x="43004" fg:w="7"/><text x="90.5623%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="90.3123%" y="1221" width="0.0147%" height="15" fill="rgb(224,95,19)" fg:x="43004" fg:w="7"/><text x="90.5623%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.3123%" y="1205" width="0.0147%" height="15" fill="rgb(234,15,38)" fg:x="43004" fg:w="7"/><text x="90.5623%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="90.3123%" y="1189" width="0.0147%" height="15" fill="rgb(246,56,12)" fg:x="43004" fg:w="7"/><text x="90.5623%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.3312%" y="1221" width="0.0105%" height="15" fill="rgb(247,16,17)" fg:x="43013" fg:w="5"/><text x="90.5812%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="90.3417%" y="1221" width="0.0126%" height="15" fill="rgb(215,151,11)" fg:x="43018" fg:w="6"/><text x="90.5917%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.3417%" y="1205" width="0.0126%" height="15" fill="rgb(225,16,24)" fg:x="43018" fg:w="6"/><text x="90.5917%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.3417%" y="1189" width="0.0126%" height="15" fill="rgb(217,117,5)" fg:x="43018" fg:w="6"/><text x="90.5917%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (20 samples, 0.04%)</title><rect x="90.3270%" y="1269" width="0.0420%" height="15" fill="rgb(246,187,53)" fg:x="43011" fg:w="20"/><text x="90.5770%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="90.3291%" y="1253" width="0.0399%" height="15" fill="rgb(241,71,40)" fg:x="43012" fg:w="19"/><text x="90.5791%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="90.3312%" y="1237" width="0.0378%" height="15" fill="rgb(231,67,39)" fg:x="43013" fg:w="18"/><text x="90.5812%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="90.3543%" y="1221" width="0.0147%" height="15" fill="rgb(222,120,24)" fg:x="43024" fg:w="7"/><text x="90.6043%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="90.3543%" y="1205" width="0.0147%" height="15" fill="rgb(248,3,3)" fg:x="43024" fg:w="7"/><text x="90.6043%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.3564%" y="1189" width="0.0126%" height="15" fill="rgb(228,218,5)" fg:x="43025" fg:w="6"/><text x="90.6064%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.3564%" y="1173" width="0.0126%" height="15" fill="rgb(212,202,43)" fg:x="43025" fg:w="6"/><text x="90.6064%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.3837%" y="1141" width="0.0105%" height="15" fill="rgb(235,183,2)" fg:x="43038" fg:w="5"/><text x="90.6337%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.3837%" y="1125" width="0.0105%" height="15" fill="rgb(230,165,10)" fg:x="43038" fg:w="5"/><text x="90.6337%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="90.3816%" y="1173" width="0.0189%" height="15" fill="rgb(219,54,40)" fg:x="43037" fg:w="9"/><text x="90.6316%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.3837%" y="1157" width="0.0168%" height="15" fill="rgb(244,73,9)" fg:x="43038" fg:w="8"/><text x="90.6337%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="90.3774%" y="1205" width="0.0273%" height="15" fill="rgb(212,32,45)" fg:x="43035" fg:w="13"/><text x="90.6274%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="90.3816%" y="1189" width="0.0231%" height="15" fill="rgb(205,58,31)" fg:x="43037" fg:w="11"/><text x="90.6316%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="90.4047%" y="1205" width="0.0105%" height="15" fill="rgb(250,120,43)" fg:x="43048" fg:w="5"/><text x="90.6547%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.4047%" y="1189" width="0.0105%" height="15" fill="rgb(235,13,10)" fg:x="43048" fg:w="5"/><text x="90.6547%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="90.4173%" y="1141" width="0.0231%" height="15" fill="rgb(232,219,31)" fg:x="43054" fg:w="11"/><text x="90.6673%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="90.4173%" y="1125" width="0.0231%" height="15" fill="rgb(218,157,51)" fg:x="43054" fg:w="11"/><text x="90.6673%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="90.4236%" y="1109" width="0.0168%" height="15" fill="rgb(211,91,52)" fg:x="43057" fg:w="8"/><text x="90.6736%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="90.4236%" y="1093" width="0.0168%" height="15" fill="rgb(240,173,1)" fg:x="43057" fg:w="8"/><text x="90.6736%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="90.4236%" y="1077" width="0.0168%" height="15" fill="rgb(248,20,47)" fg:x="43057" fg:w="8"/><text x="90.6736%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.4236%" y="1061" width="0.0168%" height="15" fill="rgb(217,221,40)" fg:x="43057" fg:w="8"/><text x="90.6736%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="90.4278%" y="1045" width="0.0126%" height="15" fill="rgb(226,149,51)" fg:x="43059" fg:w="6"/><text x="90.6778%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="90.4278%" y="1029" width="0.0126%" height="15" fill="rgb(252,193,7)" fg:x="43059" fg:w="6"/><text x="90.6778%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.4278%" y="1013" width="0.0126%" height="15" fill="rgb(205,123,0)" fg:x="43059" fg:w="6"/><text x="90.6778%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.4278%" y="997" width="0.0126%" height="15" fill="rgb(233,173,25)" fg:x="43059" fg:w="6"/><text x="90.6778%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (101 samples, 0.21%)</title><rect x="90.2304%" y="1317" width="0.2121%" height="15" fill="rgb(216,63,32)" fg:x="42965" fg:w="101"/><text x="90.4804%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (100 samples, 0.21%)</title><rect x="90.2325%" y="1301" width="0.2100%" height="15" fill="rgb(209,56,45)" fg:x="42966" fg:w="100"/><text x="90.4825%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (97 samples, 0.20%)</title><rect x="90.2388%" y="1285" width="0.2037%" height="15" fill="rgb(226,111,49)" fg:x="42969" fg:w="97"/><text x="90.4888%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (35 samples, 0.07%)</title><rect x="90.3690%" y="1269" width="0.0735%" height="15" fill="rgb(244,181,21)" fg:x="43031" fg:w="35"/><text x="90.6190%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (35 samples, 0.07%)</title><rect x="90.3690%" y="1253" width="0.0735%" height="15" fill="rgb(222,126,15)" fg:x="43031" fg:w="35"/><text x="90.6190%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="90.3711%" y="1237" width="0.0714%" height="15" fill="rgb(222,95,17)" fg:x="43032" fg:w="34"/><text x="90.6211%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (31 samples, 0.07%)</title><rect x="90.3774%" y="1221" width="0.0651%" height="15" fill="rgb(254,46,5)" fg:x="43035" fg:w="31"/><text x="90.6274%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="90.4152%" y="1205" width="0.0273%" height="15" fill="rgb(236,216,35)" fg:x="43053" fg:w="13"/><text x="90.6652%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="90.4173%" y="1189" width="0.0252%" height="15" fill="rgb(217,187,26)" fg:x="43054" fg:w="12"/><text x="90.6673%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="90.4173%" y="1173" width="0.0252%" height="15" fill="rgb(207,192,25)" fg:x="43054" fg:w="12"/><text x="90.6673%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="90.4173%" y="1157" width="0.0252%" height="15" fill="rgb(253,135,27)" fg:x="43054" fg:w="12"/><text x="90.6673%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (1,554 samples, 3.26%)</title><rect x="87.1810%" y="1445" width="3.2635%" height="15" fill="rgb(211,122,29)" fg:x="41513" fg:w="1554"/><text x="87.4310%" y="1455.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (1,554 samples, 3.26%)</title><rect x="87.1810%" y="1429" width="3.2635%" height="15" fill="rgb(233,162,40)" fg:x="41513" fg:w="1554"/><text x="87.4310%" y="1439.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (1,525 samples, 3.20%)</title><rect x="87.2420%" y="1413" width="3.2026%" height="15" fill="rgb(222,184,47)" fg:x="41542" fg:w="1525"/><text x="87.4920%" y="1423.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (380 samples, 0.80%)</title><rect x="89.6466%" y="1397" width="0.7980%" height="15" fill="rgb(249,99,23)" fg:x="42687" fg:w="380"/><text x="89.8966%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (375 samples, 0.79%)</title><rect x="89.6571%" y="1381" width="0.7875%" height="15" fill="rgb(214,60,12)" fg:x="42692" fg:w="375"/><text x="89.9071%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (374 samples, 0.79%)</title><rect x="89.6592%" y="1365" width="0.7854%" height="15" fill="rgb(250,229,36)" fg:x="42693" fg:w="374"/><text x="89.9092%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (363 samples, 0.76%)</title><rect x="89.6823%" y="1349" width="0.7623%" height="15" fill="rgb(232,195,10)" fg:x="42704" fg:w="363"/><text x="89.9323%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (103 samples, 0.22%)</title><rect x="90.2283%" y="1333" width="0.2163%" height="15" fill="rgb(205,213,31)" fg:x="42964" fg:w="103"/><text x="90.4783%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7,610 samples, 15.98%)</title><rect x="74.4671%" y="1493" width="15.9817%" height="15" fill="rgb(237,43,8)" fg:x="35459" fg:w="7610"/><text x="74.7171%" y="1503.50">sqlparser_bench-959bc5267..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7,579 samples, 15.92%)</title><rect x="74.5322%" y="1477" width="15.9166%" height="15" fill="rgb(216,208,3)" fg:x="35490" fg:w="7579"/><text x="74.7822%" y="1487.50">sqlparser_bench-959bc526..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (1,568 samples, 3.29%)</title><rect x="87.1558%" y="1461" width="3.2929%" height="15" fill="rgb(228,179,44)" fg:x="41501" fg:w="1568"/><text x="87.4058%" y="1471.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="90.4614%" y="1477" width="0.0126%" height="15" fill="rgb(230,192,27)" fg:x="43075" fg:w="6"/><text x="90.7114%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="90.4614%" y="1461" width="0.0126%" height="15" fill="rgb(251,30,38)" fg:x="43075" fg:w="6"/><text x="90.7114%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="90.4824%" y="1445" width="0.0105%" height="15" fill="rgb(246,55,52)" fg:x="43085" fg:w="5"/><text x="90.7324%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="90.4929%" y="1397" width="0.0168%" height="15" fill="rgb(249,79,26)" fg:x="43090" fg:w="8"/><text x="90.7429%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="90.4971%" y="1381" width="0.0126%" height="15" fill="rgb(220,202,16)" fg:x="43092" fg:w="6"/><text x="90.7471%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (12 samples, 0.03%)</title><rect x="90.4929%" y="1429" width="0.0252%" height="15" fill="rgb(250,170,23)" fg:x="43090" fg:w="12"/><text x="90.7429%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="90.4929%" y="1413" width="0.0252%" height="15" fill="rgb(230,7,37)" fg:x="43090" fg:w="12"/><text x="90.7429%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="90.5181%" y="1429" width="0.0126%" height="15" fill="rgb(213,71,1)" fg:x="43102" fg:w="6"/><text x="90.7681%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (28 samples, 0.06%)</title><rect x="90.4740%" y="1461" width="0.0588%" height="15" fill="rgb(227,87,39)" fg:x="43081" fg:w="28"/><text x="90.7240%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (19 samples, 0.04%)</title><rect x="90.4929%" y="1445" width="0.0399%" height="15" fill="rgb(210,41,29)" fg:x="43090" fg:w="19"/><text x="90.7429%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="90.5454%" y="1413" width="0.0105%" height="15" fill="rgb(206,191,31)" fg:x="43115" fg:w="5"/><text x="90.7954%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (10 samples, 0.02%)</title><rect x="90.5559%" y="1397" width="0.0210%" height="15" fill="rgb(247,75,54)" fg:x="43120" fg:w="10"/><text x="90.8059%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.5664%" y="1381" width="0.0105%" height="15" fill="rgb(208,54,50)" fg:x="43125" fg:w="5"/><text x="90.8164%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (18 samples, 0.04%)</title><rect x="90.5433%" y="1445" width="0.0378%" height="15" fill="rgb(214,90,37)" fg:x="43114" fg:w="18"/><text x="90.7933%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (18 samples, 0.04%)</title><rect x="90.5433%" y="1429" width="0.0378%" height="15" fill="rgb(220,132,6)" fg:x="43114" fg:w="18"/><text x="90.7933%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="90.5559%" y="1413" width="0.0252%" height="15" fill="rgb(213,167,7)" fg:x="43120" fg:w="12"/><text x="90.8059%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (64 samples, 0.13%)</title><rect x="90.4488%" y="1493" width="0.1344%" height="15" fill="rgb(243,36,27)" fg:x="43069" fg:w="64"/><text x="90.6988%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (52 samples, 0.11%)</title><rect x="90.4740%" y="1477" width="0.1092%" height="15" fill="rgb(235,147,12)" fg:x="43081" fg:w="52"/><text x="90.7240%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (22 samples, 0.05%)</title><rect x="90.5370%" y="1461" width="0.0462%" height="15" fill="rgb(212,198,44)" fg:x="43111" fg:w="22"/><text x="90.7870%" y="1471.50"></text></g><g><title>libsystem_m.dylib`exp (45 samples, 0.09%)</title><rect x="90.6021%" y="1269" width="0.0945%" height="15" fill="rgb(218,68,50)" fg:x="43142" fg:w="45"/><text x="90.8521%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::median_abs_dev (6 samples, 0.01%)</title><rect x="90.7008%" y="1237" width="0.0126%" height="15" fill="rgb(224,79,48)" fg:x="43189" fg:w="6"/><text x="90.9508%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (6 samples, 0.01%)</title><rect x="90.7008%" y="1221" width="0.0126%" height="15" fill="rgb(213,191,50)" fg:x="43189" fg:w="6"/><text x="90.9508%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="90.7008%" y="1205" width="0.0126%" height="15" fill="rgb(254,146,10)" fg:x="43189" fg:w="6"/><text x="90.9508%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::analysis::estimates::stats (12 samples, 0.03%)</title><rect x="90.6987%" y="1253" width="0.0252%" height="15" fill="rgb(215,175,11)" fg:x="43188" fg:w="12"/><text x="90.9487%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`criterion::stats::univariate::sample::Sample&lt;A&gt;::percentiles (5 samples, 0.01%)</title><rect x="90.7134%" y="1237" width="0.0105%" height="15" fill="rgb(207,49,7)" fg:x="43195" fg:w="5"/><text x="90.9634%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="90.7134%" y="1221" width="0.0105%" height="15" fill="rgb(234,144,29)" fg:x="43195" fg:w="5"/><text x="90.9634%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (17 samples, 0.04%)</title><rect x="90.6966%" y="1269" width="0.0357%" height="15" fill="rgb(213,222,48)" fg:x="43187" fg:w="17"/><text x="90.9466%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (71 samples, 0.15%)</title><rect x="90.5895%" y="1285" width="0.1491%" height="15" fill="rgb(222,8,6)" fg:x="43136" fg:w="71"/><text x="90.8395%" y="1295.50"></text></g><g><title>libsystem_m.dylib`exp (23 samples, 0.05%)</title><rect x="90.7533%" y="1253" width="0.0483%" height="15" fill="rgb(221,114,49)" fg:x="43214" fg:w="23"/><text x="91.0033%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (32 samples, 0.07%)</title><rect x="90.7386%" y="1285" width="0.0672%" height="15" fill="rgb(250,140,42)" fg:x="43207" fg:w="32"/><text x="90.9886%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="90.7449%" y="1269" width="0.0609%" height="15" fill="rgb(250,150,27)" fg:x="43210" fg:w="29"/><text x="90.9949%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.8247%" y="1061" width="0.0105%" height="15" fill="rgb(252,159,3)" fg:x="43248" fg:w="5"/><text x="91.0747%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="90.8247%" y="1045" width="0.0105%" height="15" fill="rgb(241,182,3)" fg:x="43248" fg:w="5"/><text x="91.0747%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="90.8184%" y="1093" width="0.0210%" height="15" fill="rgb(236,3,9)" fg:x="43245" fg:w="10"/><text x="91.0684%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="90.8247%" y="1077" width="0.0147%" height="15" fill="rgb(223,227,51)" fg:x="43248" fg:w="7"/><text x="91.0747%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="90.8142%" y="1125" width="0.0294%" height="15" fill="rgb(232,133,30)" fg:x="43243" fg:w="14"/><text x="91.0642%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="90.8163%" y="1109" width="0.0273%" height="15" fill="rgb(209,93,27)" fg:x="43244" fg:w="13"/><text x="91.0663%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="90.8478%" y="1077" width="0.0189%" height="15" fill="rgb(208,108,34)" fg:x="43259" fg:w="9"/><text x="91.0978%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.8499%" y="1061" width="0.0168%" height="15" fill="rgb(215,189,13)" fg:x="43260" fg:w="8"/><text x="91.0999%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="90.8562%" y="1045" width="0.0105%" height="15" fill="rgb(206,88,23)" fg:x="43263" fg:w="5"/><text x="91.1062%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.8562%" y="1029" width="0.0105%" height="15" fill="rgb(240,173,0)" fg:x="43263" fg:w="5"/><text x="91.1062%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (13 samples, 0.03%)</title><rect x="90.8436%" y="1125" width="0.0273%" height="15" fill="rgb(223,106,52)" fg:x="43257" fg:w="13"/><text x="91.0936%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="90.8457%" y="1109" width="0.0252%" height="15" fill="rgb(206,130,16)" fg:x="43258" fg:w="12"/><text x="91.0957%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="90.8478%" y="1093" width="0.0231%" height="15" fill="rgb(220,54,25)" fg:x="43259" fg:w="11"/><text x="91.0978%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (30 samples, 0.06%)</title><rect x="90.8121%" y="1157" width="0.0630%" height="15" fill="rgb(210,4,38)" fg:x="43242" fg:w="30"/><text x="91.0621%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (29 samples, 0.06%)</title><rect x="90.8142%" y="1141" width="0.0609%" height="15" fill="rgb(238,94,39)" fg:x="43243" fg:w="29"/><text x="91.0642%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.8877%" y="1077" width="0.0105%" height="15" fill="rgb(234,124,34)" fg:x="43278" fg:w="5"/><text x="91.1377%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="90.8793%" y="1109" width="0.0252%" height="15" fill="rgb(221,91,40)" fg:x="43274" fg:w="12"/><text x="91.1293%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="90.8856%" y="1093" width="0.0189%" height="15" fill="rgb(246,53,28)" fg:x="43277" fg:w="9"/><text x="91.1356%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="90.9066%" y="1061" width="0.0126%" height="15" fill="rgb(229,109,7)" fg:x="43287" fg:w="6"/><text x="91.1566%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (23 samples, 0.05%)</title><rect x="90.8751%" y="1157" width="0.0483%" height="15" fill="rgb(249,117,8)" fg:x="43272" fg:w="23"/><text x="91.1251%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (23 samples, 0.05%)</title><rect x="90.8751%" y="1141" width="0.0483%" height="15" fill="rgb(210,181,1)" fg:x="43272" fg:w="23"/><text x="91.1251%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="90.8793%" y="1125" width="0.0441%" height="15" fill="rgb(211,66,1)" fg:x="43274" fg:w="21"/><text x="91.1293%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (9 samples, 0.02%)</title><rect x="90.9045%" y="1109" width="0.0189%" height="15" fill="rgb(221,90,14)" fg:x="43286" fg:w="9"/><text x="91.1545%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="90.9066%" y="1093" width="0.0168%" height="15" fill="rgb(219,222,44)" fg:x="43287" fg:w="8"/><text x="91.1566%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.9066%" y="1077" width="0.0168%" height="15" fill="rgb(246,34,33)" fg:x="43287" fg:w="8"/><text x="91.1566%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.9234%" y="1093" width="0.0105%" height="15" fill="rgb(227,135,41)" fg:x="43295" fg:w="5"/><text x="91.1734%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.9234%" y="1077" width="0.0105%" height="15" fill="rgb(226,15,14)" fg:x="43295" fg:w="5"/><text x="91.1734%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (67 samples, 0.14%)</title><rect x="90.8121%" y="1189" width="0.1407%" height="15" fill="rgb(236,148,47)" fg:x="43242" fg:w="67"/><text x="91.0621%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (67 samples, 0.14%)</title><rect x="90.8121%" y="1173" width="0.1407%" height="15" fill="rgb(233,162,52)" fg:x="43242" fg:w="67"/><text x="91.0621%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="90.9234%" y="1157" width="0.0294%" height="15" fill="rgb(244,35,28)" fg:x="43295" fg:w="14"/><text x="91.1734%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="90.9234%" y="1141" width="0.0294%" height="15" fill="rgb(205,121,10)" fg:x="43295" fg:w="14"/><text x="91.1734%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="90.9234%" y="1125" width="0.0294%" height="15" fill="rgb(250,58,18)" fg:x="43295" fg:w="14"/><text x="91.1734%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="90.9234%" y="1109" width="0.0294%" height="15" fill="rgb(216,37,13)" fg:x="43295" fg:w="14"/><text x="91.1734%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (9 samples, 0.02%)</title><rect x="90.9339%" y="1093" width="0.0189%" height="15" fill="rgb(221,215,42)" fg:x="43300" fg:w="9"/><text x="91.1839%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (9 samples, 0.02%)</title><rect x="90.9339%" y="1077" width="0.0189%" height="15" fill="rgb(217,214,19)" fg:x="43300" fg:w="9"/><text x="91.1839%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="90.9339%" y="1061" width="0.0189%" height="15" fill="rgb(233,139,13)" fg:x="43300" fg:w="9"/><text x="91.1839%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="90.9339%" y="1045" width="0.0189%" height="15" fill="rgb(247,168,23)" fg:x="43300" fg:w="9"/><text x="91.1839%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="90.9360%" y="1029" width="0.0168%" height="15" fill="rgb(207,202,1)" fg:x="43301" fg:w="8"/><text x="91.1860%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="90.9360%" y="1013" width="0.0168%" height="15" fill="rgb(220,155,48)" fg:x="43301" fg:w="8"/><text x="91.1860%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="90.9360%" y="997" width="0.0168%" height="15" fill="rgb(250,43,26)" fg:x="43301" fg:w="8"/><text x="91.1860%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.9360%" y="981" width="0.0168%" height="15" fill="rgb(212,190,23)" fg:x="43301" fg:w="8"/><text x="91.1860%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="90.9423%" y="965" width="0.0105%" height="15" fill="rgb(216,39,24)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="90.9423%" y="949" width="0.0105%" height="15" fill="rgb(252,113,16)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.9423%" y="933" width="0.0105%" height="15" fill="rgb(208,113,19)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.9423%" y="917" width="0.0105%" height="15" fill="rgb(234,107,25)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.9423%" y="901" width="0.0105%" height="15" fill="rgb(234,217,51)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.9423%" y="885" width="0.0105%" height="15" fill="rgb(251,29,42)" fg:x="43304" fg:w="5"/><text x="91.1923%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.9633%" y="1077" width="0.0105%" height="15" fill="rgb(221,62,51)" fg:x="43314" fg:w="5"/><text x="91.2133%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="90.9612%" y="1109" width="0.0168%" height="15" fill="rgb(240,192,43)" fg:x="43313" fg:w="8"/><text x="91.2112%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="90.9612%" y="1093" width="0.0168%" height="15" fill="rgb(224,157,47)" fg:x="43313" fg:w="8"/><text x="91.2112%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="90.9780%" y="1109" width="0.0147%" height="15" fill="rgb(226,84,45)" fg:x="43321" fg:w="7"/><text x="91.2280%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="90.9780%" y="1093" width="0.0147%" height="15" fill="rgb(208,207,23)" fg:x="43321" fg:w="7"/><text x="91.2280%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.9822%" y="1077" width="0.0105%" height="15" fill="rgb(253,34,51)" fg:x="43323" fg:w="5"/><text x="91.2322%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="90.9927%" y="1013" width="0.0105%" height="15" fill="rgb(227,26,34)" fg:x="43328" fg:w="5"/><text x="91.2427%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="90.9927%" y="997" width="0.0105%" height="15" fill="rgb(245,75,19)" fg:x="43328" fg:w="5"/><text x="91.2427%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="90.9927%" y="1045" width="0.0252%" height="15" fill="rgb(250,191,31)" fg:x="43328" fg:w="12"/><text x="91.2427%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="90.9927%" y="1029" width="0.0252%" height="15" fill="rgb(224,11,50)" fg:x="43328" fg:w="12"/><text x="91.2427%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="91.0032%" y="1013" width="0.0147%" height="15" fill="rgb(231,171,7)" fg:x="43333" fg:w="7"/><text x="91.2532%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.0032%" y="997" width="0.0147%" height="15" fill="rgb(252,214,10)" fg:x="43333" fg:w="7"/><text x="91.2532%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.0032%" y="981" width="0.0147%" height="15" fill="rgb(249,45,46)" fg:x="43333" fg:w="7"/><text x="91.2532%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (29 samples, 0.06%)</title><rect x="90.9591%" y="1141" width="0.0609%" height="15" fill="rgb(240,173,7)" fg:x="43312" fg:w="29"/><text x="91.2091%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (28 samples, 0.06%)</title><rect x="90.9612%" y="1125" width="0.0588%" height="15" fill="rgb(235,214,13)" fg:x="43313" fg:w="28"/><text x="91.2112%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="90.9927%" y="1109" width="0.0273%" height="15" fill="rgb(245,156,8)" fg:x="43328" fg:w="13"/><text x="91.2427%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (13 samples, 0.03%)</title><rect x="90.9927%" y="1093" width="0.0273%" height="15" fill="rgb(235,46,12)" fg:x="43328" fg:w="13"/><text x="91.2427%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="90.9927%" y="1077" width="0.0273%" height="15" fill="rgb(221,81,14)" fg:x="43328" fg:w="13"/><text x="91.2427%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="90.9927%" y="1061" width="0.0273%" height="15" fill="rgb(238,207,9)" fg:x="43328" fg:w="13"/><text x="91.2427%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="91.0200%" y="1141" width="0.0252%" height="15" fill="rgb(224,129,35)" fg:x="43341" fg:w="12"/><text x="91.2700%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="91.0200%" y="1125" width="0.0252%" height="15" fill="rgb(243,218,34)" fg:x="43341" fg:w="12"/><text x="91.2700%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="91.0263%" y="1109" width="0.0189%" height="15" fill="rgb(220,166,13)" fg:x="43344" fg:w="9"/><text x="91.2763%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="91.0347%" y="1093" width="0.0105%" height="15" fill="rgb(227,167,49)" fg:x="43348" fg:w="5"/><text x="91.2847%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.0347%" y="1077" width="0.0105%" height="15" fill="rgb(234,142,12)" fg:x="43348" fg:w="5"/><text x="91.2847%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.0347%" y="1061" width="0.0105%" height="15" fill="rgb(207,100,48)" fg:x="43348" fg:w="5"/><text x="91.2847%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (52 samples, 0.11%)</title><rect x="90.9528%" y="1189" width="0.1092%" height="15" fill="rgb(210,25,14)" fg:x="43309" fg:w="52"/><text x="91.2028%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (52 samples, 0.11%)</title><rect x="90.9528%" y="1173" width="0.1092%" height="15" fill="rgb(246,116,27)" fg:x="43309" fg:w="52"/><text x="91.2028%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (49 samples, 0.10%)</title><rect x="90.9591%" y="1157" width="0.1029%" height="15" fill="rgb(214,193,42)" fg:x="43312" fg:w="49"/><text x="91.2091%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="91.0452%" y="1141" width="0.0168%" height="15" fill="rgb(214,122,8)" fg:x="43353" fg:w="8"/><text x="91.2952%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="91.0452%" y="1125" width="0.0168%" height="15" fill="rgb(244,173,18)" fg:x="43353" fg:w="8"/><text x="91.2952%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="91.0452%" y="1109" width="0.0168%" height="15" fill="rgb(232,68,19)" fg:x="43353" fg:w="8"/><text x="91.2952%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="91.0452%" y="1093" width="0.0168%" height="15" fill="rgb(236,224,1)" fg:x="43353" fg:w="8"/><text x="91.2952%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.0620%" y="1093" width="0.0126%" height="15" fill="rgb(240,11,8)" fg:x="43361" fg:w="6"/><text x="91.3120%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.0620%" y="1077" width="0.0126%" height="15" fill="rgb(244,159,20)" fg:x="43361" fg:w="6"/><text x="91.3120%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="91.0620%" y="1125" width="0.0168%" height="15" fill="rgb(240,223,54)" fg:x="43361" fg:w="8"/><text x="91.3120%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="91.0620%" y="1109" width="0.0168%" height="15" fill="rgb(237,146,5)" fg:x="43361" fg:w="8"/><text x="91.3120%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (133 samples, 0.28%)</title><rect x="90.8079%" y="1221" width="0.2793%" height="15" fill="rgb(218,221,32)" fg:x="43240" fg:w="133"/><text x="91.0579%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (132 samples, 0.28%)</title><rect x="90.8100%" y="1205" width="0.2772%" height="15" fill="rgb(244,96,26)" fg:x="43241" fg:w="132"/><text x="91.0600%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (12 samples, 0.03%)</title><rect x="91.0620%" y="1189" width="0.0252%" height="15" fill="rgb(245,184,37)" fg:x="43361" fg:w="12"/><text x="91.3120%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="91.0620%" y="1173" width="0.0252%" height="15" fill="rgb(248,91,47)" fg:x="43361" fg:w="12"/><text x="91.3120%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="91.0620%" y="1157" width="0.0252%" height="15" fill="rgb(243,199,8)" fg:x="43361" fg:w="12"/><text x="91.3120%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="91.0620%" y="1141" width="0.0252%" height="15" fill="rgb(249,12,15)" fg:x="43361" fg:w="12"/><text x="91.3120%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (13 samples, 0.03%)</title><rect x="91.0872%" y="1173" width="0.0273%" height="15" fill="rgb(245,97,12)" fg:x="43373" fg:w="13"/><text x="91.3372%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="91.0893%" y="1157" width="0.0252%" height="15" fill="rgb(244,61,1)" fg:x="43374" fg:w="12"/><text x="91.3393%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="91.0998%" y="1141" width="0.0147%" height="15" fill="rgb(222,194,10)" fg:x="43379" fg:w="7"/><text x="91.3498%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="91.0998%" y="1125" width="0.0147%" height="15" fill="rgb(226,178,8)" fg:x="43379" fg:w="7"/><text x="91.3498%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.0998%" y="1109" width="0.0147%" height="15" fill="rgb(241,32,34)" fg:x="43379" fg:w="7"/><text x="91.3498%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.0998%" y="1093" width="0.0147%" height="15" fill="rgb(254,26,6)" fg:x="43379" fg:w="7"/><text x="91.3498%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.1019%" y="1077" width="0.0126%" height="15" fill="rgb(249,71,11)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.1019%" y="1061" width="0.0126%" height="15" fill="rgb(232,170,27)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1019%" y="1045" width="0.0126%" height="15" fill="rgb(214,223,17)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1019%" y="1029" width="0.0126%" height="15" fill="rgb(250,18,15)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="91.1019%" y="1013" width="0.0126%" height="15" fill="rgb(212,153,51)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1019%" y="997" width="0.0126%" height="15" fill="rgb(219,194,12)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1019%" y="981" width="0.0126%" height="15" fill="rgb(212,58,17)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.1019%" y="965" width="0.0126%" height="15" fill="rgb(254,5,10)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.1019%" y="949" width="0.0126%" height="15" fill="rgb(246,91,7)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1019%" y="933" width="0.0126%" height="15" fill="rgb(218,108,49)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1019%" y="917" width="0.0126%" height="15" fill="rgb(238,123,20)" fg:x="43380" fg:w="6"/><text x="91.3519%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="91.1145%" y="1173" width="0.0105%" height="15" fill="rgb(231,69,23)" fg:x="43386" fg:w="5"/><text x="91.3645%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.1145%" y="1157" width="0.0105%" height="15" fill="rgb(230,209,3)" fg:x="43386" fg:w="5"/><text x="91.3645%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.1145%" y="1141" width="0.0105%" height="15" fill="rgb(231,19,0)" fg:x="43386" fg:w="5"/><text x="91.3645%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (25 samples, 0.05%)</title><rect x="91.0872%" y="1221" width="0.0525%" height="15" fill="rgb(226,192,25)" fg:x="43373" fg:w="25"/><text x="91.3372%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (25 samples, 0.05%)</title><rect x="91.0872%" y="1205" width="0.0525%" height="15" fill="rgb(223,175,53)" fg:x="43373" fg:w="25"/><text x="91.3372%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="91.0872%" y="1189" width="0.0525%" height="15" fill="rgb(248,35,51)" fg:x="43373" fg:w="25"/><text x="91.3372%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="91.1250%" y="1173" width="0.0147%" height="15" fill="rgb(230,37,26)" fg:x="43391" fg:w="7"/><text x="91.3750%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="91.1250%" y="1157" width="0.0147%" height="15" fill="rgb(206,120,22)" fg:x="43391" fg:w="7"/><text x="91.3750%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.1250%" y="1141" width="0.0147%" height="15" fill="rgb(207,165,28)" fg:x="43391" fg:w="7"/><text x="91.3750%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1271%" y="1125" width="0.0126%" height="15" fill="rgb(226,23,46)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1271%" y="1109" width="0.0126%" height="15" fill="rgb(208,130,44)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1271%" y="1093" width="0.0126%" height="15" fill="rgb(231,67,8)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1271%" y="1077" width="0.0126%" height="15" fill="rgb(205,183,22)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1271%" y="1061" width="0.0126%" height="15" fill="rgb(224,47,9)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1271%" y="1045" width="0.0126%" height="15" fill="rgb(250,183,49)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1271%" y="1029" width="0.0126%" height="15" fill="rgb(220,151,39)" fg:x="43392" fg:w="6"/><text x="91.3771%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.1439%" y="1125" width="0.0147%" height="15" fill="rgb(220,118,20)" fg:x="43400" fg:w="7"/><text x="91.3939%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.1460%" y="1109" width="0.0126%" height="15" fill="rgb(231,65,51)" fg:x="43401" fg:w="6"/><text x="91.3960%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="91.1586%" y="1125" width="0.0126%" height="15" fill="rgb(253,125,37)" fg:x="43407" fg:w="6"/><text x="91.4086%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.1586%" y="1109" width="0.0126%" height="15" fill="rgb(232,102,6)" fg:x="43407" fg:w="6"/><text x="91.4086%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (17 samples, 0.04%)</title><rect x="91.1418%" y="1157" width="0.0357%" height="15" fill="rgb(251,105,13)" fg:x="43399" fg:w="17"/><text x="91.3918%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (16 samples, 0.03%)</title><rect x="91.1439%" y="1141" width="0.0336%" height="15" fill="rgb(222,179,29)" fg:x="43400" fg:w="16"/><text x="91.3939%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.1859%" y="981" width="0.0105%" height="15" fill="rgb(229,180,53)" fg:x="43420" fg:w="5"/><text x="91.4359%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.1859%" y="965" width="0.0105%" height="15" fill="rgb(238,104,13)" fg:x="43420" fg:w="5"/><text x="91.4359%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (11 samples, 0.02%)</title><rect x="91.1775%" y="1157" width="0.0231%" height="15" fill="rgb(210,130,5)" fg:x="43416" fg:w="11"/><text x="91.4275%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="91.1775%" y="1141" width="0.0231%" height="15" fill="rgb(233,87,49)" fg:x="43416" fg:w="11"/><text x="91.4275%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="91.1775%" y="1125" width="0.0231%" height="15" fill="rgb(243,34,9)" fg:x="43416" fg:w="11"/><text x="91.4275%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8 samples, 0.02%)</title><rect x="91.1838%" y="1109" width="0.0168%" height="15" fill="rgb(235,225,10)" fg:x="43419" fg:w="8"/><text x="91.4338%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8 samples, 0.02%)</title><rect x="91.1838%" y="1093" width="0.0168%" height="15" fill="rgb(212,0,30)" fg:x="43419" fg:w="8"/><text x="91.4338%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="91.1838%" y="1077" width="0.0168%" height="15" fill="rgb(211,177,0)" fg:x="43419" fg:w="8"/><text x="91.4338%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="91.1838%" y="1061" width="0.0168%" height="15" fill="rgb(225,220,11)" fg:x="43419" fg:w="8"/><text x="91.4338%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="91.1859%" y="1045" width="0.0147%" height="15" fill="rgb(215,10,13)" fg:x="43420" fg:w="7"/><text x="91.4359%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="91.1859%" y="1029" width="0.0147%" height="15" fill="rgb(240,177,14)" fg:x="43420" fg:w="7"/><text x="91.4359%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.1859%" y="1013" width="0.0147%" height="15" fill="rgb(243,7,39)" fg:x="43420" fg:w="7"/><text x="91.4359%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.1859%" y="997" width="0.0147%" height="15" fill="rgb(212,99,0)" fg:x="43420" fg:w="7"/><text x="91.4359%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (193 samples, 0.41%)</title><rect x="90.8058%" y="1285" width="0.4053%" height="15" fill="rgb(225,162,48)" fg:x="43239" fg:w="193"/><text x="91.0558%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (193 samples, 0.41%)</title><rect x="90.8058%" y="1269" width="0.4053%" height="15" fill="rgb(246,16,25)" fg:x="43239" fg:w="193"/><text x="91.0558%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (193 samples, 0.41%)</title><rect x="90.8058%" y="1253" width="0.4053%" height="15" fill="rgb(220,150,2)" fg:x="43239" fg:w="193"/><text x="91.0558%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (192 samples, 0.40%)</title><rect x="90.8079%" y="1237" width="0.4032%" height="15" fill="rgb(237,113,11)" fg:x="43240" fg:w="192"/><text x="91.0579%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (34 samples, 0.07%)</title><rect x="91.1397%" y="1221" width="0.0714%" height="15" fill="rgb(236,70,20)" fg:x="43398" fg:w="34"/><text x="91.3897%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (34 samples, 0.07%)</title><rect x="91.1397%" y="1205" width="0.0714%" height="15" fill="rgb(234,94,7)" fg:x="43398" fg:w="34"/><text x="91.3897%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="91.1397%" y="1189" width="0.0714%" height="15" fill="rgb(250,221,0)" fg:x="43398" fg:w="34"/><text x="91.3897%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (33 samples, 0.07%)</title><rect x="91.1418%" y="1173" width="0.0693%" height="15" fill="rgb(245,149,46)" fg:x="43399" fg:w="33"/><text x="91.3918%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="91.2006%" y="1157" width="0.0105%" height="15" fill="rgb(215,37,27)" fg:x="43427" fg:w="5"/><text x="91.4506%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="91.2006%" y="1141" width="0.0105%" height="15" fill="rgb(232,65,3)" fg:x="43427" fg:w="5"/><text x="91.4506%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.2006%" y="1125" width="0.0105%" height="15" fill="rgb(214,2,16)" fg:x="43427" fg:w="5"/><text x="91.4506%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.2006%" y="1109" width="0.0105%" height="15" fill="rgb(227,131,50)" fg:x="43427" fg:w="5"/><text x="91.4506%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (298 samples, 0.63%)</title><rect x="90.5874%" y="1317" width="0.6258%" height="15" fill="rgb(247,131,45)" fg:x="43135" fg:w="298"/><text x="90.8374%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (298 samples, 0.63%)</title><rect x="90.5874%" y="1301" width="0.6258%" height="15" fill="rgb(215,97,47)" fg:x="43135" fg:w="298"/><text x="90.8374%" y="1311.50"></text></g><g><title>libsystem_m.dylib`exp (13 samples, 0.03%)</title><rect x="91.2216%" y="1253" width="0.0273%" height="15" fill="rgb(233,143,12)" fg:x="43437" fg:w="13"/><text x="91.4716%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="91.2132%" y="1269" width="0.0399%" height="15" fill="rgb(222,57,17)" fg:x="43433" fg:w="19"/><text x="91.4632%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="91.2531%" y="1269" width="0.0252%" height="15" fill="rgb(214,119,38)" fg:x="43452" fg:w="12"/><text x="91.5031%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="91.2594%" y="1253" width="0.0189%" height="15" fill="rgb(217,28,47)" fg:x="43455" fg:w="9"/><text x="91.5094%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (38 samples, 0.08%)</title><rect x="91.2132%" y="1317" width="0.0798%" height="15" fill="rgb(231,14,52)" fg:x="43433" fg:w="38"/><text x="91.4632%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (38 samples, 0.08%)</title><rect x="91.2132%" y="1301" width="0.0798%" height="15" fill="rgb(220,158,18)" fg:x="43433" fg:w="38"/><text x="91.4632%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (38 samples, 0.08%)</title><rect x="91.2132%" y="1285" width="0.0798%" height="15" fill="rgb(222,143,46)" fg:x="43433" fg:w="38"/><text x="91.4632%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="91.2783%" y="1269" width="0.0147%" height="15" fill="rgb(227,165,5)" fg:x="43464" fg:w="7"/><text x="91.5283%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="91.2783%" y="1253" width="0.0147%" height="15" fill="rgb(216,222,49)" fg:x="43464" fg:w="7"/><text x="91.5283%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.2783%" y="1237" width="0.0147%" height="15" fill="rgb(238,73,39)" fg:x="43464" fg:w="7"/><text x="91.5283%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.2783%" y="1221" width="0.0147%" height="15" fill="rgb(252,115,9)" fg:x="43464" fg:w="7"/><text x="91.5283%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.2804%" y="1205" width="0.0126%" height="15" fill="rgb(238,202,4)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.2804%" y="1189" width="0.0126%" height="15" fill="rgb(252,153,44)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.2804%" y="1173" width="0.0126%" height="15" fill="rgb(235,128,27)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.2804%" y="1157" width="0.0126%" height="15" fill="rgb(221,121,47)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.2804%" y="1141" width="0.0126%" height="15" fill="rgb(247,211,47)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.2804%" y="1125" width="0.0126%" height="15" fill="rgb(252,47,49)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.2804%" y="1109" width="0.0126%" height="15" fill="rgb(219,119,53)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.2804%" y="1093" width="0.0126%" height="15" fill="rgb(243,165,53)" fg:x="43465" fg:w="6"/><text x="91.5304%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.3077%" y="1125" width="0.0105%" height="15" fill="rgb(230,12,35)" fg:x="43478" fg:w="5"/><text x="91.5577%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.3077%" y="1109" width="0.0105%" height="15" fill="rgb(239,57,49)" fg:x="43478" fg:w="5"/><text x="91.5577%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.3077%" y="1093" width="0.0105%" height="15" fill="rgb(231,154,7)" fg:x="43478" fg:w="5"/><text x="91.5577%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon::iter::fold::FoldFolder&lt;C,ID,F&gt; as rayon::iter::plumbing::Folder&lt;T&gt;&gt;::consume_iter (5 samples, 0.01%)</title><rect x="91.3077%" y="1077" width="0.0105%" height="15" fill="rgb(248,81,34)" fg:x="43478" fg:w="5"/><text x="91.5577%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.3077%" y="1157" width="0.0126%" height="15" fill="rgb(247,9,5)" fg:x="43478" fg:w="6"/><text x="91.5577%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.3077%" y="1141" width="0.0126%" height="15" fill="rgb(228,172,27)" fg:x="43478" fg:w="6"/><text x="91.5577%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="91.3014%" y="1189" width="0.0315%" height="15" fill="rgb(230,57,44)" fg:x="43475" fg:w="15"/><text x="91.5514%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="91.3077%" y="1173" width="0.0252%" height="15" fill="rgb(249,35,22)" fg:x="43478" fg:w="12"/><text x="91.5577%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="91.3203%" y="1157" width="0.0126%" height="15" fill="rgb(250,137,27)" fg:x="43484" fg:w="6"/><text x="91.5703%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.3224%" y="1141" width="0.0105%" height="15" fill="rgb(251,57,31)" fg:x="43485" fg:w="5"/><text x="91.5724%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.3224%" y="1125" width="0.0105%" height="15" fill="rgb(238,60,0)" fg:x="43485" fg:w="5"/><text x="91.5724%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (26 samples, 0.05%)</title><rect x="91.2993%" y="1221" width="0.0546%" height="15" fill="rgb(242,185,39)" fg:x="43474" fg:w="26"/><text x="91.5493%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (25 samples, 0.05%)</title><rect x="91.3014%" y="1205" width="0.0525%" height="15" fill="rgb(240,63,43)" fg:x="43475" fg:w="25"/><text x="91.5514%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (10 samples, 0.02%)</title><rect x="91.3329%" y="1189" width="0.0210%" height="15" fill="rgb(236,155,6)" fg:x="43490" fg:w="10"/><text x="91.5829%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="91.3329%" y="1173" width="0.0210%" height="15" fill="rgb(215,11,29)" fg:x="43490" fg:w="10"/><text x="91.5829%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.3413%" y="1157" width="0.0126%" height="15" fill="rgb(228,180,48)" fg:x="43494" fg:w="6"/><text x="91.5913%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="91.3539%" y="1173" width="0.0210%" height="15" fill="rgb(241,102,12)" fg:x="43500" fg:w="10"/><text x="91.6039%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.3602%" y="1157" width="0.0147%" height="15" fill="rgb(246,213,4)" fg:x="43503" fg:w="7"/><text x="91.6102%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (5 samples, 0.01%)</title><rect x="91.3749%" y="1173" width="0.0105%" height="15" fill="rgb(218,134,35)" fg:x="43510" fg:w="5"/><text x="91.6249%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.3749%" y="1157" width="0.0105%" height="15" fill="rgb(251,117,35)" fg:x="43510" fg:w="5"/><text x="91.6249%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (18 samples, 0.04%)</title><rect x="91.3539%" y="1221" width="0.0378%" height="15" fill="rgb(206,156,45)" fg:x="43500" fg:w="18"/><text x="91.6039%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (18 samples, 0.04%)</title><rect x="91.3539%" y="1205" width="0.0378%" height="15" fill="rgb(218,52,27)" fg:x="43500" fg:w="18"/><text x="91.6039%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="91.3539%" y="1189" width="0.0378%" height="15" fill="rgb(238,83,36)" fg:x="43500" fg:w="18"/><text x="91.6039%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (7 samples, 0.01%)</title><rect x="91.4022%" y="1157" width="0.0147%" height="15" fill="rgb(218,53,43)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.4022%" y="1141" width="0.0147%" height="15" fill="rgb(239,54,39)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.4022%" y="1125" width="0.0147%" height="15" fill="rgb(212,198,13)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (7 samples, 0.01%)</title><rect x="91.4022%" y="1109" width="0.0147%" height="15" fill="rgb(234,54,46)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (7 samples, 0.01%)</title><rect x="91.4022%" y="1093" width="0.0147%" height="15" fill="rgb(217,120,7)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.4022%" y="1077" width="0.0147%" height="15" fill="rgb(246,39,15)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.4022%" y="1061" width="0.0147%" height="15" fill="rgb(242,143,31)" fg:x="43523" fg:w="7"/><text x="91.6522%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (59 samples, 0.12%)</title><rect x="91.2951%" y="1253" width="0.1239%" height="15" fill="rgb(252,60,24)" fg:x="43472" fg:w="59"/><text x="91.5451%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (57 samples, 0.12%)</title><rect x="91.2993%" y="1237" width="0.1197%" height="15" fill="rgb(249,220,7)" fg:x="43474" fg:w="57"/><text x="91.5493%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (13 samples, 0.03%)</title><rect x="91.3917%" y="1221" width="0.0273%" height="15" fill="rgb(236,67,13)" fg:x="43518" fg:w="13"/><text x="91.6417%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (12 samples, 0.03%)</title><rect x="91.3938%" y="1205" width="0.0252%" height="15" fill="rgb(210,62,39)" fg:x="43519" fg:w="12"/><text x="91.6438%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="91.3938%" y="1189" width="0.0252%" height="15" fill="rgb(219,122,53)" fg:x="43519" fg:w="12"/><text x="91.6438%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="91.3959%" y="1173" width="0.0231%" height="15" fill="rgb(218,87,25)" fg:x="43520" fg:w="11"/><text x="91.6459%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="91.4316%" y="1205" width="0.0168%" height="15" fill="rgb(234,179,48)" fg:x="43537" fg:w="8"/><text x="91.6816%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (8 samples, 0.02%)</title><rect x="91.4316%" y="1189" width="0.0168%" height="15" fill="rgb(248,90,0)" fg:x="43537" fg:w="8"/><text x="91.6816%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.4337%" y="1173" width="0.0147%" height="15" fill="rgb(207,228,37)" fg:x="43538" fg:w="7"/><text x="91.6837%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (16 samples, 0.03%)</title><rect x="91.4190%" y="1253" width="0.0336%" height="15" fill="rgb(235,214,15)" fg:x="43531" fg:w="16"/><text x="91.6690%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="91.4211%" y="1237" width="0.0315%" height="15" fill="rgb(210,144,39)" fg:x="43532" fg:w="15"/><text x="91.6711%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="91.4232%" y="1221" width="0.0294%" height="15" fill="rgb(222,67,41)" fg:x="43533" fg:w="14"/><text x="91.6732%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.4610%" y="1125" width="0.0105%" height="15" fill="rgb(205,35,37)" fg:x="43551" fg:w="5"/><text x="91.7110%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.4589%" y="1157" width="0.0147%" height="15" fill="rgb(216,125,40)" fg:x="43550" fg:w="7"/><text x="91.7089%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.4610%" y="1141" width="0.0126%" height="15" fill="rgb(228,227,20)" fg:x="43551" fg:w="6"/><text x="91.7110%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="91.4568%" y="1189" width="0.0231%" height="15" fill="rgb(242,173,45)" fg:x="43549" fg:w="11"/><text x="91.7068%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="91.4589%" y="1173" width="0.0210%" height="15" fill="rgb(215,79,24)" fg:x="43550" fg:w="10"/><text x="91.7089%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.4925%" y="837" width="0.0105%" height="15" fill="rgb(238,164,38)" fg:x="43566" fg:w="5"/><text x="91.7425%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.4925%" y="821" width="0.0105%" height="15" fill="rgb(245,196,38)" fg:x="43566" fg:w="5"/><text x="91.7425%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (10 samples, 0.02%)</title><rect x="91.4925%" y="869" width="0.0210%" height="15" fill="rgb(231,217,29)" fg:x="43566" fg:w="10"/><text x="91.7425%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (10 samples, 0.02%)</title><rect x="91.4925%" y="853" width="0.0210%" height="15" fill="rgb(245,6,4)" fg:x="43566" fg:w="10"/><text x="91.7425%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="91.5030%" y="837" width="0.0105%" height="15" fill="rgb(214,76,49)" fg:x="43571" fg:w="5"/><text x="91.7530%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (5 samples, 0.01%)</title><rect x="91.5030%" y="821" width="0.0105%" height="15" fill="rgb(205,96,12)" fg:x="43571" fg:w="5"/><text x="91.7530%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.5030%" y="805" width="0.0105%" height="15" fill="rgb(243,131,4)" fg:x="43571" fg:w="5"/><text x="91.7530%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.5030%" y="789" width="0.0105%" height="15" fill="rgb(214,114,4)" fg:x="43571" fg:w="5"/><text x="91.7530%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (15 samples, 0.03%)</title><rect x="91.4841%" y="1141" width="0.0315%" height="15" fill="rgb(234,215,15)" fg:x="43562" fg:w="15"/><text x="91.7341%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (15 samples, 0.03%)</title><rect x="91.4841%" y="1125" width="0.0315%" height="15" fill="rgb(250,216,45)" fg:x="43562" fg:w="15"/><text x="91.7341%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (15 samples, 0.03%)</title><rect x="91.4841%" y="1109" width="0.0315%" height="15" fill="rgb(236,128,4)" fg:x="43562" fg:w="15"/><text x="91.7341%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (14 samples, 0.03%)</title><rect x="91.4862%" y="1093" width="0.0294%" height="15" fill="rgb(234,50,33)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="91.4862%" y="1077" width="0.0294%" height="15" fill="rgb(253,131,37)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="91.4862%" y="1061" width="0.0294%" height="15" fill="rgb(218,55,27)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (14 samples, 0.03%)</title><rect x="91.4862%" y="1045" width="0.0294%" height="15" fill="rgb(241,220,28)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (14 samples, 0.03%)</title><rect x="91.4862%" y="1029" width="0.0294%" height="15" fill="rgb(241,90,48)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="91.4862%" y="1013" width="0.0294%" height="15" fill="rgb(216,43,37)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (14 samples, 0.03%)</title><rect x="91.4862%" y="997" width="0.0294%" height="15" fill="rgb(207,173,9)" fg:x="43563" fg:w="14"/><text x="91.7362%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="91.4904%" y="981" width="0.0252%" height="15" fill="rgb(240,126,30)" fg:x="43565" fg:w="12"/><text x="91.7404%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="91.4904%" y="965" width="0.0252%" height="15" fill="rgb(228,178,53)" fg:x="43565" fg:w="12"/><text x="91.7404%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="91.4904%" y="949" width="0.0252%" height="15" fill="rgb(217,33,4)" fg:x="43565" fg:w="12"/><text x="91.7404%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (11 samples, 0.02%)</title><rect x="91.4925%" y="933" width="0.0231%" height="15" fill="rgb(206,124,34)" fg:x="43566" fg:w="11"/><text x="91.7425%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (11 samples, 0.02%)</title><rect x="91.4925%" y="917" width="0.0231%" height="15" fill="rgb(208,122,53)" fg:x="43566" fg:w="11"/><text x="91.7425%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (11 samples, 0.02%)</title><rect x="91.4925%" y="901" width="0.0231%" height="15" fill="rgb(215,202,26)" fg:x="43566" fg:w="11"/><text x="91.7425%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (11 samples, 0.02%)</title><rect x="91.4925%" y="885" width="0.0231%" height="15" fill="rgb(232,198,31)" fg:x="43566" fg:w="11"/><text x="91.7425%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (21 samples, 0.04%)</title><rect x="91.4799%" y="1189" width="0.0441%" height="15" fill="rgb(222,23,35)" fg:x="43560" fg:w="21"/><text x="91.7299%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="91.4799%" y="1173" width="0.0441%" height="15" fill="rgb(242,27,53)" fg:x="43560" fg:w="21"/><text x="91.7299%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (20 samples, 0.04%)</title><rect x="91.4820%" y="1157" width="0.0420%" height="15" fill="rgb(210,216,42)" fg:x="43561" fg:w="20"/><text x="91.7320%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (116 samples, 0.24%)</title><rect x="91.2930%" y="1317" width="0.2436%" height="15" fill="rgb(234,39,38)" fg:x="43471" fg:w="116"/><text x="91.5430%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (116 samples, 0.24%)</title><rect x="91.2930%" y="1301" width="0.2436%" height="15" fill="rgb(235,126,54)" fg:x="43471" fg:w="116"/><text x="91.5430%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (116 samples, 0.24%)</title><rect x="91.2930%" y="1285" width="0.2436%" height="15" fill="rgb(235,150,33)" fg:x="43471" fg:w="116"/><text x="91.5430%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (116 samples, 0.24%)</title><rect x="91.2930%" y="1269" width="0.2436%" height="15" fill="rgb(249,49,53)" fg:x="43471" fg:w="116"/><text x="91.5430%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (40 samples, 0.08%)</title><rect x="91.4526%" y="1253" width="0.0840%" height="15" fill="rgb(238,60,50)" fg:x="43547" fg:w="40"/><text x="91.7026%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (40 samples, 0.08%)</title><rect x="91.4526%" y="1237" width="0.0840%" height="15" fill="rgb(210,5,2)" fg:x="43547" fg:w="40"/><text x="91.7026%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (40 samples, 0.08%)</title><rect x="91.4526%" y="1221" width="0.0840%" height="15" fill="rgb(214,207,24)" fg:x="43547" fg:w="40"/><text x="91.7026%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (39 samples, 0.08%)</title><rect x="91.4547%" y="1205" width="0.0819%" height="15" fill="rgb(228,173,2)" fg:x="43548" fg:w="39"/><text x="91.7047%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.5240%" y="1189" width="0.0126%" height="15" fill="rgb(244,26,8)" fg:x="43581" fg:w="6"/><text x="91.7740%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.5240%" y="1173" width="0.0126%" height="15" fill="rgb(249,153,35)" fg:x="43581" fg:w="6"/><text x="91.7740%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.5240%" y="1157" width="0.0126%" height="15" fill="rgb(221,215,40)" fg:x="43581" fg:w="6"/><text x="91.7740%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.5240%" y="1141" width="0.0126%" height="15" fill="rgb(238,106,35)" fg:x="43581" fg:w="6"/><text x="91.7740%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.5240%" y="1125" width="0.0126%" height="15" fill="rgb(207,195,21)" fg:x="43581" fg:w="6"/><text x="91.7740%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.5261%" y="1109" width="0.0105%" height="15" fill="rgb(205,43,29)" fg:x="43582" fg:w="5"/><text x="91.7761%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (453 samples, 0.95%)</title><rect x="90.5874%" y="1349" width="0.9513%" height="15" fill="rgb(236,35,21)" fg:x="43135" fg:w="453"/><text x="90.8374%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (453 samples, 0.95%)</title><rect x="90.5874%" y="1333" width="0.9513%" height="15" fill="rgb(244,74,8)" fg:x="43135" fg:w="453"/><text x="90.8374%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.5387%" y="1269" width="0.0105%" height="15" fill="rgb(241,229,7)" fg:x="43588" fg:w="5"/><text x="91.7887%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (9 samples, 0.02%)</title><rect x="91.5387%" y="1301" width="0.0189%" height="15" fill="rgb(212,223,25)" fg:x="43588" fg:w="9"/><text x="91.7887%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (9 samples, 0.02%)</title><rect x="91.5387%" y="1285" width="0.0189%" height="15" fill="rgb(234,58,53)" fg:x="43588" fg:w="9"/><text x="91.7887%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.5576%" y="1253" width="0.0126%" height="15" fill="rgb(244,36,1)" fg:x="43597" fg:w="6"/><text x="91.8076%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (21 samples, 0.04%)</title><rect x="91.5387%" y="1349" width="0.0441%" height="15" fill="rgb(222,40,54)" fg:x="43588" fg:w="21"/><text x="91.7887%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (21 samples, 0.04%)</title><rect x="91.5387%" y="1333" width="0.0441%" height="15" fill="rgb(210,207,39)" fg:x="43588" fg:w="21"/><text x="91.7887%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (21 samples, 0.04%)</title><rect x="91.5387%" y="1317" width="0.0441%" height="15" fill="rgb(234,52,14)" fg:x="43588" fg:w="21"/><text x="91.7887%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (12 samples, 0.03%)</title><rect x="91.5576%" y="1301" width="0.0252%" height="15" fill="rgb(239,108,46)" fg:x="43597" fg:w="12"/><text x="91.8076%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (12 samples, 0.03%)</title><rect x="91.5576%" y="1285" width="0.0252%" height="15" fill="rgb(252,223,5)" fg:x="43597" fg:w="12"/><text x="91.8076%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (12 samples, 0.03%)</title><rect x="91.5576%" y="1269" width="0.0252%" height="15" fill="rgb(227,181,11)" fg:x="43597" fg:w="12"/><text x="91.8076%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.5912%" y="1221" width="0.0147%" height="15" fill="rgb(248,126,40)" fg:x="43613" fg:w="7"/><text x="91.8412%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.5912%" y="1205" width="0.0147%" height="15" fill="rgb(243,1,18)" fg:x="43613" fg:w="7"/><text x="91.8412%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (14 samples, 0.03%)</title><rect x="91.5891%" y="1253" width="0.0294%" height="15" fill="rgb(214,145,23)" fg:x="43612" fg:w="14"/><text x="91.8391%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (13 samples, 0.03%)</title><rect x="91.5912%" y="1237" width="0.0273%" height="15" fill="rgb(241,218,11)" fg:x="43613" fg:w="13"/><text x="91.8412%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (6 samples, 0.01%)</title><rect x="91.6059%" y="1221" width="0.0126%" height="15" fill="rgb(214,219,24)" fg:x="43620" fg:w="6"/><text x="91.8559%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.6059%" y="1205" width="0.0126%" height="15" fill="rgb(235,32,7)" fg:x="43620" fg:w="6"/><text x="91.8559%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.6080%" y="1189" width="0.0105%" height="15" fill="rgb(227,121,28)" fg:x="43621" fg:w="5"/><text x="91.8580%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (5 samples, 0.01%)</title><rect x="91.6080%" y="1173" width="0.0105%" height="15" fill="rgb(216,129,49)" fg:x="43621" fg:w="5"/><text x="91.8580%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.6080%" y="1157" width="0.0105%" height="15" fill="rgb(207,194,50)" fg:x="43621" fg:w="5"/><text x="91.8580%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (19 samples, 0.04%)</title><rect x="91.5870%" y="1285" width="0.0399%" height="15" fill="rgb(207,4,18)" fg:x="43611" fg:w="19"/><text x="91.8370%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (18 samples, 0.04%)</title><rect x="91.5891%" y="1269" width="0.0378%" height="15" fill="rgb(213,50,30)" fg:x="43612" fg:w="18"/><text x="91.8391%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::job::StackJob&lt;L,F,R&gt;::run_inline (8 samples, 0.02%)</title><rect x="91.6269%" y="1285" width="0.0168%" height="15" fill="rgb(208,77,22)" fg:x="43630" fg:w="8"/><text x="91.8769%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (7 samples, 0.01%)</title><rect x="91.6290%" y="1269" width="0.0147%" height="15" fill="rgb(244,204,34)" fg:x="43631" fg:w="7"/><text x="91.8790%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (7 samples, 0.01%)</title><rect x="91.6290%" y="1253" width="0.0147%" height="15" fill="rgb(230,20,17)" fg:x="43631" fg:w="7"/><text x="91.8790%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (509 samples, 1.07%)</title><rect x="90.5874%" y="1381" width="1.0689%" height="15" fill="rgb(237,83,15)" fg:x="43135" fg:w="509"/><text x="90.8374%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (509 samples, 1.07%)</title><rect x="90.5874%" y="1365" width="1.0689%" height="15" fill="rgb(221,109,25)" fg:x="43135" fg:w="509"/><text x="90.8374%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (35 samples, 0.07%)</title><rect x="91.5828%" y="1349" width="0.0735%" height="15" fill="rgb(205,194,52)" fg:x="43609" fg:w="35"/><text x="91.8328%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (35 samples, 0.07%)</title><rect x="91.5828%" y="1333" width="0.0735%" height="15" fill="rgb(244,173,54)" fg:x="43609" fg:w="35"/><text x="91.8328%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (34 samples, 0.07%)</title><rect x="91.5849%" y="1317" width="0.0714%" height="15" fill="rgb(227,181,18)" fg:x="43610" fg:w="34"/><text x="91.8349%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (33 samples, 0.07%)</title><rect x="91.5870%" y="1301" width="0.0693%" height="15" fill="rgb(238,36,30)" fg:x="43611" fg:w="33"/><text x="91.8370%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (6 samples, 0.01%)</title><rect x="91.6437%" y="1285" width="0.0126%" height="15" fill="rgb(254,85,0)" fg:x="43638" fg:w="6"/><text x="91.8937%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (6 samples, 0.01%)</title><rect x="91.6437%" y="1269" width="0.0126%" height="15" fill="rgb(247,63,33)" fg:x="43638" fg:w="6"/><text x="91.8937%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (6 samples, 0.01%)</title><rect x="91.6437%" y="1253" width="0.0126%" height="15" fill="rgb(220,7,54)" fg:x="43638" fg:w="6"/><text x="91.8937%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (6 samples, 0.01%)</title><rect x="91.6437%" y="1237" width="0.0126%" height="15" fill="rgb(238,227,21)" fg:x="43638" fg:w="6"/><text x="91.8937%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (514 samples, 1.08%)</title><rect x="90.5874%" y="1445" width="1.0794%" height="15" fill="rgb(237,29,31)" fg:x="43135" fg:w="514"/><text x="90.8374%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (514 samples, 1.08%)</title><rect x="90.5874%" y="1429" width="1.0794%" height="15" fill="rgb(211,21,50)" fg:x="43135" fg:w="514"/><text x="90.8374%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (514 samples, 1.08%)</title><rect x="90.5874%" y="1413" width="1.0794%" height="15" fill="rgb(239,119,2)" fg:x="43135" fg:w="514"/><text x="90.8374%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (514 samples, 1.08%)</title><rect x="90.5874%" y="1397" width="1.0794%" height="15" fill="rgb(250,2,39)" fg:x="43135" fg:w="514"/><text x="90.8374%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (5 samples, 0.01%)</title><rect x="91.6563%" y="1381" width="0.0105%" height="15" fill="rgb(244,46,53)" fg:x="43644" fg:w="5"/><text x="91.9063%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::iter::plumbing::bridge_producer_consumer::helper (517 samples, 1.09%)</title><rect x="90.5832%" y="1477" width="1.0857%" height="15" fill="rgb(209,21,19)" fg:x="43133" fg:w="517"/><text x="90.8332%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (515 samples, 1.08%)</title><rect x="90.5874%" y="1461" width="1.0815%" height="15" fill="rgb(236,145,4)" fg:x="43135" fg:w="515"/><text x="90.8374%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (6 samples, 0.01%)</title><rect x="91.6689%" y="1445" width="0.0126%" height="15" fill="rgb(220,133,36)" fg:x="43650" fg:w="6"/><text x="91.9189%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.6710%" y="1429" width="0.0105%" height="15" fill="rgb(244,18,3)" fg:x="43651" fg:w="5"/><text x="91.9210%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (5 samples, 0.01%)</title><rect x="91.6710%" y="1413" width="0.0105%" height="15" fill="rgb(232,171,48)" fg:x="43651" fg:w="5"/><text x="91.9210%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (5 samples, 0.01%)</title><rect x="91.6710%" y="1397" width="0.0105%" height="15" fill="rgb(223,223,53)" fg:x="43651" fg:w="5"/><text x="91.9210%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;rayon_core::job::StackJob&lt;L,F,R&gt; as rayon_core::job::Job&gt;::execute (8,206 samples, 17.23%)</title><rect x="74.4524%" y="1509" width="17.2333%" height="15" fill="rgb(246,92,13)" fg:x="35452" fg:w="8206"/><text x="74.7024%" y="1519.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (525 samples, 1.10%)</title><rect x="90.5832%" y="1493" width="1.1025%" height="15" fill="rgb(229,171,10)" fg:x="43133" fg:w="525"/><text x="90.8332%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon::slice::quicksort::recurse (8 samples, 0.02%)</title><rect x="91.6689%" y="1477" width="0.0168%" height="15" fill="rgb(213,131,26)" fg:x="43650" fg:w="8"/><text x="91.9189%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::join::join_context::_{{closure}} (8 samples, 0.02%)</title><rect x="91.6689%" y="1461" width="0.0168%" height="15" fill="rgb(242,87,54)" fg:x="43650" fg:w="8"/><text x="91.9189%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;core::iter::adapters::chain::Chain&lt;A,B&gt; as core::iter::traits::iterator::Iterator&gt;::try_fold (13 samples, 0.03%)</title><rect x="91.6857%" y="1493" width="0.0273%" height="15" fill="rgb(237,21,35)" fg:x="43658" fg:w="13"/><text x="91.9357%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`crossbeam_deque::deque::Stealer&lt;T&gt;::steal (11 samples, 0.02%)</title><rect x="91.6899%" y="1477" width="0.0231%" height="15" fill="rgb(253,13,47)" fg:x="43660" fg:w="11"/><text x="91.9399%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`crossbeam_epoch::default::with_handle (6 samples, 0.01%)</title><rect x="91.7004%" y="1461" width="0.0126%" height="15" fill="rgb(215,122,49)" fg:x="43665" fg:w="6"/><text x="91.9504%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::find_work (14 samples, 0.03%)</title><rect x="91.6857%" y="1509" width="0.0294%" height="15" fill="rgb(209,179,30)" fg:x="43658" fg:w="14"/><text x="91.9357%" y="1519.50"></text></g><g><title>libsystem_kernel.dylib`__psynch_cvwait (5 samples, 0.01%)</title><rect x="91.7151%" y="1493" width="0.0105%" height="15" fill="rgb(235,100,24)" fg:x="43672" fg:w="5"/><text x="91.9651%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::sleep::Sleep::sleep (8 samples, 0.02%)</title><rect x="91.7151%" y="1509" width="0.0168%" height="15" fill="rgb(209,67,24)" fg:x="43672" fg:w="8"/><text x="91.9651%" y="1519.50"></text></g><g><title>libsystem_pthread.dylib`_pthread_mutex_firstfit_lock_slow (10 samples, 0.02%)</title><rect x="91.7382%" y="1477" width="0.0210%" height="15" fill="rgb(206,74,32)" fg:x="43683" fg:w="10"/><text x="91.9882%" y="1487.50"></text></g><g><title>libsystem_kernel.dylib`__psynch_mutexwait (10 samples, 0.02%)</title><rect x="91.7382%" y="1461" width="0.0210%" height="15" fill="rgb(212,45,25)" fg:x="43683" fg:w="10"/><text x="91.9882%" y="1471.50"></text></g><g><title>libsystem_pthread.dylib`thread_start (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1621" width="17.5967%" height="15" fill="rgb(239,26,3)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1631.50">libsystem_pthread.dylib`thr..</text></g><g><title>libsystem_pthread.dylib`_pthread_start (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1605" width="17.5967%" height="15" fill="rgb(218,36,15)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1615.50">libsystem_pthread.dylib`_pt..</text></g><g><title>sqlparser_bench-959bc5267970ca34`std::sys::pal::unix::thread::Thread::new::thread_start (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1589" width="17.5967%" height="15" fill="rgb(206,108,24)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1599.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ops::function::FnOnce::call_once{{vtable.shim}} (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1573" width="17.5967%" height="15" fill="rgb(234,204,42)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1583.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`std::sys::backtrace::__rust_begin_short_backtrace (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1557" width="17.5967%" height="15" fill="rgb(229,2,11)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1567.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::ThreadBuilder::run (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1541" width="17.5967%" height="15" fill="rgb(221,20,48)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1551.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::registry::WorkerThread::wait_until_cold (8,379 samples, 17.60%)</title><rect x="74.1710%" y="1525" width="17.5967%" height="15" fill="rgb(244,164,10)" fg:x="35318" fg:w="8379"/><text x="74.4210%" y="1535.50">sqlparser_bench-959bc526797..</text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::sleep::Sleep::wake_any_threads (17 samples, 0.04%)</title><rect x="91.7319%" y="1509" width="0.0357%" height="15" fill="rgb(243,229,2)" fg:x="43680" fg:w="17"/><text x="91.9819%" y="1519.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rayon_core::sleep::Sleep::wake_specific_thread (17 samples, 0.04%)</title><rect x="91.7319%" y="1493" width="0.0357%" height="15" fill="rgb(232,131,37)" fg:x="43680" fg:w="17"/><text x="91.9819%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (12 samples, 0.03%)</title><rect x="91.7718%" y="117" width="0.0252%" height="15" fill="rgb(217,156,11)" fg:x="43699" fg:w="12"/><text x="92.0218%" y="127.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::RawVecInner&lt;A&gt;::reserve::do_reserve_and_handle (12 samples, 0.03%)</title><rect x="91.7718%" y="101" width="0.0252%" height="15" fill="rgb(239,99,48)" fg:x="43699" fg:w="12"/><text x="92.0218%" y="111.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`alloc::raw_vec::finish_grow (12 samples, 0.03%)</title><rect x="91.7718%" y="85" width="0.0252%" height="15" fill="rgb(231,209,9)" fg:x="43699" fg:w="12"/><text x="92.0218%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`_realloc (12 samples, 0.03%)</title><rect x="91.7718%" y="69" width="0.0252%" height="15" fill="rgb(254,97,27)" fg:x="43699" fg:w="12"/><text x="92.0218%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`_malloc_zone_realloc (12 samples, 0.03%)</title><rect x="91.7718%" y="53" width="0.0252%" height="15" fill="rgb(223,151,38)" fg:x="43699" fg:w="12"/><text x="92.0218%" y="63.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (11 samples, 0.02%)</title><rect x="91.7739%" y="37" width="0.0231%" height="15" fill="rgb(219,206,35)" fg:x="43700" fg:w="11"/><text x="92.0239%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (72 samples, 0.15%)</title><rect x="91.7970%" y="37" width="0.1512%" height="15" fill="rgb(216,130,31)" fg:x="43711" fg:w="72"/><text x="92.0470%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (133 samples, 0.28%)</title><rect x="91.9483%" y="37" width="0.2793%" height="15" fill="rgb(251,97,34)" fg:x="43783" fg:w="133"/><text x="92.1983%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (37 samples, 0.08%)</title><rect x="92.2276%" y="37" width="0.0777%" height="15" fill="rgb(246,159,47)" fg:x="43916" fg:w="37"/><text x="92.4776%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (96 samples, 0.20%)</title><rect x="92.3053%" y="37" width="0.2016%" height="15" fill="rgb(232,87,10)" fg:x="43953" fg:w="96"/><text x="92.5553%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (11 samples, 0.02%)</title><rect x="92.5069%" y="37" width="0.0231%" height="15" fill="rgb(249,1,37)" fg:x="44049" fg:w="11"/><text x="92.7569%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::operator::BinaryOperator as core::fmt::Display&gt;::fmt (58 samples, 0.12%)</title><rect x="92.5300%" y="37" width="0.1218%" height="15" fill="rgb(239,135,14)" fg:x="44060" fg:w="58"/><text x="92.7800%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::value::Value as core::fmt::Display&gt;::fmt (9 samples, 0.02%)</title><rect x="92.6518%" y="37" width="0.0189%" height="15" fill="rgb(253,116,46)" fg:x="44118" fg:w="9"/><text x="92.9018%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (12 samples, 0.03%)</title><rect x="92.6707%" y="37" width="0.0252%" height="15" fill="rgb(222,217,37)" fg:x="44127" fg:w="12"/><text x="92.9207%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,141 samples, 2.40%)</title><rect x="91.7970%" y="53" width="2.3962%" height="15" fill="rgb(252,96,8)" fg:x="43711" fg:w="1141"/><text x="92.0470%" y="63.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (713 samples, 1.50%)</title><rect x="92.6959%" y="37" width="1.4974%" height="15" fill="rgb(254,103,41)" fg:x="44139" fg:w="713"/><text x="92.9459%" y="47.50"></text></g><g><title>libdyld.dylib`tlv_get_addr (127 samples, 0.27%)</title><rect x="94.1933%" y="37" width="0.2667%" height="15" fill="rgb(218,213,19)" fg:x="44852" fg:w="127"/><text x="94.4433%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`psm::stack_pointer (44 samples, 0.09%)</title><rect x="94.4600%" y="37" width="0.0924%" height="15" fill="rgb(253,95,21)" fg:x="44979" fg:w="44"/><text x="94.7100%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`rust_psm_stack_pointer (124 samples, 0.26%)</title><rect x="94.5524%" y="37" width="0.2604%" height="15" fill="rgb(229,26,28)" fg:x="45023" fg:w="124"/><text x="94.8024%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (408 samples, 0.86%)</title><rect x="94.1933%" y="53" width="0.8568%" height="15" fill="rgb(230,129,16)" fg:x="44852" fg:w="408"/><text x="94.4433%" y="63.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (113 samples, 0.24%)</title><rect x="94.8128%" y="37" width="0.2373%" height="15" fill="rgb(236,126,17)" fg:x="45147" fg:w="113"/><text x="95.0628%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;&amp;T as core::fmt::Display&gt;::fmt (27 samples, 0.06%)</title><rect x="95.0501%" y="37" width="0.0567%" height="15" fill="rgb(209,33,33)" fg:x="45260" fg:w="27"/><text x="95.3001%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (68 samples, 0.14%)</title><rect x="95.1068%" y="37" width="0.1428%" height="15" fill="rgb(227,85,29)" fg:x="45287" fg:w="68"/><text x="95.3568%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (20 samples, 0.04%)</title><rect x="95.2496%" y="37" width="0.0420%" height="15" fill="rgb(241,53,46)" fg:x="45355" fg:w="20"/><text x="95.4996%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (65 samples, 0.14%)</title><rect x="95.2916%" y="37" width="0.1365%" height="15" fill="rgb(228,167,53)" fg:x="45375" fg:w="65"/><text x="95.5416%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1621" width="3.9020%" height="15" fill="rgb(238,195,45)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1631.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1605" width="3.9020%" height="15" fill="rgb(252,124,45)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1615.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1589" width="3.9020%" height="15" fill="rgb(251,38,35)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1599.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1573" width="3.9020%" height="15" fill="rgb(227,33,2)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1583.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1557" width="3.9020%" height="15" fill="rgb(223,157,46)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1567.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1541" width="3.9020%" height="15" fill="rgb(222,78,41)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1551.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1525" width="3.9020%" height="15" fill="rgb(248,176,11)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1535.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1509" width="3.9020%" height="15" fill="rgb(241,221,18)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1519.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1493" width="3.9020%" height="15" fill="rgb(218,85,22)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1503.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1477" width="3.9020%" height="15" fill="rgb(222,223,7)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1487.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1461" width="3.9020%" height="15" fill="rgb(254,59,39)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1471.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1445" width="3.9020%" height="15" fill="rgb(247,100,27)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1455.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1429" width="3.9020%" height="15" fill="rgb(237,207,10)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1439.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1413" width="3.9020%" height="15" fill="rgb(220,121,28)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1423.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1397" width="3.9020%" height="15" fill="rgb(213,223,20)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1407.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1381" width="3.9020%" height="15" fill="rgb(205,121,27)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1391.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1365" width="3.9020%" height="15" fill="rgb(253,24,53)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1375.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1349" width="3.9020%" height="15" fill="rgb(224,224,47)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1359.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1333" width="3.9020%" height="15" fill="rgb(250,125,36)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1343.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1317" width="3.9020%" height="15" fill="rgb(240,144,38)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1327.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1301" width="3.9020%" height="15" fill="rgb(250,15,50)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1311.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1285" width="3.9020%" height="15" fill="rgb(210,24,26)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1295.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1269" width="3.9020%" height="15" fill="rgb(234,53,53)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1279.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1253" width="3.9020%" height="15" fill="rgb(208,108,28)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1263.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1237" width="3.9020%" height="15" fill="rgb(227,143,7)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1247.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1221" width="3.9020%" height="15" fill="rgb(238,189,38)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1231.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1205" width="3.9020%" height="15" fill="rgb(222,69,15)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1215.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1189" width="3.9020%" height="15" fill="rgb(213,169,7)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1199.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1173" width="3.9020%" height="15" fill="rgb(251,219,4)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1183.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1157" width="3.9020%" height="15" fill="rgb(241,55,40)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1167.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1141" width="3.9020%" height="15" fill="rgb(243,57,30)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1151.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1125" width="3.9020%" height="15" fill="rgb(234,50,30)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1135.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1109" width="3.9020%" height="15" fill="rgb(239,23,42)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1119.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1093" width="3.9020%" height="15" fill="rgb(217,38,19)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1103.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1077" width="3.9020%" height="15" fill="rgb(215,179,16)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1087.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1061" width="3.9020%" height="15" fill="rgb(254,21,37)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1071.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1045" width="3.9020%" height="15" fill="rgb(219,207,48)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1055.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1029" width="3.9020%" height="15" fill="rgb(227,225,41)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1039.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="1013" width="3.9020%" height="15" fill="rgb(223,130,1)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1023.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="997" width="3.9020%" height="15" fill="rgb(249,54,42)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="1007.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="981" width="3.9020%" height="15" fill="rgb(248,69,25)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="991.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="965" width="3.9020%" height="15" fill="rgb(234,21,32)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="975.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="949" width="3.9020%" height="15" fill="rgb(252,136,6)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="959.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="933" width="3.9020%" height="15" fill="rgb(245,87,12)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="943.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="917" width="3.9020%" height="15" fill="rgb(208,12,15)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="927.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="901" width="3.9020%" height="15" fill="rgb(250,98,2)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="911.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="885" width="3.9020%" height="15" fill="rgb(205,213,15)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="895.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="869" width="3.9020%" height="15" fill="rgb(248,192,44)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="879.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="853" width="3.9020%" height="15" fill="rgb(221,89,17)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="863.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="837" width="3.9020%" height="15" fill="rgb(209,55,3)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="847.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="821" width="3.9020%" height="15" fill="rgb(247,23,45)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="831.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="805" width="3.9020%" height="15" fill="rgb(235,152,23)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="815.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="789" width="3.9020%" height="15" fill="rgb(244,63,13)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="799.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="773" width="3.9020%" height="15" fill="rgb(227,30,37)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="783.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="757" width="3.9020%" height="15" fill="rgb(224,49,42)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="767.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="741" width="3.9020%" height="15" fill="rgb(218,129,5)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="751.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="725" width="3.9020%" height="15" fill="rgb(240,199,54)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="735.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="709" width="3.9020%" height="15" fill="rgb(234,31,13)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="719.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="693" width="3.9020%" height="15" fill="rgb(219,73,54)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="703.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="677" width="3.9020%" height="15" fill="rgb(251,162,10)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="687.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="661" width="3.9020%" height="15" fill="rgb(240,138,47)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="671.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="645" width="3.9020%" height="15" fill="rgb(216,138,26)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="655.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="629" width="3.9020%" height="15" fill="rgb(243,17,35)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="639.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="613" width="3.9020%" height="15" fill="rgb(241,60,18)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="623.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="597" width="3.9020%" height="15" fill="rgb(234,2,44)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="607.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="581" width="3.9020%" height="15" fill="rgb(225,225,33)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="591.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="565" width="3.9020%" height="15" fill="rgb(234,50,31)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="575.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="549" width="3.9020%" height="15" fill="rgb(249,6,25)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="559.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="533" width="3.9020%" height="15" fill="rgb(241,5,17)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="543.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="517" width="3.9020%" height="15" fill="rgb(207,116,10)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="527.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="501" width="3.9020%" height="15" fill="rgb(222,128,18)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="511.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="485" width="3.9020%" height="15" fill="rgb(229,109,25)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="495.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="469" width="3.9020%" height="15" fill="rgb(222,102,25)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="479.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="453" width="3.9020%" height="15" fill="rgb(239,211,5)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="463.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="437" width="3.9020%" height="15" fill="rgb(223,136,26)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="447.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="421" width="3.9020%" height="15" fill="rgb(227,30,15)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="431.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="405" width="3.9020%" height="15" fill="rgb(247,76,4)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="415.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="389" width="3.9020%" height="15" fill="rgb(245,38,48)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="399.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="373" width="3.9020%" height="15" fill="rgb(210,220,14)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="383.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="357" width="3.9020%" height="15" fill="rgb(224,60,51)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="367.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="341" width="3.9020%" height="15" fill="rgb(212,133,49)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="351.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="325" width="3.9020%" height="15" fill="rgb(231,39,22)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="335.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="309" width="3.9020%" height="15" fill="rgb(236,173,22)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="319.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="293" width="3.9020%" height="15" fill="rgb(210,70,0)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="303.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="277" width="3.9020%" height="15" fill="rgb(215,170,11)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="287.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="261" width="3.9020%" height="15" fill="rgb(220,154,28)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="271.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="245" width="3.9020%" height="15" fill="rgb(240,160,41)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="255.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="229" width="3.9020%" height="15" fill="rgb(243,215,41)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="239.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="213" width="3.9020%" height="15" fill="rgb(214,208,31)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="223.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="197" width="3.9020%" height="15" fill="rgb(247,57,22)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="207.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="181" width="3.9020%" height="15" fill="rgb(228,73,52)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="191.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="165" width="3.9020%" height="15" fill="rgb(252,60,9)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="175.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,858 samples, 3.90%)</title><rect x="91.7718%" y="149" width="3.9020%" height="15" fill="rgb(233,9,51)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="159.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,858 samples, 3.90%)</title><rect x="91.7718%" y="133" width="3.9020%" height="15" fill="rgb(223,67,14)" fg:x="43699" fg:w="1858"/><text x="92.0218%" y="143.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,846 samples, 3.88%)</title><rect x="91.7970%" y="117" width="3.8768%" height="15" fill="rgb(222,86,2)" fg:x="43711" fg:w="1846"/><text x="92.0470%" y="127.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,846 samples, 3.88%)</title><rect x="91.7970%" y="101" width="3.8768%" height="15" fill="rgb(243,58,54)" fg:x="43711" fg:w="1846"/><text x="92.0470%" y="111.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,846 samples, 3.88%)</title><rect x="91.7970%" y="85" width="3.8768%" height="15" fill="rgb(210,200,39)" fg:x="43711" fg:w="1846"/><text x="92.0470%" y="95.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,846 samples, 3.88%)</title><rect x="91.7970%" y="69" width="3.8768%" height="15" fill="rgb(238,135,9)" fg:x="43711" fg:w="1846"/><text x="92.0470%" y="79.50">sqlp..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::value::Value as core::fmt::Display&gt;::fmt (297 samples, 0.62%)</title><rect x="95.0501%" y="53" width="0.6237%" height="15" fill="rgb(232,179,7)" fg:x="45260" fg:w="297"/><text x="95.3001%" y="63.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (117 samples, 0.25%)</title><rect x="95.4281%" y="37" width="0.2457%" height="15" fill="rgb(245,65,41)" fg:x="45440" fg:w="117"/><text x="95.6781%" y="47.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (253 samples, 0.53%)</title><rect x="95.6843%" y="37" width="0.5313%" height="15" fill="rgb(227,43,8)" fg:x="45562" fg:w="253"/><text x="95.9343%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (108 samples, 0.23%)</title><rect x="96.2156%" y="37" width="0.2268%" height="15" fill="rgb(235,91,14)" fg:x="45815" fg:w="108"/><text x="96.4656%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt (62 samples, 0.13%)</title><rect x="96.4424%" y="37" width="0.1302%" height="15" fill="rgb(235,219,31)" fg:x="45923" fg:w="62"/><text x="96.6924%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (372 samples, 0.78%)</title><rect x="96.5727%" y="37" width="0.7812%" height="15" fill="rgb(227,121,25)" fg:x="45985" fg:w="372"/><text x="96.8227%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Ident as core::fmt::Display&gt;::fmt (45 samples, 0.09%)</title><rect x="97.3539%" y="37" width="0.0945%" height="15" fill="rgb(254,129,24)" fg:x="46357" fg:w="45"/><text x="97.6039%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::value::Value as core::fmt::Display&gt;::fmt (57 samples, 0.12%)</title><rect x="97.4484%" y="37" width="0.1197%" height="15" fill="rgb(226,144,49)" fg:x="46402" fg:w="57"/><text x="97.6984%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`DYLD-STUB$$memcpy (71 samples, 0.15%)</title><rect x="97.5681%" y="37" width="0.1491%" height="15" fill="rgb(214,187,32)" fg:x="46459" fg:w="71"/><text x="97.8181%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_fmt (32 samples, 0.07%)</title><rect x="97.7172%" y="37" width="0.0672%" height="15" fill="rgb(243,129,46)" fg:x="46530" fg:w="32"/><text x="97.9672%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::write_str (34 samples, 0.07%)</title><rect x="97.7844%" y="37" width="0.0714%" height="15" fill="rgb(221,185,35)" fg:x="46562" fg:w="34"/><text x="98.0344%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (127 samples, 0.27%)</title><rect x="97.8558%" y="37" width="0.2667%" height="15" fill="rgb(205,0,32)" fg:x="46596" fg:w="127"/><text x="98.1058%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_minimum_stack_size (101 samples, 0.21%)</title><rect x="98.1225%" y="37" width="0.2121%" height="15" fill="rgb(229,179,12)" fg:x="46723" fg:w="101"/><text x="98.3725%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`recursive::get_stack_allocation_size (63 samples, 0.13%)</title><rect x="98.3346%" y="37" width="0.1323%" height="15" fill="rgb(252,107,19)" fg:x="46824" fg:w="63"/><text x="98.5846%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,396 samples, 2.93%)</title><rect x="95.6843%" y="69" width="2.9317%" height="15" fill="rgb(220,95,27)" fg:x="45562" fg:w="1396"/><text x="95.9343%" y="79.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,396 samples, 2.93%)</title><rect x="95.6843%" y="53" width="2.9317%" height="15" fill="rgb(240,113,40)" fg:x="45562" fg:w="1396"/><text x="95.9343%" y="63.50">sq..</text></g><g><title>sqlparser_bench-959bc5267970ca34`stacker::remaining_stack (71 samples, 0.15%)</title><rect x="98.4669%" y="37" width="0.1491%" height="15" fill="rgb(208,4,43)" fg:x="46887" fg:w="71"/><text x="98.7169%" y="47.50"></text></g><g><title>libsystem_platform.dylib`_platform_memmove (84 samples, 0.18%)</title><rect x="98.6160%" y="37" width="0.1764%" height="15" fill="rgb(247,189,30)" fg:x="46958" fg:w="84"/><text x="98.8660%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;alloc::string::String as core::fmt::Write&gt;::write_str (47 samples, 0.10%)</title><rect x="98.7924%" y="37" width="0.0987%" height="15" fill="rgb(231,157,17)" fg:x="47042" fg:w="47"/><text x="99.0424%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;str as core::fmt::Display&gt;::fmt (25 samples, 0.05%)</title><rect x="98.8912%" y="37" width="0.0525%" height="15" fill="rgb(224,139,6)" fg:x="47089" fg:w="25"/><text x="99.1412%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1605" width="3.3391%" height="15" fill="rgb(223,83,16)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1615.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1589" width="3.3391%" height="15" fill="rgb(232,211,20)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1599.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1573" width="3.3391%" height="15" fill="rgb(225,203,35)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1583.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1557" width="3.3391%" height="15" fill="rgb(215,211,44)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1567.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1541" width="3.3391%" height="15" fill="rgb(248,213,26)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1551.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1525" width="3.3391%" height="15" fill="rgb(214,23,52)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1535.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1509" width="3.3391%" height="15" fill="rgb(225,173,50)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1519.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1493" width="3.3391%" height="15" fill="rgb(206,150,22)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1503.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1477" width="3.3391%" height="15" fill="rgb(239,64,23)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1487.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1461" width="3.3391%" height="15" fill="rgb(242,50,38)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1471.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1445" width="3.3391%" height="15" fill="rgb(217,91,15)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1455.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1429" width="3.3391%" height="15" fill="rgb(230,172,6)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1439.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1413" width="3.3391%" height="15" fill="rgb(221,98,26)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1423.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1397" width="3.3391%" height="15" fill="rgb(227,210,45)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1407.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1381" width="3.3391%" height="15" fill="rgb(206,8,30)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1391.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1365" width="3.3391%" height="15" fill="rgb(241,219,17)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1375.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1349" width="3.3391%" height="15" fill="rgb(247,121,29)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1359.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1333" width="3.3391%" height="15" fill="rgb(219,169,49)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1343.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1317" width="3.3391%" height="15" fill="rgb(253,49,49)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1327.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1301" width="3.3391%" height="15" fill="rgb(217,178,3)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1311.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1285" width="3.3391%" height="15" fill="rgb(234,73,37)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1295.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1269" width="3.3391%" height="15" fill="rgb(250,98,22)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1279.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1253" width="3.3391%" height="15" fill="rgb(220,108,37)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1263.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1237" width="3.3391%" height="15" fill="rgb(225,168,10)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1247.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1221" width="3.3391%" height="15" fill="rgb(247,215,21)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1231.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1205" width="3.3391%" height="15" fill="rgb(253,189,31)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1215.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1189" width="3.3391%" height="15" fill="rgb(241,54,22)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1199.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1173" width="3.3391%" height="15" fill="rgb(211,87,4)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1183.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1157" width="3.3391%" height="15" fill="rgb(245,112,24)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1167.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1141" width="3.3391%" height="15" fill="rgb(235,190,41)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1151.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1125" width="3.3391%" height="15" fill="rgb(214,89,8)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1135.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1109" width="3.3391%" height="15" fill="rgb(249,155,35)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1119.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1093" width="3.3391%" height="15" fill="rgb(249,88,26)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1103.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1077" width="3.3391%" height="15" fill="rgb(232,56,8)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1087.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1061" width="3.3391%" height="15" fill="rgb(240,95,3)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1071.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1045" width="3.3391%" height="15" fill="rgb(222,44,28)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1055.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1029" width="3.3391%" height="15" fill="rgb(234,16,30)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1039.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="1013" width="3.3391%" height="15" fill="rgb(223,26,17)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1023.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="997" width="3.3391%" height="15" fill="rgb(239,187,47)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="1007.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="981" width="3.3391%" height="15" fill="rgb(247,102,50)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="991.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="965" width="3.3391%" height="15" fill="rgb(231,216,22)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="975.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="949" width="3.3391%" height="15" fill="rgb(216,201,26)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="959.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="933" width="3.3391%" height="15" fill="rgb(214,186,23)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="943.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="917" width="3.3391%" height="15" fill="rgb(235,184,4)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="927.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="901" width="3.3391%" height="15" fill="rgb(244,46,17)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="911.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="885" width="3.3391%" height="15" fill="rgb(248,74,46)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="895.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="869" width="3.3391%" height="15" fill="rgb(243,79,5)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="879.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="853" width="3.3391%" height="15" fill="rgb(213,148,1)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="863.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="837" width="3.3391%" height="15" fill="rgb(221,30,0)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="847.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="821" width="3.3391%" height="15" fill="rgb(207,85,29)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="831.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="805" width="3.3391%" height="15" fill="rgb(239,31,46)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="815.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="789" width="3.3391%" height="15" fill="rgb(219,6,1)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="799.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="773" width="3.3391%" height="15" fill="rgb(229,90,29)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="783.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="757" width="3.3391%" height="15" fill="rgb(242,201,42)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="767.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="741" width="3.3391%" height="15" fill="rgb(243,80,54)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="751.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="725" width="3.3391%" height="15" fill="rgb(223,166,15)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="735.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="709" width="3.3391%" height="15" fill="rgb(238,78,27)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="719.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="693" width="3.3391%" height="15" fill="rgb(235,28,43)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="703.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="677" width="3.3391%" height="15" fill="rgb(240,210,28)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="687.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="661" width="3.3391%" height="15" fill="rgb(253,6,46)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="671.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="645" width="3.3391%" height="15" fill="rgb(250,159,47)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="655.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="629" width="3.3391%" height="15" fill="rgb(216,139,2)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="639.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="613" width="3.3391%" height="15" fill="rgb(221,124,44)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="623.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="597" width="3.3391%" height="15" fill="rgb(205,37,22)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="607.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="581" width="3.3391%" height="15" fill="rgb(250,55,8)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="591.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="565" width="3.3391%" height="15" fill="rgb(215,83,48)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="575.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="549" width="3.3391%" height="15" fill="rgb(253,2,32)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="559.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="533" width="3.3391%" height="15" fill="rgb(236,67,28)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="543.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="517" width="3.3391%" height="15" fill="rgb(252,55,15)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="527.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="501" width="3.3391%" height="15" fill="rgb(243,173,17)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="511.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="485" width="3.3391%" height="15" fill="rgb(215,212,13)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="495.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="469" width="3.3391%" height="15" fill="rgb(253,176,6)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="479.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="453" width="3.3391%" height="15" fill="rgb(236,105,26)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="463.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="437" width="3.3391%" height="15" fill="rgb(239,226,32)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="447.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="421" width="3.3391%" height="15" fill="rgb(236,104,51)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="431.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="405" width="3.3391%" height="15" fill="rgb(220,172,33)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="415.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="389" width="3.3391%" height="15" fill="rgb(224,182,25)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="399.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="373" width="3.3391%" height="15" fill="rgb(236,184,24)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="383.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="357" width="3.3391%" height="15" fill="rgb(241,221,14)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="367.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="341" width="3.3391%" height="15" fill="rgb(227,146,5)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="351.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="325" width="3.3391%" height="15" fill="rgb(214,15,23)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="335.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="309" width="3.3391%" height="15" fill="rgb(233,157,31)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="319.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="293" width="3.3391%" height="15" fill="rgb(211,27,52)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="303.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="277" width="3.3391%" height="15" fill="rgb(212,223,15)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="287.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="261" width="3.3391%" height="15" fill="rgb(254,211,0)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="271.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="245" width="3.3391%" height="15" fill="rgb(205,43,38)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="255.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="229" width="3.3391%" height="15" fill="rgb(242,206,46)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="239.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="213" width="3.3391%" height="15" fill="rgb(220,221,12)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="223.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="197" width="3.3391%" height="15" fill="rgb(217,156,35)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="207.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="181" width="3.3391%" height="15" fill="rgb(207,181,49)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="191.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="165" width="3.3391%" height="15" fill="rgb(235,103,47)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="175.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="149" width="3.3391%" height="15" fill="rgb(222,63,28)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="159.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,590 samples, 3.34%)</title><rect x="95.6822%" y="133" width="3.3391%" height="15" fill="rgb(244,137,21)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="143.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,590 samples, 3.34%)</title><rect x="95.6822%" y="117" width="3.3391%" height="15" fill="rgb(228,35,27)" fg:x="45561" fg:w="1590"/><text x="95.9322%" y="127.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::Expr as core::fmt::Display&gt;::fmt::_{{closure}} (1,589 samples, 3.34%)</title><rect x="95.6843%" y="101" width="3.3370%" height="15" fill="rgb(226,191,41)" fg:x="45562" fg:w="1589"/><text x="95.9343%" y="111.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,589 samples, 3.34%)</title><rect x="95.6843%" y="85" width="3.3370%" height="15" fill="rgb(210,154,3)" fg:x="45562" fg:w="1589"/><text x="95.9343%" y="95.50">sql..</text></g><g><title>sqlparser_bench-959bc5267970ca34`&lt;sqlparser::ast::value::Value as core::fmt::Display&gt;::fmt (193 samples, 0.41%)</title><rect x="98.6160%" y="69" width="0.4053%" height="15" fill="rgb(216,60,49)" fg:x="46958" fg:w="193"/><text x="98.8660%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (193 samples, 0.41%)</title><rect x="98.6160%" y="53" width="0.4053%" height="15" fill="rgb(226,17,20)" fg:x="46958" fg:w="193"/><text x="98.8660%" y="63.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::Formatter::pad (36 samples, 0.08%)</title><rect x="98.9458%" y="37" width="0.0756%" height="15" fill="rgb(206,115,35)" fg:x="47115" fg:w="36"/><text x="99.1958%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::fmt::write (1,598 samples, 3.36%)</title><rect x="95.6822%" y="1621" width="3.3559%" height="15" fill="rgb(227,88,1)" fg:x="45561" fg:w="1598"/><text x="95.9322%" y="1631.50">sql..</text></g><g><title>libsystem_malloc.dylib`free_tiny (6 samples, 0.01%)</title><rect x="99.0382%" y="85" width="0.0126%" height="15" fill="rgb(230,222,24)" fg:x="47159" fg:w="6"/><text x="99.2882%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (6 samples, 0.01%)</title><rect x="99.0382%" y="69" width="0.0126%" height="15" fill="rgb(214,124,32)" fg:x="47159" fg:w="6"/><text x="99.2882%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (7 samples, 0.01%)</title><rect x="99.0571%" y="37" width="0.0147%" height="15" fill="rgb(240,41,36)" fg:x="47168" fg:w="7"/><text x="99.3071%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_scan_madvise_free (6 samples, 0.01%)</title><rect x="99.0802%" y="37" width="0.0126%" height="15" fill="rgb(221,17,52)" fg:x="47179" fg:w="6"/><text x="99.3302%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (29 samples, 0.06%)</title><rect x="99.0382%" y="101" width="0.0609%" height="15" fill="rgb(252,70,16)" fg:x="47159" fg:w="29"/><text x="99.2882%" y="111.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (20 samples, 0.04%)</title><rect x="99.0571%" y="85" width="0.0420%" height="15" fill="rgb(250,177,4)" fg:x="47168" fg:w="20"/><text x="99.3071%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (20 samples, 0.04%)</title><rect x="99.0571%" y="69" width="0.0420%" height="15" fill="rgb(240,188,47)" fg:x="47168" fg:w="20"/><text x="99.3071%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (20 samples, 0.04%)</title><rect x="99.0571%" y="53" width="0.0420%" height="15" fill="rgb(215,92,12)" fg:x="47168" fg:w="20"/><text x="99.3071%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_scan_madvise_free (5 samples, 0.01%)</title><rect x="99.0991%" y="53" width="0.0105%" height="15" fill="rgb(242,110,29)" fg:x="47188" fg:w="5"/><text x="99.3491%" y="63.50"></text></g><g><title>libsystem_kernel.dylib`madvise (5 samples, 0.01%)</title><rect x="99.0991%" y="37" width="0.0105%" height="15" fill="rgb(208,211,26)" fg:x="47188" fg:w="5"/><text x="99.3491%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (9 samples, 0.02%)</title><rect x="99.0991%" y="85" width="0.0189%" height="15" fill="rgb(244,147,6)" fg:x="47188" fg:w="9"/><text x="99.3491%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (9 samples, 0.02%)</title><rect x="99.0991%" y="69" width="0.0189%" height="15" fill="rgb(211,130,42)" fg:x="47188" fg:w="9"/><text x="99.3491%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_add_ptr (8 samples, 0.02%)</title><rect x="99.1222%" y="37" width="0.0168%" height="15" fill="rgb(220,63,1)" fg:x="47199" fg:w="8"/><text x="99.3722%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (7 samples, 0.01%)</title><rect x="99.1390%" y="37" width="0.0147%" height="15" fill="rgb(241,212,30)" fg:x="47207" fg:w="7"/><text x="99.3890%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (20 samples, 0.04%)</title><rect x="99.1180%" y="69" width="0.0420%" height="15" fill="rgb(233,153,17)" fg:x="47197" fg:w="20"/><text x="99.3680%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (20 samples, 0.04%)</title><rect x="99.1180%" y="53" width="0.0420%" height="15" fill="rgb(236,3,10)" fg:x="47197" fg:w="20"/><text x="99.3680%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (11 samples, 0.02%)</title><rect x="99.1600%" y="53" width="0.0231%" height="15" fill="rgb(232,41,21)" fg:x="47217" fg:w="11"/><text x="99.4100%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (9 samples, 0.02%)</title><rect x="99.1642%" y="37" width="0.0189%" height="15" fill="rgb(206,63,51)" fg:x="47219" fg:w="9"/><text x="99.4142%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (7 samples, 0.01%)</title><rect x="99.1831%" y="37" width="0.0147%" height="15" fill="rgb(250,214,3)" fg:x="47228" fg:w="7"/><text x="99.4331%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (10 samples, 0.02%)</title><rect x="99.1831%" y="53" width="0.0210%" height="15" fill="rgb(254,89,27)" fg:x="47228" fg:w="10"/><text x="99.4331%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (5 samples, 0.01%)</title><rect x="99.2104%" y="37" width="0.0105%" height="15" fill="rgb(249,41,14)" fg:x="47241" fg:w="5"/><text x="99.4604%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (11 samples, 0.02%)</title><rect x="99.2251%" y="37" width="0.0231%" height="15" fill="rgb(221,196,51)" fg:x="47248" fg:w="11"/><text x="99.4751%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (54 samples, 0.11%)</title><rect x="99.1600%" y="69" width="0.1134%" height="15" fill="rgb(214,116,26)" fg:x="47217" fg:w="54"/><text x="99.4100%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (33 samples, 0.07%)</title><rect x="99.2041%" y="53" width="0.0693%" height="15" fill="rgb(236,67,7)" fg:x="47238" fg:w="33"/><text x="99.4541%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (16 samples, 0.03%)</title><rect x="99.2734%" y="53" width="0.0336%" height="15" fill="rgb(253,179,32)" fg:x="47271" fg:w="16"/><text x="99.5234%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (12 samples, 0.03%)</title><rect x="99.2818%" y="37" width="0.0252%" height="15" fill="rgb(218,33,15)" fg:x="47275" fg:w="12"/><text x="99.5318%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="99.3091%" y="37" width="0.0147%" height="15" fill="rgb(217,202,41)" fg:x="47288" fg:w="7"/><text x="99.5591%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (8 samples, 0.02%)</title><rect x="99.3301%" y="37" width="0.0168%" height="15" fill="rgb(234,133,5)" fg:x="47298" fg:w="8"/><text x="99.5801%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (13 samples, 0.03%)</title><rect x="99.3469%" y="37" width="0.0273%" height="15" fill="rgb(240,47,40)" fg:x="47306" fg:w="13"/><text x="99.5969%" y="47.50"></text></g><g><title>libsystem_platform.dylib`_platform_memset (5 samples, 0.01%)</title><rect x="99.3763%" y="37" width="0.0105%" height="15" fill="rgb(234,166,26)" fg:x="47320" fg:w="5"/><text x="99.6263%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (94 samples, 0.20%)</title><rect x="99.3994%" y="37" width="0.1974%" height="15" fill="rgb(244,125,51)" fg:x="47331" fg:w="94"/><text x="99.6494%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1621" width="0.5607%" height="15" fill="rgb(229,171,11)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1631.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1605" width="0.5607%" height="15" fill="rgb(224,38,45)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1615.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1589" width="0.5607%" height="15" fill="rgb(237,27,7)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1599.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1573" width="0.5607%" height="15" fill="rgb(216,52,7)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1583.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1557" width="0.5607%" height="15" fill="rgb(243,11,11)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1567.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1541" width="0.5607%" height="15" fill="rgb(253,167,20)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1551.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1525" width="0.5607%" height="15" fill="rgb(215,207,5)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1535.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1509" width="0.5607%" height="15" fill="rgb(252,127,31)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1519.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1493" width="0.5607%" height="15" fill="rgb(209,106,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1477" width="0.5607%" height="15" fill="rgb(214,220,18)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1461" width="0.5607%" height="15" fill="rgb(237,89,12)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1445" width="0.5607%" height="15" fill="rgb(209,167,36)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1429" width="0.5607%" height="15" fill="rgb(243,45,22)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1413" width="0.5607%" height="15" fill="rgb(239,2,46)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1397" width="0.5607%" height="15" fill="rgb(241,101,0)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1381" width="0.5607%" height="15" fill="rgb(244,34,31)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1365" width="0.5607%" height="15" fill="rgb(248,23,22)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1349" width="0.5607%" height="15" fill="rgb(218,27,48)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1333" width="0.5607%" height="15" fill="rgb(232,78,1)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1317" width="0.5607%" height="15" fill="rgb(233,169,12)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1301" width="0.5607%" height="15" fill="rgb(225,222,54)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1285" width="0.5607%" height="15" fill="rgb(245,126,29)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1269" width="0.5607%" height="15" fill="rgb(241,63,48)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1253" width="0.5607%" height="15" fill="rgb(235,126,38)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1237" width="0.5607%" height="15" fill="rgb(232,96,49)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1221" width="0.5607%" height="15" fill="rgb(211,146,40)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1205" width="0.5607%" height="15" fill="rgb(247,93,44)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1189" width="0.5607%" height="15" fill="rgb(251,41,49)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1173" width="0.5607%" height="15" fill="rgb(218,155,12)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1157" width="0.5607%" height="15" fill="rgb(221,161,30)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1141" width="0.5607%" height="15" fill="rgb(221,179,11)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1125" width="0.5607%" height="15" fill="rgb(224,170,48)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1109" width="0.5607%" height="15" fill="rgb(223,117,5)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1093" width="0.5607%" height="15" fill="rgb(209,52,20)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1077" width="0.5607%" height="15" fill="rgb(209,19,41)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1061" width="0.5607%" height="15" fill="rgb(210,177,12)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1045" width="0.5607%" height="15" fill="rgb(211,159,37)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1029" width="0.5607%" height="15" fill="rgb(209,20,2)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="1013" width="0.5607%" height="15" fill="rgb(244,3,46)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="997" width="0.5607%" height="15" fill="rgb(220,94,38)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="981" width="0.5607%" height="15" fill="rgb(253,14,31)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="965" width="0.5607%" height="15" fill="rgb(234,176,13)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="949" width="0.5607%" height="15" fill="rgb(218,62,25)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="933" width="0.5607%" height="15" fill="rgb(216,124,40)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="917" width="0.5607%" height="15" fill="rgb(228,170,12)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="901" width="0.5607%" height="15" fill="rgb(231,226,5)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="885" width="0.5607%" height="15" fill="rgb(237,122,22)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="869" width="0.5607%" height="15" fill="rgb(209,185,25)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="853" width="0.5607%" height="15" fill="rgb(228,200,32)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="837" width="0.5607%" height="15" fill="rgb(217,140,10)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="821" width="0.5607%" height="15" fill="rgb(253,17,24)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="805" width="0.5607%" height="15" fill="rgb(212,61,6)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="789" width="0.5607%" height="15" fill="rgb(205,14,25)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="773" width="0.5607%" height="15" fill="rgb(232,69,41)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="757" width="0.5607%" height="15" fill="rgb(241,106,47)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="741" width="0.5607%" height="15" fill="rgb(210,213,53)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="725" width="0.5607%" height="15" fill="rgb(253,175,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="709" width="0.5607%" height="15" fill="rgb(211,171,24)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="693" width="0.5607%" height="15" fill="rgb(229,80,7)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="677" width="0.5607%" height="15" fill="rgb(212,46,39)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="687.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="661" width="0.5607%" height="15" fill="rgb(240,80,45)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="671.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="645" width="0.5607%" height="15" fill="rgb(253,177,40)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="655.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="629" width="0.5607%" height="15" fill="rgb(249,200,15)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="639.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="613" width="0.5607%" height="15" fill="rgb(217,78,26)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="623.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="597" width="0.5607%" height="15" fill="rgb(254,151,32)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="607.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="581" width="0.5607%" height="15" fill="rgb(226,165,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="591.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="565" width="0.5607%" height="15" fill="rgb(250,206,4)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="575.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="549" width="0.5607%" height="15" fill="rgb(231,229,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="559.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="533" width="0.5607%" height="15" fill="rgb(239,217,8)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="543.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="517" width="0.5607%" height="15" fill="rgb(225,204,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="527.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="501" width="0.5607%" height="15" fill="rgb(230,56,32)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="511.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="485" width="0.5607%" height="15" fill="rgb(222,56,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="495.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="469" width="0.5607%" height="15" fill="rgb(253,108,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="479.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="453" width="0.5607%" height="15" fill="rgb(212,87,36)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="463.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="437" width="0.5607%" height="15" fill="rgb(247,82,36)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="447.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="421" width="0.5607%" height="15" fill="rgb(222,143,9)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="431.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="405" width="0.5607%" height="15" fill="rgb(238,162,48)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="415.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="389" width="0.5607%" height="15" fill="rgb(221,59,43)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="399.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="373" width="0.5607%" height="15" fill="rgb(205,166,41)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="383.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="357" width="0.5607%" height="15" fill="rgb(241,186,40)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="367.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="341" width="0.5607%" height="15" fill="rgb(216,119,35)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="351.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="325" width="0.5607%" height="15" fill="rgb(208,68,38)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="335.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="309" width="0.5607%" height="15" fill="rgb(217,113,1)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="319.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="293" width="0.5607%" height="15" fill="rgb(242,153,3)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="303.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="277" width="0.5607%" height="15" fill="rgb(229,76,35)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="287.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="261" width="0.5607%" height="15" fill="rgb(229,125,34)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="271.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="245" width="0.5607%" height="15" fill="rgb(238,179,36)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="255.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="229" width="0.5607%" height="15" fill="rgb(244,183,19)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="239.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="213" width="0.5607%" height="15" fill="rgb(216,85,49)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="223.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="197" width="0.5607%" height="15" fill="rgb(208,161,47)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="207.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="181" width="0.5607%" height="15" fill="rgb(233,210,18)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="191.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="165" width="0.5607%" height="15" fill="rgb(205,104,42)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="175.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="149" width="0.5607%" height="15" fill="rgb(248,90,43)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="159.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="133" width="0.5607%" height="15" fill="rgb(206,198,11)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="143.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (267 samples, 0.56%)</title><rect x="99.0382%" y="117" width="0.5607%" height="15" fill="rgb(239,165,27)" fg:x="47159" fg:w="267"/><text x="99.2882%" y="127.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (238 samples, 0.50%)</title><rect x="99.0991%" y="101" width="0.4998%" height="15" fill="rgb(246,44,32)" fg:x="47188" fg:w="238"/><text x="99.3491%" y="111.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (229 samples, 0.48%)</title><rect x="99.1180%" y="85" width="0.4809%" height="15" fill="rgb(252,65,42)" fg:x="47197" fg:w="229"/><text x="99.3680%" y="95.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (155 samples, 0.33%)</title><rect x="99.2734%" y="69" width="0.3255%" height="15" fill="rgb(246,197,18)" fg:x="47271" fg:w="155"/><text x="99.5234%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (139 samples, 0.29%)</title><rect x="99.3070%" y="53" width="0.2919%" height="15" fill="rgb(216,192,4)" fg:x="47287" fg:w="139"/><text x="99.5570%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_scan_madvise_free (11 samples, 0.02%)</title><rect x="99.5989%" y="53" width="0.0231%" height="15" fill="rgb(208,117,10)" fg:x="47426" fg:w="11"/><text x="99.8489%" y="63.50"></text></g><g><title>libsystem_kernel.dylib`madvise (11 samples, 0.02%)</title><rect x="99.5989%" y="37" width="0.0231%" height="15" fill="rgb(240,61,47)" fg:x="47426" fg:w="11"/><text x="99.8489%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (15 samples, 0.03%)</title><rect x="99.5989%" y="85" width="0.0315%" height="15" fill="rgb(228,178,21)" fg:x="47426" fg:w="15"/><text x="99.8489%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (15 samples, 0.03%)</title><rect x="99.5989%" y="69" width="0.0315%" height="15" fill="rgb(219,96,54)" fg:x="47426" fg:w="15"/><text x="99.8489%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (18 samples, 0.04%)</title><rect x="99.5989%" y="117" width="0.0378%" height="15" fill="rgb(250,177,24)" fg:x="47426" fg:w="18"/><text x="99.8489%" y="127.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (18 samples, 0.04%)</title><rect x="99.5989%" y="101" width="0.0378%" height="15" fill="rgb(242,154,46)" fg:x="47426" fg:w="18"/><text x="99.8489%" y="111.50"></text></g><g><title>libsystem_kernel.dylib`madvise (5 samples, 0.01%)</title><rect x="99.6409%" y="37" width="0.0105%" height="15" fill="rgb(226,176,29)" fg:x="47446" fg:w="5"/><text x="99.8909%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (8 samples, 0.02%)</title><rect x="99.6367%" y="85" width="0.0168%" height="15" fill="rgb(226,29,2)" fg:x="47444" fg:w="8"/><text x="99.8867%" y="95.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (8 samples, 0.02%)</title><rect x="99.6367%" y="69" width="0.0168%" height="15" fill="rgb(237,104,14)" fg:x="47444" fg:w="8"/><text x="99.8867%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_madvise_free_range_no_lock (6 samples, 0.01%)</title><rect x="99.6409%" y="53" width="0.0126%" height="15" fill="rgb(245,207,31)" fg:x="47446" fg:w="6"/><text x="99.8909%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_list_remove_ptr (6 samples, 0.01%)</title><rect x="99.6640%" y="37" width="0.0126%" height="15" fill="rgb(229,211,45)" fg:x="47457" fg:w="6"/><text x="99.9140%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (12 samples, 0.03%)</title><rect x="99.6535%" y="69" width="0.0252%" height="15" fill="rgb(229,113,15)" fg:x="47452" fg:w="12"/><text x="99.9035%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (12 samples, 0.03%)</title><rect x="99.6535%" y="53" width="0.0252%" height="15" fill="rgb(237,147,15)" fg:x="47452" fg:w="12"/><text x="99.9035%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (11 samples, 0.02%)</title><rect x="99.6787%" y="53" width="0.0231%" height="15" fill="rgb(244,120,12)" fg:x="47464" fg:w="11"/><text x="99.9287%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (9 samples, 0.02%)</title><rect x="99.6829%" y="37" width="0.0189%" height="15" fill="rgb(205,120,12)" fg:x="47466" fg:w="9"/><text x="99.9329%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`_nanov2_free (8 samples, 0.02%)</title><rect x="99.7018%" y="37" width="0.0168%" height="15" fill="rgb(231,26,45)" fg:x="47475" fg:w="8"/><text x="99.9518%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (37 samples, 0.08%)</title><rect x="99.6535%" y="85" width="0.0777%" height="15" fill="rgb(246,98,1)" fg:x="47452" fg:w="37"/><text x="99.9035%" y="95.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (25 samples, 0.05%)</title><rect x="99.6787%" y="69" width="0.0525%" height="15" fill="rgb(207,68,45)" fg:x="47464" fg:w="25"/><text x="99.9287%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (14 samples, 0.03%)</title><rect x="99.7018%" y="53" width="0.0294%" height="15" fill="rgb(231,27,38)" fg:x="47475" fg:w="14"/><text x="99.9518%" y="63.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (6 samples, 0.01%)</title><rect x="99.7186%" y="37" width="0.0126%" height="15" fill="rgb(214,223,3)" fg:x="47483" fg:w="6"/><text x="99.9686%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (16 samples, 0.03%)</title><rect x="99.7312%" y="69" width="0.0336%" height="15" fill="rgb(228,195,46)" fg:x="47489" fg:w="16"/><text x="99.9812%" y="79.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (16 samples, 0.03%)</title><rect x="99.7312%" y="53" width="0.0336%" height="15" fill="rgb(231,100,42)" fg:x="47489" fg:w="16"/><text x="99.9812%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`tiny_free_no_lock (12 samples, 0.03%)</title><rect x="99.7711%" y="37" width="0.0252%" height="15" fill="rgb(236,53,4)" fg:x="47508" fg:w="12"/><text x="100.0211%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (16 samples, 0.03%)</title><rect x="99.7648%" y="53" width="0.0336%" height="15" fill="rgb(230,152,12)" fg:x="47505" fg:w="16"/><text x="100.0148%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`_free (7 samples, 0.01%)</title><rect x="99.8005%" y="37" width="0.0147%" height="15" fill="rgb(226,101,19)" fg:x="47522" fg:w="7"/><text x="100.0505%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`_szone_free (5 samples, 0.01%)</title><rect x="99.8215%" y="37" width="0.0105%" height="15" fill="rgb(250,149,32)" fg:x="47532" fg:w="5"/><text x="100.0715%" y="47.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (9 samples, 0.02%)</title><rect x="99.8320%" y="37" width="0.0189%" height="15" fill="rgb(232,178,12)" fg:x="47537" fg:w="9"/><text x="100.0820%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (36 samples, 0.08%)</title><rect x="99.7984%" y="53" width="0.0756%" height="15" fill="rgb(246,151,17)" fg:x="47521" fg:w="36"/><text x="100.0484%" y="63.50"></text></g><g><title>libsystem_malloc.dylib`free_tiny (5 samples, 0.01%)</title><rect x="99.8908%" y="37" width="0.0105%" height="15" fill="rgb(252,17,51)" fg:x="47565" fg:w="5"/><text x="100.1408%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (9 samples, 0.02%)</title><rect x="99.9160%" y="37" width="0.0189%" height="15" fill="rgb(250,207,23)" fg:x="47577" fg:w="9"/><text x="100.1660%" y="47.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1621" width="0.3465%" height="15" fill="rgb(205,27,5)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1631.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1605" width="0.3465%" height="15" fill="rgb(224,32,19)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1615.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1589" width="0.3465%" height="15" fill="rgb(247,214,40)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1599.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1573" width="0.3465%" height="15" fill="rgb(239,199,17)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1583.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1557" width="0.3465%" height="15" fill="rgb(251,159,9)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1567.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1541" width="0.3465%" height="15" fill="rgb(225,78,32)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1551.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1525" width="0.3465%" height="15" fill="rgb(206,97,47)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1535.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1509" width="0.3465%" height="15" fill="rgb(227,107,4)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1519.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1493" width="0.3465%" height="15" fill="rgb(241,146,50)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1503.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1477" width="0.3465%" height="15" fill="rgb(232,92,30)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1487.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1461" width="0.3465%" height="15" fill="rgb(222,0,40)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1471.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1445" width="0.3465%" height="15" fill="rgb(219,54,33)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1455.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1429" width="0.3465%" height="15" fill="rgb(226,209,28)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1439.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1413" width="0.3465%" height="15" fill="rgb(254,205,35)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1423.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1397" width="0.3465%" height="15" fill="rgb(230,159,3)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1407.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1381" width="0.3465%" height="15" fill="rgb(232,190,24)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1391.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1365" width="0.3465%" height="15" fill="rgb(217,227,44)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1375.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1349" width="0.3465%" height="15" fill="rgb(236,211,1)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1359.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1333" width="0.3465%" height="15" fill="rgb(250,127,46)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1343.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1317" width="0.3465%" height="15" fill="rgb(229,213,6)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1327.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1301" width="0.3465%" height="15" fill="rgb(237,15,36)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1311.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1285" width="0.3465%" height="15" fill="rgb(213,131,41)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1295.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1269" width="0.3465%" height="15" fill="rgb(225,82,44)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1279.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1253" width="0.3465%" height="15" fill="rgb(249,42,11)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1263.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1237" width="0.3465%" height="15" fill="rgb(253,11,29)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1247.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1221" width="0.3465%" height="15" fill="rgb(206,8,54)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1231.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1205" width="0.3465%" height="15" fill="rgb(222,186,2)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1215.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1189" width="0.3465%" height="15" fill="rgb(221,206,53)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1199.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1173" width="0.3465%" height="15" fill="rgb(230,150,21)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1183.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1157" width="0.3465%" height="15" fill="rgb(253,202,10)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1167.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1141" width="0.3465%" height="15" fill="rgb(238,109,40)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1151.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1125" width="0.3465%" height="15" fill="rgb(247,120,22)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1135.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1109" width="0.3465%" height="15" fill="rgb(207,43,30)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1119.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1093" width="0.3465%" height="15" fill="rgb(213,211,24)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1103.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1077" width="0.3465%" height="15" fill="rgb(239,73,39)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1087.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1061" width="0.3465%" height="15" fill="rgb(245,182,19)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1071.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1045" width="0.3465%" height="15" fill="rgb(247,143,26)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1055.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1029" width="0.3465%" height="15" fill="rgb(228,191,23)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1039.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="1013" width="0.3465%" height="15" fill="rgb(253,165,31)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1023.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="997" width="0.3465%" height="15" fill="rgb(234,138,20)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="1007.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="981" width="0.3465%" height="15" fill="rgb(218,191,29)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="991.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="965" width="0.3465%" height="15" fill="rgb(221,157,19)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="975.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="949" width="0.3465%" height="15" fill="rgb(237,26,42)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="959.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="933" width="0.3465%" height="15" fill="rgb(220,163,24)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="943.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="917" width="0.3465%" height="15" fill="rgb(242,115,20)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="927.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="901" width="0.3465%" height="15" fill="rgb(210,206,9)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="911.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="885" width="0.3465%" height="15" fill="rgb(208,71,17)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="895.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="869" width="0.3465%" height="15" fill="rgb(233,7,5)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="879.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="853" width="0.3465%" height="15" fill="rgb(207,92,33)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="863.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="837" width="0.3465%" height="15" fill="rgb(218,87,9)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="847.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="821" width="0.3465%" height="15" fill="rgb(219,47,37)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="831.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="805" width="0.3465%" height="15" fill="rgb(221,152,34)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="815.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="789" width="0.3465%" height="15" fill="rgb(235,176,21)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="799.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="773" width="0.3465%" height="15" fill="rgb(232,212,21)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="783.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="757" width="0.3465%" height="15" fill="rgb(245,82,39)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="767.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="741" width="0.3465%" height="15" fill="rgb(241,52,51)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="751.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="725" width="0.3465%" height="15" fill="rgb(219,91,24)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="735.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="709" width="0.3465%" height="15" fill="rgb(241,142,12)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="719.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="693" width="0.3465%" height="15" fill="rgb(230,27,9)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="703.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="677" width="0.3465%" height="15" fill="rgb(249,181,32)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="687.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="661" width="0.3465%" height="15" fill="rgb(230,107,3)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="671.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="645" width="0.3465%" height="15" fill="rgb(246,204,14)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="655.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="629" width="0.3465%" height="15" fill="rgb(213,192,47)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="639.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="613" width="0.3465%" height="15" fill="rgb(240,44,36)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="623.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="597" width="0.3465%" height="15" fill="rgb(244,209,38)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="607.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="581" width="0.3465%" height="15" fill="rgb(219,34,37)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="591.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="565" width="0.3465%" height="15" fill="rgb(210,28,6)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="575.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="549" width="0.3465%" height="15" fill="rgb(244,110,52)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="559.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="533" width="0.3465%" height="15" fill="rgb(254,124,47)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="543.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="517" width="0.3465%" height="15" fill="rgb(254,110,13)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="527.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="501" width="0.3465%" height="15" fill="rgb(252,57,21)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="511.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="485" width="0.3465%" height="15" fill="rgb(242,60,45)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="495.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="469" width="0.3465%" height="15" fill="rgb(234,49,30)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="479.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="453" width="0.3465%" height="15" fill="rgb(218,98,6)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="463.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="437" width="0.3465%" height="15" fill="rgb(220,174,29)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="447.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="421" width="0.3465%" height="15" fill="rgb(236,163,23)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="431.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="405" width="0.3465%" height="15" fill="rgb(242,114,45)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="415.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="389" width="0.3465%" height="15" fill="rgb(232,10,53)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="399.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="373" width="0.3465%" height="15" fill="rgb(245,108,29)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="383.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="357" width="0.3465%" height="15" fill="rgb(240,89,53)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="367.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="341" width="0.3465%" height="15" fill="rgb(226,60,45)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="351.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="325" width="0.3465%" height="15" fill="rgb(230,41,44)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="335.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="309" width="0.3465%" height="15" fill="rgb(230,26,20)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="319.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="293" width="0.3465%" height="15" fill="rgb(237,170,32)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="303.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="277" width="0.3465%" height="15" fill="rgb(212,35,42)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="287.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="261" width="0.3465%" height="15" fill="rgb(227,31,34)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="271.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="245" width="0.3465%" height="15" fill="rgb(216,19,18)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="255.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="229" width="0.3465%" height="15" fill="rgb(211,133,42)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="239.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="213" width="0.3465%" height="15" fill="rgb(244,66,13)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="223.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="197" width="0.3465%" height="15" fill="rgb(218,185,50)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="207.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="181" width="0.3465%" height="15" fill="rgb(219,149,13)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="191.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="165" width="0.3465%" height="15" fill="rgb(221,125,0)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="175.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="149" width="0.3465%" height="15" fill="rgb(247,126,27)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="159.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (165 samples, 0.35%)</title><rect x="99.5989%" y="133" width="0.3465%" height="15" fill="rgb(250,138,30)" fg:x="47426" fg:w="165"/><text x="99.8489%" y="143.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (147 samples, 0.31%)</title><rect x="99.6367%" y="117" width="0.3087%" height="15" fill="rgb(230,151,9)" fg:x="47444" fg:w="147"/><text x="99.8867%" y="127.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (147 samples, 0.31%)</title><rect x="99.6367%" y="101" width="0.3087%" height="15" fill="rgb(233,80,38)" fg:x="47444" fg:w="147"/><text x="99.8867%" y="111.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (102 samples, 0.21%)</title><rect x="99.7312%" y="85" width="0.2142%" height="15" fill="rgb(232,68,43)" fg:x="47489" fg:w="102"/><text x="99.9812%" y="95.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;alloc::boxed::Box&lt;sqlparser::ast::Expr&gt;&gt; (86 samples, 0.18%)</title><rect x="99.7648%" y="69" width="0.1806%" height="15" fill="rgb(254,5,50)" fg:x="47505" fg:w="86"/><text x="100.0148%" y="79.50"></text></g><g><title>sqlparser_bench-959bc5267970ca34`core::ptr::drop_in_place&lt;sqlparser::ast::Expr&gt; (34 samples, 0.07%)</title><rect x="99.8740%" y="53" width="0.0714%" height="15" fill="rgb(225,45,5)" fg:x="47557" fg:w="34"/><text x="100.1240%" y="63.50"></text></g><g><title>all (47,617 samples, 100%)</title><rect x="0.0000%" y="1637" width="100.0000%" height="15" fill="rgb(239,22,3)" fg:x="0" fg:w="47617"/><text x="0.2500%" y="1647.50"></text></g></svg></svg>
\ No newline at end of file
diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs
index bc48341c4..b4a8af60f 100644
--- a/src/ast/data_type.rs
+++ b/src/ast/data_type.rs
@@ -25,309 +25,444 @@ use serde::{Deserialize, Serialize};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
-use crate::ast::{display_comma_separated, ObjectName, StructField, UnionField};
+use crate::ast::{display_comma_separated, Expr, ObjectName, StructField, UnionField};
 
 use super::{value::escape_single_quote_string, ColumnDef};
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum EnumMember {
+    Name(String),
+    /// ClickHouse allows to specify an integer value for each enum value.
+    ///
+    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/data-types/enum)
+    NamedValue(String, Expr),
+}
+
 /// SQL data types
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum DataType {
-    /// Fixed-length character type e.g. CHARACTER(10)
+    /// Table type in [PostgreSQL], e.g. CREATE FUNCTION RETURNS TABLE(...).
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
+    /// [MsSQL]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver16#c-create-a-multi-statement-table-valued-function
+    Table(Option<Vec<ColumnDef>>),
+    /// Table type with a name, e.g. CREATE FUNCTION RETURNS @result TABLE(...).
+    ///
+    /// [MsSQl]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver16#table
+    NamedTable {
+        /// Table name.
+        name: ObjectName,
+        /// Table columns.
+        columns: Vec<ColumnDef>,
+    },
+    /// Fixed-length character type, e.g. CHARACTER(10).
     Character(Option<CharacterLength>),
-    /// Fixed-length char type e.g. CHAR(10)
+    /// Fixed-length char type, e.g. CHAR(10).
     Char(Option<CharacterLength>),
-    /// Character varying type e.g. CHARACTER VARYING(10)
+    /// Character varying type, e.g. CHARACTER VARYING(10).
     CharacterVarying(Option<CharacterLength>),
-    /// Char varying type e.g. CHAR VARYING(10)
+    /// Char varying type, e.g. CHAR VARYING(10).
     CharVarying(Option<CharacterLength>),
-    /// Variable-length character type e.g. VARCHAR(10)
+    /// Variable-length character type, e.g. VARCHAR(10).
     Varchar(Option<CharacterLength>),
-    /// Variable-length character type e.g. NVARCHAR(10)
+    /// Variable-length character type, e.g. NVARCHAR(10).
     Nvarchar(Option<CharacterLength>),
-    /// Uuid type
+    /// Uuid type.
     Uuid,
-    /// Large character object with optional length e.g. CHARACTER LARGE OBJECT, CHARACTER LARGE OBJECT(1000), [standard]
+    /// Large character object with optional length,
+    /// e.g. CHARACTER LARGE OBJECT, CHARACTER LARGE OBJECT(1000), [SQL Standard].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
     CharacterLargeObject(Option<u64>),
-    /// Large character object with optional length e.g. CHAR LARGE OBJECT, CHAR LARGE OBJECT(1000), [standard]
+    /// Large character object with optional length,
+    /// e.g. CHAR LARGE OBJECT, CHAR LARGE OBJECT(1000), [SQL Standard].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
     CharLargeObject(Option<u64>),
-    /// Large character object with optional length e.g. CLOB, CLOB(1000), [standard]
+    /// Large character object with optional length,
+    /// e.g. CLOB, CLOB(1000), [SQL Standard].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#character-large-object-type
     /// [Oracle]: https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html
     Clob(Option<u64>),
-    /// Fixed-length binary type with optional length e.g.  [standard], [MS SQL Server]
+    /// Fixed-length binary type with optional length,
+    /// see [SQL Standard], [MS SQL Server].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-string-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-string-type
     /// [MS SQL Server]: https://learn.microsoft.com/pt-br/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-ver16
     Binary(Option<u64>),
-    /// Variable-length binary with optional length type e.g. [standard], [MS SQL Server]
+    /// Variable-length binary with optional length type,
+    /// see [SQL Standard], [MS SQL Server].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-string-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-string-type
     /// [MS SQL Server]: https://learn.microsoft.com/pt-br/sql/t-sql/data-types/binary-and-varbinary-transact-sql?view=sql-server-ver16
-    Varbinary(Option<u64>),
-    /// Large binary object with optional length e.g. BLOB, BLOB(1000), [standard], [Oracle]
+    Varbinary(Option<BinaryLength>),
+    /// Large binary object with optional length,
+    /// see [SQL Standard], [Oracle].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-large-object-string-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#binary-large-object-string-type
     /// [Oracle]: https://docs.oracle.com/javadb/10.8.3.0/ref/rrefblob.html
     Blob(Option<u64>),
+    /// [MySQL] blob with up to 2**8 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    TinyBlob,
+    /// [MySQL] blob with up to 2**24 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    MediumBlob,
+    /// [MySQL] blob with up to 2**32 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    LongBlob,
     /// Variable-length binary data with optional length.
     ///
-    /// [bigquery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type
+    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type
     Bytes(Option<u64>),
-    /// Numeric type with optional precision and scale e.g. NUMERIC(10,2), [standard][1]
+    /// Numeric type with optional precision and scale, e.g. NUMERIC(10,2), [SQL Standard][1].
     ///
     /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type
     Numeric(ExactNumberInfo),
-    /// Decimal type with optional precision and scale e.g. DECIMAL(10,2), [standard][1]
+    /// Decimal type with optional precision and scale, e.g. DECIMAL(10,2), [SQL Standard][1].
     ///
     /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type
     Decimal(ExactNumberInfo),
-    /// [BigNumeric] type used in BigQuery
+    /// [BigNumeric] type used in BigQuery.
     ///
     /// [BigNumeric]: https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#bignumeric_literals
     BigNumeric(ExactNumberInfo),
-    /// This is alias for `BigNumeric` type used in BigQuery
+    /// This is alias for `BigNumeric` type used in BigQuery.
     ///
     /// [BigDecimal]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types
     BigDecimal(ExactNumberInfo),
-    /// Dec type with optional precision and scale e.g. DEC(10,2), [standard][1]
+    /// Dec type with optional precision and scale, e.g. DEC(10,2), [SQL Standard][1].
     ///
     /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type
     Dec(ExactNumberInfo),
-    /// Floating point with optional precision e.g. FLOAT(8)
+    /// Floating point with optional precision, e.g. FLOAT(8).
     Float(Option<u64>),
-    /// Tiny integer with optional display width e.g. TINYINT or TINYINT(3)
+    /// Tiny integer with optional display width, e.g. TINYINT or TINYINT(3).
     TinyInt(Option<u64>),
-    /// Unsigned tiny integer with optional display width e.g. TINYINT UNSIGNED or TINYINT(3) UNSIGNED
-    UnsignedTinyInt(Option<u64>),
-    /// Int2 as alias for SmallInt in [postgresql]
-    /// Note: Int2 mean 2 bytes in postgres (not 2 bits)
-    /// Int2 with optional display width e.g. INT2 or INT2(5)
+    /// Unsigned tiny integer with optional display width,
+    /// e.g. TINYINT UNSIGNED or TINYINT(3) UNSIGNED.
+    TinyIntUnsigned(Option<u64>),
+    /// Unsigned tiny integer, e.g. UTINYINT
+    UTinyInt,
+    /// Int2 is an alias for SmallInt in [PostgreSQL].
+    /// Note: Int2 means 2 bytes in PostgreSQL (not 2 bits).
+    /// Int2 with optional display width, e.g. INT2 or INT2(5).
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Int2(Option<u64>),
-    /// Unsigned Int2 with optional display width e.g. INT2 Unsigned or INT2(5) Unsigned
-    UnsignedInt2(Option<u64>),
-    /// Small integer with optional display width e.g. SMALLINT or SMALLINT(5)
+    /// Unsigned Int2 with optional display width, e.g. INT2 UNSIGNED or INT2(5) UNSIGNED.
+    Int2Unsigned(Option<u64>),
+    /// Small integer with optional display width, e.g. SMALLINT or SMALLINT(5).
     SmallInt(Option<u64>),
-    /// Unsigned small integer with optional display width e.g. SMALLINT UNSIGNED or SMALLINT(5) UNSIGNED
-    UnsignedSmallInt(Option<u64>),
-    /// MySQL medium integer ([1]) with optional display width e.g. MEDIUMINT or MEDIUMINT(5)
+    /// Unsigned small integer with optional display width,
+    /// e.g. SMALLINT UNSIGNED or SMALLINT(5) UNSIGNED.
+    SmallIntUnsigned(Option<u64>),
+    /// Unsigned small integer, e.g. USMALLINT.
+    USmallInt,
+    /// MySQL medium integer ([1]) with optional display width,
+    /// e.g. MEDIUMINT or MEDIUMINT(5).
     ///
     /// [1]: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
     MediumInt(Option<u64>),
-    /// Unsigned medium integer ([1]) with optional display width e.g. MEDIUMINT UNSIGNED or MEDIUMINT(5) UNSIGNED
+    /// Unsigned medium integer ([1]) with optional display width,
+    /// e.g. MEDIUMINT UNSIGNED or MEDIUMINT(5) UNSIGNED.
     ///
     /// [1]: https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
-    UnsignedMediumInt(Option<u64>),
-    /// Int with optional display width e.g. INT or INT(11)
+    MediumIntUnsigned(Option<u64>),
+    /// Int with optional display width, e.g. INT or INT(11).
     Int(Option<u64>),
-    /// Int4 as alias for Integer in [postgresql]
-    /// Note: Int4 mean 4 bytes in postgres (not 4 bits)
-    /// Int4 with optional display width e.g. Int4 or Int4(11)
+    /// Int4 is an alias for Integer in [PostgreSQL].
+    /// Note: Int4 means 4 bytes in PostgreSQL (not 4 bits).
+    /// Int4 with optional display width, e.g. Int4 or Int4(11).
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Int4(Option<u64>),
-    /// Int8 as alias for Bigint in [postgresql] and integer type in [clickhouse]
-    /// Note: Int8 mean 8 bytes in [postgresql] (not 8 bits)
-    /// Int8 with optional display width e.g. INT8 or INT8(11)
-    /// Note: Int8 mean 8 bits in [clickhouse]
+    /// Int8 is an alias for BigInt in [PostgreSQL] and Integer type in [ClickHouse].
+    /// Int8 with optional display width, e.g. INT8 or INT8(11).
+    /// Note: Int8 means 8 bytes in [PostgreSQL], but 8 bits in [ClickHouse].
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int8(Option<u64>),
-    /// Integer type in [clickhouse]
-    /// Note: Int16 mean 16 bits in [clickhouse]
+    /// Integer type in [ClickHouse].
+    /// Note: Int16 means 16 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int16,
-    /// Integer type in [clickhouse]
-    /// Note: Int16 mean 32 bits in [clickhouse]
+    /// Integer type in [ClickHouse].
+    /// Note: Int32 means 32 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int32,
-    /// Integer type in [bigquery], [clickhouse]
+    /// Integer type in [BigQuery], [ClickHouse].
     ///
-    /// [bigquery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int64,
-    /// Integer type in [clickhouse]
-    /// Note: Int128 mean 128 bits in [clickhouse]
+    /// Integer type in [ClickHouse].
+    /// Note: Int128 means 128 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int128,
-    /// Integer type in [clickhouse]
-    /// Note: Int256 mean 256 bits in [clickhouse]
+    /// Integer type in [ClickHouse].
+    /// Note: Int256 means 256 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     Int256,
-    /// Integer with optional display width e.g. INTEGER or INTEGER(11)
+    /// Integer with optional display width, e.g. INTEGER or INTEGER(11).
     Integer(Option<u64>),
-    /// Unsigned int with optional display width e.g. INT UNSIGNED or INT(11) UNSIGNED
-    UnsignedInt(Option<u64>),
-    /// Unsigned int4 with optional display width e.g. INT4 UNSIGNED or INT4(11) UNSIGNED
-    UnsignedInt4(Option<u64>),
-    /// Unsigned integer with optional display width e.g. INTEGER UNSIGNED or INTEGER(11) UNSIGNED
-    UnsignedInteger(Option<u64>),
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt8 mean 8 bits in [clickhouse]
-    ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// Unsigned int with optional display width, e.g. INT UNSIGNED or INT(11) UNSIGNED.
+    IntUnsigned(Option<u64>),
+    /// Unsigned int4 with optional display width, e.g. INT4 UNSIGNED or INT4(11) UNSIGNED.
+    Int4Unsigned(Option<u64>),
+    /// Unsigned integer with optional display width, e.g. INTEGER UNSIGNED or INTEGER(11) UNSIGNED.
+    IntegerUnsigned(Option<u64>),
+    /// 128-bit integer type, e.g. HUGEINT.
+    HugeInt,
+    /// Unsigned 128-bit integer type, e.g. UHUGEINT.
+    UHugeInt,
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt8 means 8 bits in [ClickHouse].
+    ///
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt8,
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt16 mean 16 bits in [clickhouse]
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt16 means 16 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt16,
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt32 mean 32 bits in [clickhouse]
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt32 means 32 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt32,
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt64 mean 64 bits in [clickhouse]
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt64 means 64 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt64,
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt128 mean 128 bits in [clickhouse]
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt128 means 128 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt128,
-    /// Unsigned integer type in [clickhouse]
-    /// Note: UInt256 mean 256 bits in [clickhouse]
+    /// Unsigned integer type in [ClickHouse].
+    /// Note: UInt256 means 256 bits in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/int-uint
     UInt256,
-    /// Big integer with optional display width e.g. BIGINT or BIGINT(20)
+    /// Big integer with optional display width, e.g. BIGINT or BIGINT(20).
     BigInt(Option<u64>),
-    /// Unsigned big integer with optional display width e.g. BIGINT UNSIGNED or BIGINT(20) UNSIGNED
-    UnsignedBigInt(Option<u64>),
-    /// Unsigned Int8 with optional display width e.g. INT8 UNSIGNED or INT8(11) UNSIGNED
-    UnsignedInt8(Option<u64>),
-    /// Float4 as alias for Real in [postgresql]
+    /// Unsigned big integer with optional display width, e.g. BIGINT UNSIGNED or BIGINT(20) UNSIGNED.
+    BigIntUnsigned(Option<u64>),
+    /// Unsigned big integer, e.g. UBIGINT.
+    UBigInt,
+    /// Unsigned Int8 with optional display width, e.g. INT8 UNSIGNED or INT8(11) UNSIGNED.
+    Int8Unsigned(Option<u64>),
+    /// Signed integer as used in [MySQL CAST] target types, without optional `INTEGER` suffix,
+    /// e.g. `SIGNED`
+    ///
+    /// [MySQL CAST]: https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html
+    Signed,
+    /// Signed integer as used in [MySQL CAST] target types, with optional `INTEGER` suffix,
+    /// e.g. `SIGNED INTEGER`
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
+    /// [MySQL CAST]: https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html
+    SignedInteger,
+    /// Signed integer as used in [MySQL CAST] target types, without optional `INTEGER` suffix,
+    /// e.g. `SIGNED`
+    ///
+    /// [MySQL CAST]: https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html
+    Unsigned,
+    /// Unsigned integer as used in [MySQL CAST] target types, with optional `INTEGER` suffix,
+    /// e.g. `UNSIGNED INTEGER`.
+    ///
+    /// [MySQL CAST]: https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html
+    UnsignedInteger,
+    /// Float4 is an alias for Real in [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Float4,
-    /// Floating point in [clickhouse]
+    /// Floating point in [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/float
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/float
     Float32,
-    /// Floating point in [bigquery]
+    /// Floating point in [BigQuery].
     ///
-    /// [bigquery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#floating_point_types
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/float
+    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#floating_point_types
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/float
     Float64,
-    /// Floating point e.g. REAL
+    /// Floating point, e.g. REAL.
     Real,
-    /// Float8 as alias for Double in [postgresql]
+    /// Float8 is an alias for Double in [PostgreSQL].
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Float8,
     /// Double
-    Double,
-    /// Double PRECISION e.g. [standard], [postgresql]
+    Double(ExactNumberInfo),
+    /// Double Precision, see [SQL Standard], [PostgreSQL].
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type
-    /// [postgresql]: https://www.postgresql.org/docs/current/datatype-numeric.html
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype-numeric.html
     DoublePrecision,
-    /// Bool as alias for Boolean in [postgresql]
+    /// Bool is an alias for Boolean, see [PostgreSQL].
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Bool,
-    /// Boolean
+    /// Boolean type.
     Boolean,
-    /// Date
+    /// Date type.
     Date,
-    /// Date32 with the same range as Datetime64
+    /// Date32 with the same range as Datetime64.
     ///
     /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/date32
     Date32,
-    /// Time with optional time precision and time zone information e.g. [standard][1].
+    /// Time with optional time precision and time zone information, see [SQL Standard][1].
     ///
     /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
     Time(Option<u64>, TimezoneInfo),
-    /// Datetime with optional time precision e.g. [MySQL][1].
+    /// Datetime with optional time precision, see [MySQL][1].
     ///
     /// [1]: https://dev.mysql.com/doc/refman/8.0/en/datetime.html
     Datetime(Option<u64>),
-    /// Datetime with time precision and optional timezone e.g. [ClickHouse][1].
+    /// Datetime with time precision and optional timezone, see [ClickHouse][1].
     ///
     /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
     Datetime64(u64, Option<String>),
-    /// Timestamp with optional time precision and time zone information e.g. [standard][1].
+    /// Timestamp with optional time precision and time zone information, see [SQL Standard][1].
     ///
     /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
     Timestamp(Option<u64>, TimezoneInfo),
-    /// Interval
-    Interval,
-    /// JSON type
+    /// Databricks timestamp without time zone. See [1].
+    ///
+    /// [1]: https://docs.databricks.com/aws/en/sql/language-manual/data-types/timestamp-ntz-type
+    TimestampNtz,
+    /// Interval type.
+    Interval {
+        /// [PostgreSQL] fields specification like `INTERVAL YEAR TO MONTH`.
+        ///
+        /// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-datetime.html
+        fields: Option<IntervalFields>,
+        /// [PostgreSQL] subsecond precision like `INTERVAL HOUR TO SECOND(3)`
+        ///
+        /// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-datetime.html
+        precision: Option<u64>,
+    },
+    /// JSON type.
     JSON,
-    /// Binary JSON type
+    /// Binary JSON type.
     JSONB,
-    /// Regclass used in postgresql serial
+    /// Regclass used in [PostgreSQL] serial.
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
     Regclass,
-    /// Text
+    /// Text type.
     Text,
+    /// [MySQL] text with up to 2**8 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    TinyText,
+    /// [MySQL] text with up to 2**24 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    MediumText,
+    /// [MySQL] text with up to 2**32 bytes.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/blob.html
+    LongText,
     /// String with optional length.
     String(Option<u64>),
     /// A fixed-length string e.g [ClickHouse][1].
     ///
     /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/fixedstring
     FixedString(u64),
-    /// Bytea
+    /// Bytea type, see [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype-bit.html
     Bytea,
-    /// Custom type such as enums
+    /// Bit string, see [PostgreSQL], [MySQL], or [MSSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype-bit.html
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/bit-type.html
+    /// [MSSQL]: https://learn.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-ver16
+    Bit(Option<u64>),
+    /// `BIT VARYING(n)`: Variable-length bit string, see [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype-bit.html
+    BitVarying(Option<u64>),
+    /// `VARBIT(n)`: Variable-length bit string. [PostgreSQL] alias for `BIT VARYING`.
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/datatype.html
+    VarBit(Option<u64>),
+    /// Custom types.
     Custom(ObjectName, Vec<String>),
-    /// Arrays
+    /// Arrays.
     Array(ArrayElemTypeDef),
-    /// Map
+    /// Map, see [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/map
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/map
     Map(Box<DataType>, Box<DataType>),
-    /// Tuple
+    /// Tuple, see [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
     Tuple(Vec<StructField>),
-    /// Nested
+    /// Nested type, see [ClickHouse].
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/nested-data-structures/nested
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/nested-data-structures/nested
     Nested(Vec<ColumnDef>),
-    /// Enums
-    Enum(Vec<String>),
-    /// Set
+    /// Enum type.
+    Enum(Vec<EnumMember>, Option<u8>),
+    /// Set type.
     Set(Vec<String>),
-    /// Struct
+    /// Struct type, see [Hive], [BigQuery].
     ///
-    /// [hive]: https://docs.cloudera.com/cdw-runtime/cloud/impala-sql-reference/topics/impala-struct.html
-    /// [bigquery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type
+    /// [Hive]: https://docs.cloudera.com/cdw-runtime/cloud/impala-sql-reference/topics/impala-struct.html
+    /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type
     Struct(Vec<StructField>, StructBracketKind),
-    /// Union
+    /// Union type, see [DuckDB].
     ///
-    /// [duckdb]: https://duckdb.org/docs/sql/data_types/union.html
+    /// [DuckDB]: https://duckdb.org/docs/sql/data_types/union.html
     Union(Vec<UnionField>),
     /// Nullable - special marker NULL represents in ClickHouse as a data type.
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/nullable
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/nullable
     Nullable(Box<DataType>),
     /// LowCardinality - changes the internal representation of other data types to be dictionary-encoded.
     ///
-    /// [clickhouse]: https://clickhouse.com/docs/en/sql-reference/data-types/lowcardinality
+    /// [ClickHouse]: https://clickhouse.com/docs/en/sql-reference/data-types/lowcardinality
     LowCardinality(Box<DataType>),
     /// No type specified - only used with
     /// [`SQLiteDialect`](crate::dialect::SQLiteDialect), from statements such
     /// as `CREATE TABLE t1 (a)`.
     Unspecified,
-    /// Trigger data type, returned by functions associated with triggers
+    /// Trigger data type, returned by functions associated with triggers, see [PostgreSQL].
     ///
-    /// [postgresql]: https://www.postgresql.org/docs/current/plpgsql-trigger.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/plpgsql-trigger.html
     Trigger,
+    /// Any data type, used in BigQuery UDF definitions for templated parameters, see [BigQuery].
+    ///
+    /// [BigQuery]: https://cloud.google.com/bigquery/docs/user-defined-functions#templated-sql-udf-parameters
+    AnyType,
+    /// Geometric type, see [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/9.5/functions-geometry.html
+    GeometricType(GeometricTypeKind),
+    /// PostgreSQL text search vectors, see [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-textsearch.html
+    TsVector,
+    /// PostgreSQL text search query, see [PostgreSQL].
+    ///
+    /// [PostgreSQL]: https://www.postgresql.org/docs/17/datatype-textsearch.html
+    TsQuery,
 }
 
 impl fmt::Display for DataType {
@@ -338,7 +473,6 @@ impl fmt::Display for DataType {
             DataType::CharacterVarying(size) => {
                 format_character_string_type(f, "CHARACTER VARYING", size)
             }
-
             DataType::CharVarying(size) => format_character_string_type(f, "CHAR VARYING", size),
             DataType::Varchar(size) => format_character_string_type(f, "VARCHAR", size),
             DataType::Nvarchar(size) => format_character_string_type(f, "NVARCHAR", size),
@@ -351,10 +485,11 @@ impl fmt::Display for DataType {
             }
             DataType::Clob(size) => format_type_with_optional_length(f, "CLOB", size, false),
             DataType::Binary(size) => format_type_with_optional_length(f, "BINARY", size, false),
-            DataType::Varbinary(size) => {
-                format_type_with_optional_length(f, "VARBINARY", size, false)
-            }
+            DataType::Varbinary(size) => format_varbinary_type(f, "VARBINARY", size),
             DataType::Blob(size) => format_type_with_optional_length(f, "BLOB", size, false),
+            DataType::TinyBlob => write!(f, "TINYBLOB"),
+            DataType::MediumBlob => write!(f, "MEDIUMBLOB"),
+            DataType::LongBlob => write!(f, "LONGBLOB"),
             DataType::Bytes(size) => format_type_with_optional_length(f, "BYTES", size, false),
             DataType::Numeric(info) => {
                 write!(f, "NUMERIC{info}")
@@ -371,29 +506,29 @@ impl fmt::Display for DataType {
             DataType::TinyInt(zerofill) => {
                 format_type_with_optional_length(f, "TINYINT", zerofill, false)
             }
-            DataType::UnsignedTinyInt(zerofill) => {
+            DataType::TinyIntUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "TINYINT", zerofill, true)
             }
             DataType::Int2(zerofill) => {
                 format_type_with_optional_length(f, "INT2", zerofill, false)
             }
-            DataType::UnsignedInt2(zerofill) => {
+            DataType::Int2Unsigned(zerofill) => {
                 format_type_with_optional_length(f, "INT2", zerofill, true)
             }
             DataType::SmallInt(zerofill) => {
                 format_type_with_optional_length(f, "SMALLINT", zerofill, false)
             }
-            DataType::UnsignedSmallInt(zerofill) => {
+            DataType::SmallIntUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "SMALLINT", zerofill, true)
             }
             DataType::MediumInt(zerofill) => {
                 format_type_with_optional_length(f, "MEDIUMINT", zerofill, false)
             }
-            DataType::UnsignedMediumInt(zerofill) => {
+            DataType::MediumIntUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "MEDIUMINT", zerofill, true)
             }
             DataType::Int(zerofill) => format_type_with_optional_length(f, "INT", zerofill, false),
-            DataType::UnsignedInt(zerofill) => {
+            DataType::IntUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "INT", zerofill, true)
             }
             DataType::Int4(zerofill) => {
@@ -417,24 +552,39 @@ impl fmt::Display for DataType {
             DataType::Int256 => {
                 write!(f, "Int256")
             }
-            DataType::UnsignedInt4(zerofill) => {
+            DataType::HugeInt => {
+                write!(f, "HUGEINT")
+            }
+            DataType::Int4Unsigned(zerofill) => {
                 format_type_with_optional_length(f, "INT4", zerofill, true)
             }
             DataType::Integer(zerofill) => {
                 format_type_with_optional_length(f, "INTEGER", zerofill, false)
             }
-            DataType::UnsignedInteger(zerofill) => {
+            DataType::IntegerUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "INTEGER", zerofill, true)
             }
             DataType::BigInt(zerofill) => {
                 format_type_with_optional_length(f, "BIGINT", zerofill, false)
             }
-            DataType::UnsignedBigInt(zerofill) => {
+            DataType::BigIntUnsigned(zerofill) => {
                 format_type_with_optional_length(f, "BIGINT", zerofill, true)
             }
-            DataType::UnsignedInt8(zerofill) => {
+            DataType::Int8Unsigned(zerofill) => {
                 format_type_with_optional_length(f, "INT8", zerofill, true)
             }
+            DataType::UTinyInt => {
+                write!(f, "UTINYINT")
+            }
+            DataType::USmallInt => {
+                write!(f, "USMALLINT")
+            }
+            DataType::UBigInt => {
+                write!(f, "UBIGINT")
+            }
+            DataType::UHugeInt => {
+                write!(f, "UHUGEINT")
+            }
             DataType::UInt8 => {
                 write!(f, "UInt8")
             }
@@ -453,11 +603,23 @@ impl fmt::Display for DataType {
             DataType::UInt256 => {
                 write!(f, "UInt256")
             }
+            DataType::Signed => {
+                write!(f, "SIGNED")
+            }
+            DataType::SignedInteger => {
+                write!(f, "SIGNED INTEGER")
+            }
+            DataType::Unsigned => {
+                write!(f, "UNSIGNED")
+            }
+            DataType::UnsignedInteger => {
+                write!(f, "UNSIGNED INTEGER")
+            }
             DataType::Real => write!(f, "REAL"),
             DataType::Float4 => write!(f, "FLOAT4"),
             DataType::Float32 => write!(f, "Float32"),
             DataType::Float64 => write!(f, "FLOAT64"),
-            DataType::Double => write!(f, "DOUBLE"),
+            DataType::Double(info) => write!(f, "DOUBLE{info}"),
             DataType::Float8 => write!(f, "FLOAT8"),
             DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"),
             DataType::Bool => write!(f, "BOOL"),
@@ -473,6 +635,7 @@ impl fmt::Display for DataType {
             DataType::Timestamp(precision, timezone_info) => {
                 format_datetime_precision_and_tz(f, "TIMESTAMP", precision, timezone_info)
             }
+            DataType::TimestampNtz => write!(f, "TIMESTAMP_NTZ"),
             DataType::Datetime64(precision, timezone) => {
                 format_clickhouse_datetime_precision_and_timezone(
                     f,
@@ -481,13 +644,30 @@ impl fmt::Display for DataType {
                     timezone,
                 )
             }
-            DataType::Interval => write!(f, "INTERVAL"),
+            DataType::Interval { fields, precision } => {
+                write!(f, "INTERVAL")?;
+                if let Some(fields) = fields {
+                    write!(f, " {fields}")?;
+                }
+                if let Some(precision) = precision {
+                    write!(f, "({precision})")?;
+                }
+                Ok(())
+            }
             DataType::JSON => write!(f, "JSON"),
             DataType::JSONB => write!(f, "JSONB"),
             DataType::Regclass => write!(f, "REGCLASS"),
             DataType::Text => write!(f, "TEXT"),
+            DataType::TinyText => write!(f, "TINYTEXT"),
+            DataType::MediumText => write!(f, "MEDIUMTEXT"),
+            DataType::LongText => write!(f, "LONGTEXT"),
             DataType::String(size) => format_type_with_optional_length(f, "STRING", size, false),
             DataType::Bytea => write!(f, "BYTEA"),
+            DataType::Bit(size) => format_type_with_optional_length(f, "BIT", size, false),
+            DataType::BitVarying(size) => {
+                format_type_with_optional_length(f, "BIT VARYING", size, false)
+            }
+            DataType::VarBit(size) => format_type_with_optional_length(f, "VARBIT", size, false),
             DataType::Array(ty) => match ty {
                 ArrayElemTypeDef::None => write!(f, "ARRAY"),
                 ArrayElemTypeDef::SquareBracket(t, None) => write!(f, "{t}[]"),
@@ -502,13 +682,24 @@ impl fmt::Display for DataType {
                     write!(f, "{}({})", ty, modifiers.join(", "))
                 }
             }
-            DataType::Enum(vals) => {
-                write!(f, "ENUM(")?;
+            DataType::Enum(vals, bits) => {
+                match bits {
+                    Some(bits) => write!(f, "ENUM{bits}"),
+                    None => write!(f, "ENUM"),
+                }?;
+                write!(f, "(")?;
                 for (i, v) in vals.iter().enumerate() {
                     if i != 0 {
                         write!(f, ", ")?;
                     }
-                    write!(f, "'{}'", escape_single_quote_string(v))?;
+                    match v {
+                        EnumMember::Name(name) => {
+                            write!(f, "'{}'", escape_single_quote_string(name))?
+                        }
+                        EnumMember::NamedValue(name, value) => {
+                            write!(f, "'{}' = {}", escape_single_quote_string(name), value)?
+                        }
+                    }
                 }
                 write!(f, ")")
             }
@@ -541,16 +732,16 @@ impl fmt::Display for DataType {
             }
             // ClickHouse
             DataType::Nullable(data_type) => {
-                write!(f, "Nullable({})", data_type)
+                write!(f, "Nullable({data_type})")
             }
             DataType::FixedString(character_length) => {
-                write!(f, "FixedString({})", character_length)
+                write!(f, "FixedString({character_length})")
             }
             DataType::LowCardinality(data_type) => {
-                write!(f, "LowCardinality({})", data_type)
+                write!(f, "LowCardinality({data_type})")
             }
             DataType::Map(key_data_type, value_data_type) => {
-                write!(f, "Map({}, {})", key_data_type, value_data_type)
+                write!(f, "Map({key_data_type}, {value_data_type})")
             }
             DataType::Tuple(fields) => {
                 write!(f, "Tuple({})", display_comma_separated(fields))
@@ -560,6 +751,21 @@ impl fmt::Display for DataType {
             }
             DataType::Unspecified => Ok(()),
             DataType::Trigger => write!(f, "TRIGGER"),
+            DataType::AnyType => write!(f, "ANY TYPE"),
+            DataType::Table(fields) => match fields {
+                Some(fields) => {
+                    write!(f, "TABLE({})", display_comma_separated(fields))
+                }
+                None => {
+                    write!(f, "TABLE")
+                }
+            },
+            DataType::NamedTable { name, columns } => {
+                write!(f, "{} TABLE ({})", name, display_comma_separated(columns))
+            }
+            DataType::GeometricType(kind) => write!(f, "{kind}"),
+            DataType::TsVector => write!(f, "TSVECTOR"),
+            DataType::TsQuery => write!(f, "TSQUERY"),
         }
     }
 }
@@ -592,6 +798,18 @@ fn format_character_string_type(
     Ok(())
 }
 
+fn format_varbinary_type(
+    f: &mut fmt::Formatter,
+    sql_type: &str,
+    size: &Option<BinaryLength>,
+) -> fmt::Result {
+    write!(f, "{sql_type}")?;
+    if let Some(size) = size {
+        write!(f, "({size})")?;
+    }
+    Ok(())
+}
+
 fn format_datetime_precision_and_tz(
     f: &mut fmt::Formatter,
     sql_type: &'static str,
@@ -649,19 +867,19 @@ pub enum StructBracketKind {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum TimezoneInfo {
-    /// No information about time zone. E.g., TIMESTAMP
+    /// No information about time zone, e.g. TIMESTAMP
     None,
-    /// Temporal type 'WITH TIME ZONE'. E.g., TIMESTAMP WITH TIME ZONE, [standard], [Oracle]
+    /// Temporal type 'WITH TIME ZONE', e.g. TIMESTAMP WITH TIME ZONE, [SQL Standard], [Oracle]
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
     /// [Oracle]: https://docs.oracle.com/en/database/oracle/oracle-database/12.2/nlspg/datetime-data-types-and-time-zone-support.html#GUID-3F1C388E-C651-43D5-ADBC-1A49E5C2CA05
     WithTimeZone,
-    /// Temporal type 'WITHOUT TIME ZONE'. E.g., TIME WITHOUT TIME ZONE, [standard], [Postgresql]
+    /// Temporal type 'WITHOUT TIME ZONE', e.g. TIME WITHOUT TIME ZONE, [SQL Standard], [Postgresql]
     ///
-    /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
+    /// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type
     /// [Postgresql]: https://www.postgresql.org/docs/current/datatype-datetime.html
     WithoutTimeZone,
-    /// Postgresql specific `WITH TIME ZONE` formatting, for both TIME and TIMESTAMP. E.g., TIMETZ, [Postgresql]
+    /// Postgresql specific `WITH TIME ZONE` formatting, for both TIME and TIMESTAMP, e.g. TIMETZ, [Postgresql]
     ///
     /// [Postgresql]: https://www.postgresql.org/docs/current/datatype-datetime.html
     Tz,
@@ -689,19 +907,61 @@ impl fmt::Display for TimezoneInfo {
     }
 }
 
+/// Fields for [Postgres] `INTERVAL` type.
+///
+/// [Postgres]: https://www.postgresql.org/docs/17/datatype-datetime.html
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum IntervalFields {
+    Year,
+    Month,
+    Day,
+    Hour,
+    Minute,
+    Second,
+    YearToMonth,
+    DayToHour,
+    DayToMinute,
+    DayToSecond,
+    HourToMinute,
+    HourToSecond,
+    MinuteToSecond,
+}
+
+impl fmt::Display for IntervalFields {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            IntervalFields::Year => write!(f, "YEAR"),
+            IntervalFields::Month => write!(f, "MONTH"),
+            IntervalFields::Day => write!(f, "DAY"),
+            IntervalFields::Hour => write!(f, "HOUR"),
+            IntervalFields::Minute => write!(f, "MINUTE"),
+            IntervalFields::Second => write!(f, "SECOND"),
+            IntervalFields::YearToMonth => write!(f, "YEAR TO MONTH"),
+            IntervalFields::DayToHour => write!(f, "DAY TO HOUR"),
+            IntervalFields::DayToMinute => write!(f, "DAY TO MINUTE"),
+            IntervalFields::DayToSecond => write!(f, "DAY TO SECOND"),
+            IntervalFields::HourToMinute => write!(f, "HOUR TO MINUTE"),
+            IntervalFields::HourToSecond => write!(f, "HOUR TO SECOND"),
+            IntervalFields::MinuteToSecond => write!(f, "MINUTE TO SECOND"),
+        }
+    }
+}
+
 /// Additional information for `NUMERIC`, `DECIMAL`, and `DEC` data types
-/// following the 2016 [standard].
+/// following the 2016 [SQL Standard].
 ///
-/// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type
+/// [SQL Standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#exact-numeric-type
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum ExactNumberInfo {
-    /// No additional information e.g. `DECIMAL`
+    /// No additional information, e.g. `DECIMAL`
     None,
-    /// Only precision information e.g. `DECIMAL(10)`
+    /// Only precision information, e.g. `DECIMAL(10)`
     Precision(u64),
-    /// Precision and scale information e.g. `DECIMAL(10,2)`
+    /// Precision and scale information, e.g. `DECIMAL(10,2)`
     PrecisionAndScale(u64, u64),
 }
 
@@ -742,7 +1002,7 @@ impl fmt::Display for CharacterLength {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
             CharacterLength::IntegerLength { length, unit } => {
-                write!(f, "{}", length)?;
+                write!(f, "{length}")?;
                 if let Some(unit) = unit {
                     write!(f, " {unit}")?;
                 }
@@ -755,7 +1015,7 @@ impl fmt::Display for CharacterLength {
     }
 }
 
-/// Possible units for characters, initially based on 2016 ANSI [standard][1].
+/// Possible units for characters, initially based on 2016 ANSI [SQL Standard][1].
 ///
 /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#char-length-units
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -781,6 +1041,32 @@ impl fmt::Display for CharLengthUnits {
     }
 }
 
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum BinaryLength {
+    IntegerLength {
+        /// Default (if VARYING)
+        length: u64,
+    },
+    /// VARBINARY(MAX) used in T-SQL (Microsoft SQL Server)
+    Max,
+}
+
+impl fmt::Display for BinaryLength {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            BinaryLength::IntegerLength { length } => {
+                write!(f, "{length}")?;
+            }
+            BinaryLength::Max => {
+                write!(f, "MAX")?;
+            }
+        }
+        Ok(())
+    }
+}
+
 /// Represents the data type of the elements in an array (if any) as well as
 /// the syntax used to declare the array.
 ///
@@ -798,3 +1084,34 @@ pub enum ArrayElemTypeDef {
     /// `Array(Int64)`
     Parenthesis(Box<DataType>),
 }
+
+/// Represents different types of geometric shapes which are commonly used in
+/// PostgreSQL/Redshift for spatial operations and geometry-related computations.
+///
+/// [PostgreSQL]: https://www.postgresql.org/docs/9.5/functions-geometry.html
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum GeometricTypeKind {
+    Point,
+    Line,
+    LineSegment,
+    GeometricBox,
+    GeometricPath,
+    Polygon,
+    Circle,
+}
+
+impl fmt::Display for GeometricTypeKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            GeometricTypeKind::Point => write!(f, "point"),
+            GeometricTypeKind::Line => write!(f, "line"),
+            GeometricTypeKind::LineSegment => write!(f, "lseg"),
+            GeometricTypeKind::GeometricBox => write!(f, "box"),
+            GeometricTypeKind::GeometricPath => write!(f, "path"),
+            GeometricTypeKind::Polygon => write!(f, "polygon"),
+            GeometricTypeKind::Circle => write!(f, "circle"),
+        }
+    }
+}
diff --git a/src/ast/dcl.rs b/src/ast/dcl.rs
index d47476ffa..079894075 100644
--- a/src/ast/dcl.rs
+++ b/src/ast/dcl.rs
@@ -28,7 +28,7 @@ use serde::{Deserialize, Serialize};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
-use super::{Expr, Ident, Password};
+use super::{display_comma_separated, Expr, Ident, Password};
 use crate::ast::{display_separated, ObjectName};
 
 /// An option in `ROLE` statement.
@@ -173,7 +173,7 @@ impl fmt::Display for AlterRoleOperation {
                 in_database,
             } => {
                 if let Some(database_name) = in_database {
-                    write!(f, "IN DATABASE {} ", database_name)?;
+                    write!(f, "IN DATABASE {database_name} ")?;
                 }
 
                 match config_value {
@@ -187,7 +187,7 @@ impl fmt::Display for AlterRoleOperation {
                 in_database,
             } => {
                 if let Some(database_name) = in_database {
-                    write!(f, "IN DATABASE {} ", database_name)?;
+                    write!(f, "IN DATABASE {database_name} ")?;
                 }
 
                 match config_name {
@@ -204,24 +204,51 @@ impl fmt::Display for AlterRoleOperation {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum Use {
-    Catalog(ObjectName),   // e.g. `USE CATALOG foo.bar`
-    Schema(ObjectName),    // e.g. `USE SCHEMA foo.bar`
-    Database(ObjectName),  // e.g. `USE DATABASE foo.bar`
-    Warehouse(ObjectName), // e.g. `USE WAREHOUSE foo.bar`
-    Object(ObjectName),    // e.g. `USE foo.bar`
-    Default,               // e.g. `USE DEFAULT`
+    Catalog(ObjectName),            // e.g. `USE CATALOG foo.bar`
+    Schema(ObjectName),             // e.g. `USE SCHEMA foo.bar`
+    Database(ObjectName),           // e.g. `USE DATABASE foo.bar`
+    Warehouse(ObjectName),          // e.g. `USE WAREHOUSE foo.bar`
+    Role(ObjectName),               // e.g. `USE ROLE PUBLIC`
+    SecondaryRoles(SecondaryRoles), // e.g. `USE SECONDARY ROLES ALL`
+    Object(ObjectName),             // e.g. `USE foo.bar`
+    Default,                        // e.g. `USE DEFAULT`
 }
 
 impl fmt::Display for Use {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         f.write_str("USE ")?;
         match self {
-            Use::Catalog(name) => write!(f, "CATALOG {}", name),
-            Use::Schema(name) => write!(f, "SCHEMA {}", name),
-            Use::Database(name) => write!(f, "DATABASE {}", name),
-            Use::Warehouse(name) => write!(f, "WAREHOUSE {}", name),
-            Use::Object(name) => write!(f, "{}", name),
+            Use::Catalog(name) => write!(f, "CATALOG {name}"),
+            Use::Schema(name) => write!(f, "SCHEMA {name}"),
+            Use::Database(name) => write!(f, "DATABASE {name}"),
+            Use::Warehouse(name) => write!(f, "WAREHOUSE {name}"),
+            Use::Role(name) => write!(f, "ROLE {name}"),
+            Use::SecondaryRoles(secondary_roles) => {
+                write!(f, "SECONDARY ROLES {secondary_roles}")
+            }
+            Use::Object(name) => write!(f, "{name}"),
             Use::Default => write!(f, "DEFAULT"),
         }
     }
 }
+
+/// Snowflake `SECONDARY ROLES` USE variant
+/// See: <https://docs.snowflake.com/en/sql-reference/sql/use-secondary-roles>
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SecondaryRoles {
+    All,
+    None,
+    List(Vec<Ident>),
+}
+
+impl fmt::Display for SecondaryRoles {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            SecondaryRoles::All => write!(f, "ALL"),
+            SecondaryRoles::None => write!(f, "NONE"),
+            SecondaryRoles::List(roles) => write!(f, "{}", display_comma_separated(roles)),
+        }
+    }
+}
diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs
index 21a716d25..4d1fc4628 100644
--- a/src/ast/ddl.rs
+++ b/src/ast/ddl.rs
@@ -30,19 +30,48 @@ use sqlparser_derive::{Visit, VisitMut};
 
 use crate::ast::value::escape_single_quote_string;
 use crate::ast::{
-    display_comma_separated, display_separated, DataType, Expr, Ident, MySQLColumnPosition,
-    ObjectName, OrderByExpr, ProjectionSelect, SequenceOptions, SqlOption, Tag, Value,
+    display_comma_separated, display_separated, ArgMode, CommentDef, CreateFunctionBody,
+    CreateFunctionUsing, DataType, Expr, FunctionBehavior, FunctionCalledOnNull,
+    FunctionDeterminismSpecifier, FunctionParallel, Ident, IndexColumn, MySQLColumnPosition,
+    ObjectName, OperateFunctionArg, OrderByExpr, ProjectionSelect, SequenceOptions, Spanned,
+    SqlOption, Tag, Value, ValueWithSpan,
 };
 use crate::keywords::Keyword;
-use crate::tokenizer::Token;
+use crate::tokenizer::{Span, Token};
+
+/// ALTER TABLE operation REPLICA IDENTITY values
+/// See [Postgres ALTER TABLE docs](https://www.postgresql.org/docs/current/sql-altertable.html)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ReplicaIdentity {
+    None,
+    Full,
+    Default,
+    Index(Ident),
+}
+
+impl fmt::Display for ReplicaIdentity {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ReplicaIdentity::None => f.write_str("NONE"),
+            ReplicaIdentity::Full => f.write_str("FULL"),
+            ReplicaIdentity::Default => f.write_str("DEFAULT"),
+            ReplicaIdentity::Index(idx) => write!(f, "USING INDEX {idx}"),
+        }
+    }
+}
 
 /// An `ALTER TABLE` (`Statement::AlterTable`) operation
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum AlterTableOperation {
-    /// `ADD <table_constraint>`
-    AddConstraint(TableConstraint),
+    /// `ADD <table_constraint> [NOT VALID]`
+    AddConstraint {
+        constraint: TableConstraint,
+        not_valid: bool,
+    },
     /// `ADD [COLUMN] [IF NOT EXISTS] <column_def>`
     AddColumn {
         /// `[COLUMN]`.
@@ -63,13 +92,14 @@ pub enum AlterTableOperation {
         name: Ident,
         select: ProjectionSelect,
     },
-
     /// `DROP PROJECTION [IF EXISTS] name`
     ///
     /// Note: this is a ClickHouse-specific operation.
     /// Please refer to [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/alter/projection#drop-projection)
-    DropProjection { if_exists: bool, name: Ident },
-
+    DropProjection {
+        if_exists: bool,
+        name: Ident,
+    },
     /// `MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]`
     ///
     ///  Note: this is a ClickHouse-specific operation.
@@ -79,7 +109,6 @@ pub enum AlterTableOperation {
         name: Ident,
         partition: Option<Ident>,
     },
-
     /// `CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name]`
     ///
     /// Note: this is a ClickHouse-specific operation.
@@ -89,7 +118,6 @@ pub enum AlterTableOperation {
         name: Ident,
         partition: Option<Ident>,
     },
-
     /// `DISABLE ROW LEVEL SECURITY`
     ///
     /// Note: this is a PostgreSQL-specific operation.
@@ -97,26 +125,31 @@ pub enum AlterTableOperation {
     /// `DISABLE RULE rewrite_rule_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    DisableRule { name: Ident },
+    DisableRule {
+        name: Ident,
+    },
     /// `DISABLE TRIGGER [ trigger_name | ALL | USER ]`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    DisableTrigger { name: Ident },
+    DisableTrigger {
+        name: Ident,
+    },
     /// `DROP CONSTRAINT [ IF EXISTS ] <name>`
     DropConstraint {
         if_exists: bool,
         name: Ident,
-        cascade: bool,
+        drop_behavior: Option<DropBehavior>,
     },
-    /// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ CASCADE ]`
+    /// `DROP [ COLUMN ] [ IF EXISTS ] <column_name> [ , <column_name>, ... ] [ CASCADE ]`
     DropColumn {
-        column_name: Ident,
+        has_column_keyword: bool,
+        column_names: Vec<Ident>,
         if_exists: bool,
-        cascade: bool,
+        drop_behavior: Option<DropBehavior>,
     },
     /// `ATTACH PART|PARTITION <partition_expr>`
     /// Note: this is a ClickHouse-specific operation, please refer to
-    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/alter/pakrtition#attach-partitionpart)
+    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/alter/partition#attach-partitionpart)
     AttachPartition {
         // PART is not a short form of PARTITION, it's a separate keyword
         // which represents a physical file on disk and partition is a logical entity.
@@ -145,24 +178,48 @@ pub enum AlterTableOperation {
     },
     /// `DROP PRIMARY KEY`
     ///
-    /// Note: this is a MySQL-specific operation.
+    /// Note: this is a [MySQL]-specific operation.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
     DropPrimaryKey,
+    /// `DROP FOREIGN KEY <fk_symbol>`
+    ///
+    /// Note: this is a [MySQL]-specific operation.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+    DropForeignKey {
+        name: Ident,
+    },
+    /// `DROP INDEX <index_name>`
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+    DropIndex {
+        name: Ident,
+    },
     /// `ENABLE ALWAYS RULE rewrite_rule_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableAlwaysRule { name: Ident },
+    EnableAlwaysRule {
+        name: Ident,
+    },
     /// `ENABLE ALWAYS TRIGGER trigger_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableAlwaysTrigger { name: Ident },
+    EnableAlwaysTrigger {
+        name: Ident,
+    },
     /// `ENABLE REPLICA RULE rewrite_rule_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableReplicaRule { name: Ident },
+    EnableReplicaRule {
+        name: Ident,
+    },
     /// `ENABLE REPLICA TRIGGER trigger_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableReplicaTrigger { name: Ident },
+    EnableReplicaTrigger {
+        name: Ident,
+    },
     /// `ENABLE ROW LEVEL SECURITY`
     ///
     /// Note: this is a PostgreSQL-specific operation.
@@ -170,16 +227,27 @@ pub enum AlterTableOperation {
     /// `ENABLE RULE rewrite_rule_name`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableRule { name: Ident },
+    EnableRule {
+        name: Ident,
+    },
     /// `ENABLE TRIGGER [ trigger_name | ALL | USER ]`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    EnableTrigger { name: Ident },
+    EnableTrigger {
+        name: Ident,
+    },
     /// `RENAME TO PARTITION (partition=val)`
     RenamePartitions {
         old_partitions: Vec<Expr>,
         new_partitions: Vec<Expr>,
     },
+    /// REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }
+    ///
+    /// Note: this is a PostgreSQL-specific operation.
+    /// Please refer to [PostgreSQL documentation](https://www.postgresql.org/docs/current/sql-altertable.html)
+    ReplicaIdentity {
+        identity: ReplicaIdentity,
+    },
     /// Add Partitions
     AddPartitions {
         if_not_exists: bool,
@@ -195,7 +263,9 @@ pub enum AlterTableOperation {
         new_column_name: Ident,
     },
     /// `RENAME TO <table_name>`
-    RenameTable { table_name: ObjectName },
+    RenameTable {
+        table_name: RenameTableNameKind,
+    },
     // CHANGE [ COLUMN ] <old_name> <new_name> <data_type> [ <options> ]
     ChangeColumn {
         old_name: Ident,
@@ -216,7 +286,10 @@ pub enum AlterTableOperation {
     /// `RENAME CONSTRAINT <old_constraint_name> TO <new_constraint_name>`
     ///
     /// Note: this is a PostgreSQL-specific operation.
-    RenameConstraint { old_name: Ident, new_name: Ident },
+    RenameConstraint {
+        old_name: Ident,
+        new_name: Ident,
+    },
     /// `ALTER [ COLUMN ]`
     AlterColumn {
         column_name: Ident,
@@ -225,14 +298,69 @@ pub enum AlterTableOperation {
     /// 'SWAP WITH <table_name>'
     ///
     /// Note: this is Snowflake specific <https://docs.snowflake.com/en/sql-reference/sql/alter-table>
-    SwapWith { table_name: ObjectName },
+    SwapWith {
+        table_name: ObjectName,
+    },
     /// 'SET TBLPROPERTIES ( { property_key [ = ] property_val } [, ...] )'
-    SetTblProperties { table_properties: Vec<SqlOption> },
-
+    SetTblProperties {
+        table_properties: Vec<SqlOption>,
+    },
     /// `OWNER TO { <new_owner> | CURRENT_ROLE | CURRENT_USER | SESSION_USER }`
     ///
     /// Note: this is PostgreSQL-specific <https://www.postgresql.org/docs/current/sql-altertable.html>
-    OwnerTo { new_owner: Owner },
+    OwnerTo {
+        new_owner: Owner,
+    },
+    /// Snowflake table clustering options
+    /// <https://docs.snowflake.com/en/sql-reference/sql/alter-table#clustering-actions-clusteringaction>
+    ClusterBy {
+        exprs: Vec<Expr>,
+    },
+    DropClusteringKey,
+    SuspendRecluster,
+    ResumeRecluster,
+    /// `ALGORITHM [=] { DEFAULT | INSTANT | INPLACE | COPY }`
+    ///
+    /// [MySQL]-specific table alter algorithm.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+    Algorithm {
+        equals: bool,
+        algorithm: AlterTableAlgorithm,
+    },
+
+    /// `LOCK [=] { DEFAULT | NONE | SHARED | EXCLUSIVE }`
+    ///
+    /// [MySQL]-specific table alter lock.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+    Lock {
+        equals: bool,
+        lock: AlterTableLock,
+    },
+    /// `AUTO_INCREMENT [=] <value>`
+    ///
+    /// [MySQL]-specific table option for raising current auto increment value.
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+    AutoIncrement {
+        equals: bool,
+        value: ValueWithSpan,
+    },
+    /// `VALIDATE CONSTRAINT <name>`
+    ValidateConstraint {
+        name: Ident,
+    },
+    /// Arbitrary parenthesized `SET` options.
+    ///
+    /// Example:
+    /// ```sql
+    /// SET (scale_factor = 0.01, threshold = 500)`
+    /// ```
+    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-altertable.html)
+    SetOptionsParens {
+        options: Vec<SqlOption>,
+    },
 }
 
 /// An `ALTER Policy` (`Statement::AlterPolicy`) operation
@@ -278,6 +406,54 @@ impl fmt::Display for AlterPolicyOperation {
     }
 }
 
+/// [MySQL] `ALTER TABLE` algorithm.
+///
+/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AlterTableAlgorithm {
+    Default,
+    Instant,
+    Inplace,
+    Copy,
+}
+
+impl fmt::Display for AlterTableAlgorithm {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            Self::Default => "DEFAULT",
+            Self::Instant => "INSTANT",
+            Self::Inplace => "INPLACE",
+            Self::Copy => "COPY",
+        })
+    }
+}
+
+/// [MySQL] `ALTER TABLE` lock.
+///
+/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AlterTableLock {
+    Default,
+    None,
+    Shared,
+    Exclusive,
+}
+
+impl fmt::Display for AlterTableLock {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            Self::Default => "DEFAULT",
+            Self::None => "NONE",
+            Self::Shared => "SHARED",
+            Self::Exclusive => "EXCLUSIVE",
+        })
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -291,7 +467,7 @@ pub enum Owner {
 impl fmt::Display for Owner {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            Owner::Ident(ident) => write!(f, "{}", ident),
+            Owner::Ident(ident) => write!(f, "{ident}"),
             Owner::CurrentRole => write!(f, "CURRENT_ROLE"),
             Owner::CurrentUser => write!(f, "CURRENT_USER"),
             Owner::SessionUser => write!(f, "SESSION_USER"),
@@ -299,6 +475,23 @@ impl fmt::Display for Owner {
     }
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AlterConnectorOwner {
+    User(Ident),
+    Role(Ident),
+}
+
+impl fmt::Display for AlterConnectorOwner {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            AlterConnectorOwner::User(ident) => write!(f, "USER {ident}"),
+            AlterConnectorOwner::Role(ident) => write!(f, "ROLE {ident}"),
+        }
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -318,7 +511,16 @@ impl fmt::Display for AlterTableOperation {
                 display_separated(new_partitions, " "),
                 ine = if *if_not_exists { " IF NOT EXISTS" } else { "" }
             ),
-            AlterTableOperation::AddConstraint(c) => write!(f, "ADD {c}"),
+            AlterTableOperation::AddConstraint {
+                not_valid,
+                constraint,
+            } => {
+                write!(f, "ADD {constraint}")?;
+                if *not_valid {
+                    write!(f, " NOT VALID")?;
+                }
+                Ok(())
+            }
             AlterTableOperation::AddColumn {
                 column_keyword,
                 if_not_exists,
@@ -349,14 +551,22 @@ impl fmt::Display for AlterTableOperation {
                 if *if_not_exists {
                     write!(f, " IF NOT EXISTS")?;
                 }
-                write!(f, " {} ({})", name, query)
+                write!(f, " {name} ({query})")
+            }
+            AlterTableOperation::Algorithm { equals, algorithm } => {
+                write!(
+                    f,
+                    "ALGORITHM {}{}",
+                    if *equals { "= " } else { "" },
+                    algorithm
+                )
             }
             AlterTableOperation::DropProjection { if_exists, name } => {
                 write!(f, "DROP PROJECTION")?;
                 if *if_exists {
                     write!(f, " IF EXISTS")?;
                 }
-                write!(f, " {}", name)
+                write!(f, " {name}")
             }
             AlterTableOperation::MaterializeProjection {
                 if_exists,
@@ -367,9 +577,9 @@ impl fmt::Display for AlterTableOperation {
                 if *if_exists {
                     write!(f, " IF EXISTS")?;
                 }
-                write!(f, " {}", name)?;
+                write!(f, " {name}")?;
                 if let Some(partition) = partition {
-                    write!(f, " IN PARTITION {}", partition)?;
+                    write!(f, " IN PARTITION {partition}")?;
                 }
                 Ok(())
             }
@@ -382,9 +592,9 @@ impl fmt::Display for AlterTableOperation {
                 if *if_exists {
                     write!(f, " IF EXISTS")?;
                 }
-                write!(f, " {}", name)?;
+                write!(f, " {name}")?;
                 if let Some(partition) = partition {
-                    write!(f, " IN PARTITION {}", partition)?;
+                    write!(f, " IN PARTITION {partition}")?;
                 }
                 Ok(())
             }
@@ -412,27 +622,39 @@ impl fmt::Display for AlterTableOperation {
             AlterTableOperation::DropConstraint {
                 if_exists,
                 name,
-                cascade,
+                drop_behavior,
             } => {
                 write!(
                     f,
                     "DROP CONSTRAINT {}{}{}",
                     if *if_exists { "IF EXISTS " } else { "" },
                     name,
-                    if *cascade { " CASCADE" } else { "" },
+                    match drop_behavior {
+                        None => "",
+                        Some(DropBehavior::Restrict) => " RESTRICT",
+                        Some(DropBehavior::Cascade) => " CASCADE",
+                    }
                 )
             }
             AlterTableOperation::DropPrimaryKey => write!(f, "DROP PRIMARY KEY"),
+            AlterTableOperation::DropForeignKey { name } => write!(f, "DROP FOREIGN KEY {name}"),
+            AlterTableOperation::DropIndex { name } => write!(f, "DROP INDEX {name}"),
             AlterTableOperation::DropColumn {
-                column_name,
+                has_column_keyword,
+                column_names: column_name,
                 if_exists,
-                cascade,
+                drop_behavior,
             } => write!(
                 f,
-                "DROP COLUMN {}{}{}",
+                "DROP {}{}{}{}",
+                if *has_column_keyword { "COLUMN " } else { "" },
                 if *if_exists { "IF EXISTS " } else { "" },
-                column_name,
-                if *cascade { " CASCADE" } else { "" }
+                display_comma_separated(column_name),
+                match drop_behavior {
+                    None => "",
+                    Some(DropBehavior::Restrict) => " RESTRICT",
+                    Some(DropBehavior::Cascade) => " CASCADE",
+                }
             ),
             AlterTableOperation::AttachPartition { partition } => {
                 write!(f, "ATTACH {partition}")
@@ -475,7 +697,7 @@ impl fmt::Display for AlterTableOperation {
                 new_column_name,
             } => write!(f, "RENAME COLUMN {old_column_name} TO {new_column_name}"),
             AlterTableOperation::RenameTable { table_name } => {
-                write!(f, "RENAME TO {table_name}")
+                write!(f, "RENAME {table_name}")
             }
             AlterTableOperation::ChangeColumn {
                 old_name,
@@ -546,6 +768,42 @@ impl fmt::Display for AlterTableOperation {
                 }
                 Ok(())
             }
+            AlterTableOperation::ClusterBy { exprs } => {
+                write!(f, "CLUSTER BY ({})", display_comma_separated(exprs))?;
+                Ok(())
+            }
+            AlterTableOperation::DropClusteringKey => {
+                write!(f, "DROP CLUSTERING KEY")?;
+                Ok(())
+            }
+            AlterTableOperation::SuspendRecluster => {
+                write!(f, "SUSPEND RECLUSTER")?;
+                Ok(())
+            }
+            AlterTableOperation::ResumeRecluster => {
+                write!(f, "RESUME RECLUSTER")?;
+                Ok(())
+            }
+            AlterTableOperation::AutoIncrement { equals, value } => {
+                write!(
+                    f,
+                    "AUTO_INCREMENT {}{}",
+                    if *equals { "= " } else { "" },
+                    value
+                )
+            }
+            AlterTableOperation::Lock { equals, lock } => {
+                write!(f, "LOCK {}{}", if *equals { "= " } else { "" }, lock)
+            }
+            AlterTableOperation::ReplicaIdentity { identity } => {
+                write!(f, "REPLICA IDENTITY {identity}")
+            }
+            AlterTableOperation::ValidateConstraint { name } => {
+                write!(f, "VALIDATE CONSTRAINT {name}")
+            }
+            AlterTableOperation::SetOptionsParens { options } => {
+                write!(f, "SET ({})", display_comma_separated(options))
+            }
         }
     }
 }
@@ -560,6 +818,95 @@ impl fmt::Display for AlterIndexOperation {
     }
 }
 
+/// An `ALTER TYPE` statement (`Statement::AlterType`)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct AlterType {
+    pub name: ObjectName,
+    pub operation: AlterTypeOperation,
+}
+
+/// An [AlterType] operation
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AlterTypeOperation {
+    Rename(AlterTypeRename),
+    AddValue(AlterTypeAddValue),
+    RenameValue(AlterTypeRenameValue),
+}
+
+/// See [AlterTypeOperation::Rename]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct AlterTypeRename {
+    pub new_name: Ident,
+}
+
+/// See [AlterTypeOperation::AddValue]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct AlterTypeAddValue {
+    pub if_not_exists: bool,
+    pub value: Ident,
+    pub position: Option<AlterTypeAddValuePosition>,
+}
+
+/// See [AlterTypeAddValue]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AlterTypeAddValuePosition {
+    Before(Ident),
+    After(Ident),
+}
+
+/// See [AlterTypeOperation::RenameValue]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct AlterTypeRenameValue {
+    pub from: Ident,
+    pub to: Ident,
+}
+
+impl fmt::Display for AlterTypeOperation {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            Self::Rename(AlterTypeRename { new_name }) => {
+                write!(f, "RENAME TO {new_name}")
+            }
+            Self::AddValue(AlterTypeAddValue {
+                if_not_exists,
+                value,
+                position,
+            }) => {
+                write!(f, "ADD VALUE")?;
+                if *if_not_exists {
+                    write!(f, " IF NOT EXISTS")?;
+                }
+                write!(f, " {value}")?;
+                match position {
+                    Some(AlterTypeAddValuePosition::Before(neighbor_value)) => {
+                        write!(f, " BEFORE {neighbor_value}")?;
+                    }
+                    Some(AlterTypeAddValuePosition::After(neighbor_value)) => {
+                        write!(f, " AFTER {neighbor_value}")?;
+                    }
+                    None => {}
+                };
+                Ok(())
+            }
+            Self::RenameValue(AlterTypeRenameValue { from, to }) => {
+                write!(f, "RENAME VALUE {from} TO {to}")
+            }
+        }
+    }
+}
+
 /// An `ALTER COLUMN` (`Statement::AlterTable`) operation
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -578,7 +925,10 @@ pub enum AlterColumnOperation {
         data_type: DataType,
         /// PostgreSQL specific
         using: Option<Expr>,
+        /// Set to true if the statement includes the `SET DATA TYPE` keywords
+        had_set: bool,
     },
+
     /// `ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]`
     ///
     /// Note: this is a PostgreSQL-specific operation.
@@ -596,15 +946,22 @@ impl fmt::Display for AlterColumnOperation {
             AlterColumnOperation::SetDefault { value } => {
                 write!(f, "SET DEFAULT {value}")
             }
-            AlterColumnOperation::DropDefault {} => {
+            AlterColumnOperation::DropDefault => {
                 write!(f, "DROP DEFAULT")
             }
-            AlterColumnOperation::SetDataType { data_type, using } => {
+            AlterColumnOperation::SetDataType {
+                data_type,
+                using,
+                had_set,
+            } => {
+                if *had_set {
+                    write!(f, "SET DATA ")?;
+                }
+                write!(f, "TYPE {data_type}")?;
                 if let Some(expr) = using {
-                    write!(f, "SET DATA TYPE {data_type} USING {expr}")
-                } else {
-                    write!(f, "SET DATA TYPE {data_type}")
+                    write!(f, " USING {expr}")?;
                 }
+                Ok(())
             }
             AlterColumnOperation::AddGenerated {
                 generated_as,
@@ -664,9 +1021,11 @@ pub enum TableConstraint {
         /// [1]: IndexType
         index_type: Option<IndexType>,
         /// Identifiers of the columns that are unique.
-        columns: Vec<Ident>,
+        columns: Vec<IndexColumn>,
         index_options: Vec<IndexOption>,
         characteristics: Option<ConstraintCharacteristics>,
+        /// Optional Postgres nulls handling: `[ NULLS [ NOT ] DISTINCT ]`
+        nulls_distinct: NullsDistinctOption,
     },
     /// MySQL [definition][1] for `PRIMARY KEY` constraints statements:\
     /// * `[CONSTRAINT [<name>]] PRIMARY KEY [index_name] [index_type] (<columns>) <index_options>`
@@ -698,7 +1057,7 @@ pub enum TableConstraint {
         /// [1]: IndexType
         index_type: Option<IndexType>,
         /// Identifiers of the columns that form the primary key.
-        columns: Vec<Ident>,
+        columns: Vec<IndexColumn>,
         index_options: Vec<IndexOption>,
         characteristics: Option<ConstraintCharacteristics>,
     },
@@ -709,6 +1068,9 @@ pub enum TableConstraint {
     /// }`).
     ForeignKey {
         name: Option<Ident>,
+        /// MySQL-specific field
+        /// <https://dev.mysql.com/doc/refman/8.4/en/create-table-foreign-keys.html>
+        index_name: Option<Ident>,
         columns: Vec<Ident>,
         foreign_table: ObjectName,
         referred_columns: Vec<Ident>,
@@ -716,10 +1078,13 @@ pub enum TableConstraint {
         on_update: Option<ReferentialAction>,
         characteristics: Option<ConstraintCharacteristics>,
     },
-    /// `[ CONSTRAINT <name> ] CHECK (<expr>)`
+    /// `[ CONSTRAINT <name> ] CHECK (<expr>) [[NOT] ENFORCED]`
     Check {
         name: Option<Ident>,
         expr: Box<Expr>,
+        /// MySQL-specific syntax
+        /// <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        enforced: Option<bool>,
     },
     /// MySQLs [index definition][1] for index creation. Not present on ANSI so, for now, the usage
     /// is restricted to MySQL, as no other dialects that support this syntax were found.
@@ -737,7 +1102,7 @@ pub enum TableConstraint {
         /// [1]: IndexType
         index_type: Option<IndexType>,
         /// Referred column identifier list.
-        columns: Vec<Ident>,
+        columns: Vec<IndexColumn>,
     },
     /// MySQLs [fulltext][1] definition. Since the [`SPATIAL`][2] definition is exactly the same,
     /// and MySQL displays both the same way, it is part of this definition as well.
@@ -760,7 +1125,7 @@ pub enum TableConstraint {
         /// Optional index name.
         opt_index_name: Option<Ident>,
         /// Referred column identifier list.
-        columns: Vec<Ident>,
+        columns: Vec<IndexColumn>,
     },
 }
 
@@ -775,10 +1140,11 @@ impl fmt::Display for TableConstraint {
                 columns,
                 index_options,
                 characteristics,
+                nulls_distinct,
             } => {
                 write!(
                     f,
-                    "{}UNIQUE{index_type_display:>}{}{} ({})",
+                    "{}UNIQUE{nulls_distinct}{index_type_display:>}{}{} ({})",
                     display_constraint_name(name),
                     display_option_spaced(index_name),
                     display_option(" USING ", "", index_type),
@@ -818,6 +1184,7 @@ impl fmt::Display for TableConstraint {
             }
             TableConstraint::ForeignKey {
                 name,
+                index_name,
                 columns,
                 foreign_table,
                 referred_columns,
@@ -827,12 +1194,15 @@ impl fmt::Display for TableConstraint {
             } => {
                 write!(
                     f,
-                    "{}FOREIGN KEY ({}) REFERENCES {}({})",
+                    "{}FOREIGN KEY{} ({}) REFERENCES {}",
                     display_constraint_name(name),
+                    display_option_spaced(index_name),
                     display_comma_separated(columns),
                     foreign_table,
-                    display_comma_separated(referred_columns),
                 )?;
+                if !referred_columns.is_empty() {
+                    write!(f, "({})", display_comma_separated(referred_columns))?;
+                }
                 if let Some(action) = on_delete {
                     write!(f, " ON DELETE {action}")?;
                 }
@@ -840,12 +1210,21 @@ impl fmt::Display for TableConstraint {
                     write!(f, " ON UPDATE {action}")?;
                 }
                 if let Some(characteristics) = characteristics {
-                    write!(f, " {}", characteristics)?;
+                    write!(f, " {characteristics}")?;
                 }
                 Ok(())
             }
-            TableConstraint::Check { name, expr } => {
-                write!(f, "{}CHECK ({})", display_constraint_name(name), expr)
+            TableConstraint::Check {
+                name,
+                expr,
+                enforced,
+            } => {
+                write!(f, "{}CHECK ({})", display_constraint_name(name), expr)?;
+                if let Some(b) = enforced {
+                    write!(f, " {}", if *b { "ENFORCED" } else { "NOT ENFORCED" })
+                } else {
+                    Ok(())
+                }
             }
             TableConstraint::Index {
                 display_as_key,
@@ -945,13 +1324,20 @@ impl fmt::Display for KeyOrIndexDisplay {
 /// [1]: https://dev.mysql.com/doc/refman/8.0/en/create-table.html
 /// [2]: https://dev.mysql.com/doc/refman/8.0/en/create-index.html
 /// [3]: https://www.postgresql.org/docs/14/sql-createindex.html
-#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum IndexType {
     BTree,
     Hash,
-    // TODO add Postgresql's possible indexes
+    GIN,
+    GiST,
+    SPGiST,
+    BRIN,
+    Bloom,
+    /// Users may define their own index types, which would
+    /// not be covered by the above variants.
+    Custom(Ident),
 }
 
 impl fmt::Display for IndexType {
@@ -959,6 +1345,12 @@ impl fmt::Display for IndexType {
         match self {
             Self::BTree => write!(f, "BTREE"),
             Self::Hash => write!(f, "HASH"),
+            Self::GIN => write!(f, "GIN"),
+            Self::GiST => write!(f, "GIST"),
+            Self::SPGiST => write!(f, "SPGIST"),
+            Self::BRIN => write!(f, "BRIN"),
+            Self::Bloom => write!(f, "BLOOM"),
+            Self::Custom(name) => write!(f, "{name}"),
         }
     }
 }
@@ -986,17 +1378,47 @@ impl fmt::Display for IndexOption {
     }
 }
 
+/// [PostgreSQL] unique index nulls handling option: `[ NULLS [ NOT ] DISTINCT ]`
+///
+/// [PostgreSQL]: https://www.postgresql.org/docs/17/sql-altertable.html
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum NullsDistinctOption {
+    /// Not specified
+    None,
+    /// NULLS DISTINCT
+    Distinct,
+    /// NULLS NOT DISTINCT
+    NotDistinct,
+}
+
+impl fmt::Display for NullsDistinctOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            Self::None => Ok(()),
+            Self::Distinct => write!(f, " NULLS DISTINCT"),
+            Self::NotDistinct => write!(f, " NULLS NOT DISTINCT"),
+        }
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct ProcedureParam {
     pub name: Ident,
     pub data_type: DataType,
+    pub mode: Option<ArgMode>,
 }
 
 impl fmt::Display for ProcedureParam {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{} {}", self.name, self.data_type)
+        if let Some(mode) = &self.mode {
+            write!(f, "{mode} {} {}", self.name, self.data_type)
+        } else {
+            write!(f, "{} {}", self.name, self.data_type)
+        }
     }
 }
 
@@ -1007,7 +1429,6 @@ impl fmt::Display for ProcedureParam {
 pub struct ColumnDef {
     pub name: Ident,
     pub data_type: DataType,
-    pub collation: Option<ObjectName>,
     pub options: Vec<ColumnOptionDef>,
 }
 
@@ -1018,9 +1439,6 @@ impl fmt::Display for ColumnDef {
         } else {
             write!(f, "{} {}", self.name, self.data_type)?;
         }
-        if let Some(collation) = &self.collation {
-            write!(f, " COLLATE {collation}")?;
-        }
         for option in &self.options {
             write!(f, " {option}")?;
         }
@@ -1050,17 +1468,41 @@ impl fmt::Display for ColumnDef {
 pub struct ViewColumnDef {
     pub name: Ident,
     pub data_type: Option<DataType>,
-    pub options: Option<Vec<ColumnOption>>,
+    pub options: Option<ColumnOptions>,
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ColumnOptions {
+    CommaSeparated(Vec<ColumnOption>),
+    SpaceSeparated(Vec<ColumnOption>),
+}
+
+impl ColumnOptions {
+    pub fn as_slice(&self) -> &[ColumnOption] {
+        match self {
+            ColumnOptions::CommaSeparated(options) => options.as_slice(),
+            ColumnOptions::SpaceSeparated(options) => options.as_slice(),
+        }
+    }
 }
 
 impl fmt::Display for ViewColumnDef {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "{}", self.name)?;
         if let Some(data_type) = self.data_type.as_ref() {
-            write!(f, " {}", data_type)?;
+            write!(f, " {data_type}")?;
         }
         if let Some(options) = self.options.as_ref() {
-            write!(f, " {}", display_comma_separated(options.as_slice()))?;
+            match options {
+                ColumnOptions::CommaSeparated(column_options) => {
+                    write!(f, " {}", display_comma_separated(column_options.as_slice()))?;
+                }
+                ColumnOptions::SpaceSeparated(column_options) => {
+                    write!(f, " {}", display_separated(column_options.as_slice(), " "))?
+                }
+            }
         }
         Ok(())
     }
@@ -1280,7 +1722,7 @@ pub struct ColumnPolicyProperty {
     /// ```
     /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/sql/create-table
     pub with: bool,
-    pub policy_name: Ident,
+    pub policy_name: ObjectName,
     pub using_columns: Option<Vec<Ident>>,
 }
 
@@ -1327,15 +1769,18 @@ pub enum ColumnOption {
     /// `DEFAULT <restricted-expr>`
     Default(Expr),
 
-    /// ClickHouse supports `MATERIALIZE`, `EPHEMERAL` and `ALIAS` expr to generate default values.
+    /// `MATERIALIZE <expr>`
     /// Syntax: `b INT MATERIALIZE (a + 1)`
+    ///
     /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/create/table#default_values)
-
-    /// `MATERIALIZE <expr>`
     Materialized(Expr),
     /// `EPHEMERAL [<expr>]`
+    ///
+    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/create/table#default_values)
     Ephemeral(Option<Expr>),
     /// `ALIAS <expr>`
+    ///
+    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/create/table#default_values)
     Alias(Expr),
 
     /// `{ PRIMARY KEY | UNIQUE } [<constraint_characteristics>]`
@@ -1364,6 +1809,7 @@ pub enum ColumnOption {
     /// - ...
     DialectSpecific(Vec<Token>),
     CharacterSet(ObjectName),
+    Collation(ObjectName),
     Comment(String),
     OnUpdate(Expr),
     /// `Generated`s are modifiers that follow a column definition in a `CREATE
@@ -1410,6 +1856,13 @@ pub enum ColumnOption {
     /// ```
     /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/sql/create-table
     Tags(TagsColumnOption),
+    /// MySQL specific: Spatial reference identifier
+    /// Syntax:
+    /// ```sql
+    /// CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);
+    /// ```
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/creating-spatial-indexes.html
+    Srid(Box<Expr>),
 }
 
 impl fmt::Display for ColumnOption {
@@ -1434,7 +1887,7 @@ impl fmt::Display for ColumnOption {
             } => {
                 write!(f, "{}", if *is_primary { "PRIMARY KEY" } else { "UNIQUE" })?;
                 if let Some(characteristics) = characteristics {
-                    write!(f, " {}", characteristics)?;
+                    write!(f, " {characteristics}")?;
                 }
                 Ok(())
             }
@@ -1456,13 +1909,14 @@ impl fmt::Display for ColumnOption {
                     write!(f, " ON UPDATE {action}")?;
                 }
                 if let Some(characteristics) = characteristics {
-                    write!(f, " {}", characteristics)?;
+                    write!(f, " {characteristics}")?;
                 }
                 Ok(())
             }
             Check(expr) => write!(f, "CHECK ({expr})"),
             DialectSpecific(val) => write!(f, "{}", display_separated(val, " ")),
             CharacterSet(n) => write!(f, "CHARACTER SET {n}"),
+            Collation(n) => write!(f, "COLLATE {n}"),
             Comment(v) => write!(f, "COMMENT '{}'", escape_single_quote_string(v)),
             OnUpdate(expr) => write!(f, "ON UPDATE {expr}"),
             Generated {
@@ -1515,7 +1969,7 @@ impl fmt::Display for ColumnOption {
                 write!(f, "{parameters}")
             }
             OnConflict(keyword) => {
-                write!(f, "ON CONFLICT {:?}", keyword)?;
+                write!(f, "ON CONFLICT {keyword:?}")?;
                 Ok(())
             }
             Policy(parameters) => {
@@ -1524,6 +1978,9 @@ impl fmt::Display for ColumnOption {
             Tags(tags) => {
                 write!(f, "{tags}")
             }
+            Srid(srid) => {
+                write!(f, "SRID {srid}")
+            }
         }
     }
 }
@@ -1552,7 +2009,7 @@ pub enum GeneratedExpressionMode {
 #[must_use]
 fn display_constraint_name(name: &'_ Option<Ident>) -> impl fmt::Display + '_ {
     struct ConstraintName<'a>(&'a Option<Ident>);
-    impl<'a> fmt::Display for ConstraintName<'a> {
+    impl fmt::Display for ConstraintName<'_> {
         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             if let Some(name) = self.0 {
                 write!(f, "CONSTRAINT {name} ")?;
@@ -1573,7 +2030,7 @@ fn display_option<'a, T: fmt::Display>(
     option: &'a Option<T>,
 ) -> impl fmt::Display + 'a {
     struct OptionDisplay<'a, T>(&'a str, &'a str, &'a Option<T>);
-    impl<'a, T: fmt::Display> fmt::Display for OptionDisplay<'a, T> {
+    impl<T: fmt::Display> fmt::Display for OptionDisplay<'_, T> {
         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
             if let Some(inner) = self.2 {
                 let (prefix, postfix) = (self.0, self.1);
@@ -1698,6 +2155,26 @@ impl fmt::Display for ReferentialAction {
     }
 }
 
+/// `<drop behavior> ::= CASCADE | RESTRICT`.
+///
+/// Used in `DROP` statements.
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum DropBehavior {
+    Restrict,
+    Cascade,
+}
+
+impl fmt::Display for DropBehavior {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            DropBehavior::Restrict => "RESTRICT",
+            DropBehavior::Cascade => "CASCADE",
+        })
+    }
+}
+
 /// SQL user defined type definition
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -1816,3 +2293,278 @@ impl fmt::Display for ClusteredBy {
         write!(f, " INTO {} BUCKETS", self.num_buckets)
     }
 }
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// ```sql
+/// CREATE DOMAIN name [ AS ] data_type
+///         [ COLLATE collation ]
+///         [ DEFAULT expression ]
+///         [ domain_constraint [ ... ] ]
+///
+///     where domain_constraint is:
+///
+///     [ CONSTRAINT constraint_name ]
+///     { NOT NULL | NULL | CHECK (expression) }
+/// ```
+/// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createdomain.html)
+pub struct CreateDomain {
+    /// The name of the domain to be created.
+    pub name: ObjectName,
+    /// The data type of the domain.
+    pub data_type: DataType,
+    /// The collation of the domain.
+    pub collation: Option<Ident>,
+    /// The default value of the domain.
+    pub default: Option<Expr>,
+    /// The constraints of the domain.
+    pub constraints: Vec<TableConstraint>,
+}
+
+impl fmt::Display for CreateDomain {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "CREATE DOMAIN {name} AS {data_type}",
+            name = self.name,
+            data_type = self.data_type
+        )?;
+        if let Some(collation) = &self.collation {
+            write!(f, " COLLATE {collation}")?;
+        }
+        if let Some(default) = &self.default {
+            write!(f, " DEFAULT {default}")?;
+        }
+        if !self.constraints.is_empty() {
+            write!(f, " {}", display_separated(&self.constraints, " "))?;
+        }
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateFunction {
+    /// True if this is a `CREATE OR ALTER FUNCTION` statement
+    ///
+    /// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver16#or-alter)
+    pub or_alter: bool,
+    pub or_replace: bool,
+    pub temporary: bool,
+    pub if_not_exists: bool,
+    pub name: ObjectName,
+    pub args: Option<Vec<OperateFunctionArg>>,
+    pub return_type: Option<DataType>,
+    /// The expression that defines the function.
+    ///
+    /// Examples:
+    /// ```sql
+    /// AS ((SELECT 1))
+    /// AS "console.log();"
+    /// ```
+    pub function_body: Option<CreateFunctionBody>,
+    /// Behavior attribute for the function
+    ///
+    /// IMMUTABLE | STABLE | VOLATILE
+    ///
+    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createfunction.html)
+    pub behavior: Option<FunctionBehavior>,
+    /// CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
+    ///
+    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createfunction.html)
+    pub called_on_null: Option<FunctionCalledOnNull>,
+    /// PARALLEL { UNSAFE | RESTRICTED | SAFE }
+    ///
+    /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createfunction.html)
+    pub parallel: Option<FunctionParallel>,
+    /// USING ... (Hive only)
+    pub using: Option<CreateFunctionUsing>,
+    /// Language used in a UDF definition.
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE FUNCTION foo() LANGUAGE js AS "console.log();"
+    /// ```
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_a_javascript_udf)
+    pub language: Option<Ident>,
+    /// Determinism keyword used for non-sql UDF definitions.
+    ///
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11)
+    pub determinism_specifier: Option<FunctionDeterminismSpecifier>,
+    /// List of options for creating the function.
+    ///
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11)
+    pub options: Option<Vec<SqlOption>>,
+    /// Connection resource for a remote function.
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE FUNCTION foo()
+    /// RETURNS FLOAT64
+    /// REMOTE WITH CONNECTION us.myconnection
+    /// ```
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_a_remote_function)
+    pub remote_connection: Option<ObjectName>,
+}
+
+impl fmt::Display for CreateFunction {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "CREATE {or_alter}{or_replace}{temp}FUNCTION {if_not_exists}{name}",
+            name = self.name,
+            temp = if self.temporary { "TEMPORARY " } else { "" },
+            or_alter = if self.or_alter { "OR ALTER " } else { "" },
+            or_replace = if self.or_replace { "OR REPLACE " } else { "" },
+            if_not_exists = if self.if_not_exists {
+                "IF NOT EXISTS "
+            } else {
+                ""
+            },
+        )?;
+        if let Some(args) = &self.args {
+            write!(f, "({})", display_comma_separated(args))?;
+        }
+        if let Some(return_type) = &self.return_type {
+            write!(f, " RETURNS {return_type}")?;
+        }
+        if let Some(determinism_specifier) = &self.determinism_specifier {
+            write!(f, " {determinism_specifier}")?;
+        }
+        if let Some(language) = &self.language {
+            write!(f, " LANGUAGE {language}")?;
+        }
+        if let Some(behavior) = &self.behavior {
+            write!(f, " {behavior}")?;
+        }
+        if let Some(called_on_null) = &self.called_on_null {
+            write!(f, " {called_on_null}")?;
+        }
+        if let Some(parallel) = &self.parallel {
+            write!(f, " {parallel}")?;
+        }
+        if let Some(remote_connection) = &self.remote_connection {
+            write!(f, " REMOTE WITH CONNECTION {remote_connection}")?;
+        }
+        if let Some(CreateFunctionBody::AsBeforeOptions(function_body)) = &self.function_body {
+            write!(f, " AS {function_body}")?;
+        }
+        if let Some(CreateFunctionBody::Return(function_body)) = &self.function_body {
+            write!(f, " RETURN {function_body}")?;
+        }
+        if let Some(CreateFunctionBody::AsReturnExpr(function_body)) = &self.function_body {
+            write!(f, " AS RETURN {function_body}")?;
+        }
+        if let Some(CreateFunctionBody::AsReturnSelect(function_body)) = &self.function_body {
+            write!(f, " AS RETURN {function_body}")?;
+        }
+        if let Some(using) = &self.using {
+            write!(f, " {using}")?;
+        }
+        if let Some(options) = &self.options {
+            write!(
+                f,
+                " OPTIONS({})",
+                display_comma_separated(options.as_slice())
+            )?;
+        }
+        if let Some(CreateFunctionBody::AsAfterOptions(function_body)) = &self.function_body {
+            write!(f, " AS {function_body}")?;
+        }
+        if let Some(CreateFunctionBody::AsBeginEnd(bes)) = &self.function_body {
+            write!(f, " AS {bes}")?;
+        }
+        Ok(())
+    }
+}
+
+/// ```sql
+/// CREATE CONNECTOR [IF NOT EXISTS] connector_name
+/// [TYPE datasource_type]
+/// [URL datasource_url]
+/// [COMMENT connector_comment]
+/// [WITH DCPROPERTIES(property_name=property_value, ...)]
+/// ```
+///
+/// [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateConnector {
+    pub name: Ident,
+    pub if_not_exists: bool,
+    pub connector_type: Option<String>,
+    pub url: Option<String>,
+    pub comment: Option<CommentDef>,
+    pub with_dcproperties: Option<Vec<SqlOption>>,
+}
+
+impl fmt::Display for CreateConnector {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "CREATE CONNECTOR {if_not_exists}{name}",
+            if_not_exists = if self.if_not_exists {
+                "IF NOT EXISTS "
+            } else {
+                ""
+            },
+            name = self.name,
+        )?;
+
+        if let Some(connector_type) = &self.connector_type {
+            write!(f, " TYPE '{connector_type}'")?;
+        }
+
+        if let Some(url) = &self.url {
+            write!(f, " URL '{url}'")?;
+        }
+
+        if let Some(comment) = &self.comment {
+            write!(f, " COMMENT = '{comment}'")?;
+        }
+
+        if let Some(with_dcproperties) = &self.with_dcproperties {
+            write!(
+                f,
+                " WITH DCPROPERTIES({})",
+                display_comma_separated(with_dcproperties)
+            )?;
+        }
+
+        Ok(())
+    }
+}
+
+/// `RenameTableNameKind` is the kind used in an `ALTER TABLE _ RENAME` statement.
+///
+/// Note: [MySQL] is the only database that supports the AS keyword for this operation.
+///
+/// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/alter-table.html
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum RenameTableNameKind {
+    As(ObjectName),
+    To(ObjectName),
+}
+
+impl fmt::Display for RenameTableNameKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            RenameTableNameKind::As(name) => write!(f, "AS {name}"),
+            RenameTableNameKind::To(name) => write!(f, "TO {name}"),
+        }
+    }
+}
+
+impl Spanned for RenameTableNameKind {
+    fn span(&self) -> Span {
+        match self {
+            RenameTableNameKind::As(name) => name.span(),
+            RenameTableNameKind::To(name) => name.span(),
+        }
+    }
+}
diff --git a/src/ast/dml.rs b/src/ast/dml.rs
index 22309c8f8..e179f5d70 100644
--- a/src/ast/dml.rs
+++ b/src/ast/dml.rs
@@ -29,16 +29,38 @@ use serde::{Deserialize, Serialize};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
+use crate::display_utils::{indented_list, DisplayCommaSeparated, Indent, NewLine, SpaceOrNewline};
+
 pub use super::ddl::{ColumnDef, TableConstraint};
 
 use super::{
-    display_comma_separated, display_separated, ClusteredBy, CommentDef, Expr, FileFormat,
-    FromTable, HiveDistributionStyle, HiveFormat, HiveIOFormat, HiveRowFormat, Ident,
-    InsertAliases, MysqlInsertPriority, ObjectName, OnCommit, OnInsert, OneOrManyWithParens,
-    OrderByExpr, Query, RowAccessPolicy, SelectItem, SqlOption, SqliteOnConflict, TableEngine,
-    TableWithJoins, Tag, WrappedCollection,
+    display_comma_separated, display_separated, query::InputFormatClause, Assignment, ClusteredBy,
+    CommentDef, CreateTableOptions, Expr, FileFormat, FromTable, HiveDistributionStyle, HiveFormat,
+    HiveIOFormat, HiveRowFormat, Ident, IndexType, InsertAliases, MysqlInsertPriority, ObjectName,
+    OnCommit, OnInsert, OneOrManyWithParens, OrderByExpr, Query, RowAccessPolicy, SelectItem,
+    Setting, SqliteOnConflict, StorageSerializationPolicy, TableObject, TableWithJoins, Tag,
+    WrappedCollection,
 };
 
+/// Index column type.
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct IndexColumn {
+    pub column: OrderByExpr,
+    pub operator_class: Option<Ident>,
+}
+
+impl Display for IndexColumn {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.column)?;
+        if let Some(operator_class) = &self.operator_class {
+            write!(f, " {operator_class}")?;
+        }
+        Ok(())
+    }
+}
+
 /// CREATE INDEX statement.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -48,8 +70,8 @@ pub struct CreateIndex {
     pub name: Option<ObjectName>,
     #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
     pub table_name: ObjectName,
-    pub using: Option<Ident>,
-    pub columns: Vec<OrderByExpr>,
+    pub using: Option<IndexType>,
+    pub columns: Vec<IndexColumn>,
     pub unique: bool,
     pub concurrently: bool,
     pub if_not_exists: bool,
@@ -117,6 +139,7 @@ pub struct CreateTable {
     pub if_not_exists: bool,
     pub transient: bool,
     pub volatile: bool,
+    pub iceberg: bool,
     /// Table name
     #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
     pub name: ObjectName,
@@ -125,19 +148,17 @@ pub struct CreateTable {
     pub constraints: Vec<TableConstraint>,
     pub hive_distribution: HiveDistributionStyle,
     pub hive_formats: Option<HiveFormat>,
-    pub table_properties: Vec<SqlOption>,
-    pub with_options: Vec<SqlOption>,
+    pub table_options: CreateTableOptions,
     pub file_format: Option<FileFormat>,
     pub location: Option<String>,
     pub query: Option<Box<Query>>,
     pub without_rowid: bool,
     pub like: Option<ObjectName>,
     pub clone: Option<ObjectName>,
-    pub engine: Option<TableEngine>,
+    // For Hive dialect, the table comment is after the column definitions without `=`,
+    // so the `comment` field is optional and different than the comment field in the general options list.
+    // [Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable)
     pub comment: Option<CommentDef>,
-    pub auto_increment_offset: Option<u32>,
-    pub default_charset: Option<String>,
-    pub collation: Option<String>,
     pub on_commit: Option<OnCommit>,
     /// ClickHouse "ON CLUSTER" clause:
     /// <https://clickhouse.com/docs/en/sql-reference/distributed-ddl/>
@@ -154,13 +175,17 @@ pub struct CreateTable {
     pub partition_by: Option<Box<Expr>>,
     /// BigQuery: Table clustering column list.
     /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#table_option_list>
-    pub cluster_by: Option<WrappedCollection<Vec<Ident>>>,
+    /// Snowflake: Table clustering list which contains base column, expressions on base columns.
+    /// <https://docs.snowflake.com/en/user-guide/tables-clustering-keys#defining-a-clustering-key-for-a-table>
+    pub cluster_by: Option<WrappedCollection<Vec<Expr>>>,
     /// Hive: Table clustering column list.
     /// <https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable>
     pub clustered_by: Option<ClusteredBy>,
-    /// BigQuery: Table options list.
-    /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#table_option_list>
-    pub options: Option<Vec<SqlOption>>,
+    /// Postgres `INHERITs` clause, which contains the list of tables from which
+    /// the new table inherits.
+    /// <https://www.postgresql.org/docs/current/ddl-inherit.html>
+    /// <https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-PARMS-INHERITS>
+    pub inherits: Option<Vec<ObjectName>>,
     /// SQLite "STRICT" clause.
     /// if the "STRICT" table-option keyword is added to the end, after the closing ")",
     /// then strict typing rules apply to that table.
@@ -192,6 +217,21 @@ pub struct CreateTable {
     /// Snowflake "WITH TAG" clause
     /// <https://docs.snowflake.com/en/sql-reference/sql/create-table>
     pub with_tags: Option<Vec<Tag>>,
+    /// Snowflake "EXTERNAL_VOLUME" clause for Iceberg tables
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+    pub external_volume: Option<String>,
+    /// Snowflake "BASE_LOCATION" clause for Iceberg tables
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+    pub base_location: Option<String>,
+    /// Snowflake "CATALOG" clause for Iceberg tables
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+    pub catalog: Option<String>,
+    /// Snowflake "CATALOG_SYNC" clause for Iceberg tables
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+    pub catalog_sync: Option<String>,
+    /// Snowflake "STORAGE_SERIALIZATION_POLICY" clause for Iceberg tables
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+    pub storage_serialization_policy: Option<StorageSerializationPolicy>,
 }
 
 impl Display for CreateTable {
@@ -205,7 +245,7 @@ impl Display for CreateTable {
         //   `CREATE TABLE t (a INT) AS SELECT a from t2`
         write!(
             f,
-            "CREATE {or_replace}{external}{global}{temporary}{transient}{volatile}TABLE {if_not_exists}{name}",
+            "CREATE {or_replace}{external}{global}{temporary}{transient}{volatile}{iceberg}TABLE {if_not_exists}{name}",
             or_replace = if self.or_replace { "OR REPLACE " } else { "" },
             external = if self.external { "EXTERNAL " } else { "" },
             global = self.global
@@ -221,25 +261,32 @@ impl Display for CreateTable {
             temporary = if self.temporary { "TEMPORARY " } else { "" },
             transient = if self.transient { "TRANSIENT " } else { "" },
             volatile = if self.volatile { "VOLATILE " } else { "" },
+            // Only for Snowflake
+            iceberg = if self.iceberg { "ICEBERG " } else { "" },
             name = self.name,
         )?;
         if let Some(on_cluster) = &self.on_cluster {
-            write!(f, " ON CLUSTER {}", on_cluster)?;
+            write!(f, " ON CLUSTER {on_cluster}")?;
         }
         if !self.columns.is_empty() || !self.constraints.is_empty() {
-            write!(f, " ({}", display_comma_separated(&self.columns))?;
+            f.write_str(" (")?;
+            NewLine.fmt(f)?;
+            Indent(DisplayCommaSeparated(&self.columns)).fmt(f)?;
             if !self.columns.is_empty() && !self.constraints.is_empty() {
-                write!(f, ", ")?;
+                f.write_str(",")?;
+                SpaceOrNewline.fmt(f)?;
             }
-            write!(f, "{})", display_comma_separated(&self.constraints))?;
+            Indent(DisplayCommaSeparated(&self.constraints)).fmt(f)?;
+            NewLine.fmt(f)?;
+            f.write_str(")")?;
         } else if self.query.is_none() && self.like.is_none() && self.clone.is_none() {
             // PostgreSQL allows `CREATE TABLE t ();`, but requires empty parens
-            write!(f, " ()")?;
+            f.write_str(" ()")?;
         }
 
         // Hive table comment should be after column definitions, please refer to:
         // [Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable)
-        if let Some(CommentDef::AfterColumnDefsWithoutEq(comment)) = &self.comment {
+        if let Some(comment) = &self.comment {
             write!(f, " COMMENT '{comment}'")?;
         }
 
@@ -332,40 +379,22 @@ impl Display for CreateTable {
             }
             write!(f, " LOCATION '{}'", self.location.as_ref().unwrap())?;
         }
-        if !self.table_properties.is_empty() {
-            write!(
-                f,
-                " TBLPROPERTIES ({})",
-                display_comma_separated(&self.table_properties)
-            )?;
-        }
-        if !self.with_options.is_empty() {
-            write!(f, " WITH ({})", display_comma_separated(&self.with_options))?;
-        }
-        if let Some(engine) = &self.engine {
-            write!(f, " ENGINE={engine}")?;
-        }
-        if let Some(comment_def) = &self.comment {
-            match comment_def {
-                CommentDef::WithEq(comment) => {
-                    write!(f, " COMMENT = '{comment}'")?;
-                }
-                CommentDef::WithoutEq(comment) => {
-                    write!(f, " COMMENT '{comment}'")?;
-                }
-                // For CommentDef::AfterColumnDefsWithoutEq will be displayed after column definition
-                CommentDef::AfterColumnDefsWithoutEq(_) => (),
-            }
-        }
 
-        if let Some(auto_increment_offset) = self.auto_increment_offset {
-            write!(f, " AUTO_INCREMENT {auto_increment_offset}")?;
+        match &self.table_options {
+            options @ CreateTableOptions::With(_)
+            | options @ CreateTableOptions::Plain(_)
+            | options @ CreateTableOptions::TableProperties(_) => write!(f, " {options}")?,
+            _ => (),
         }
+
         if let Some(primary_key) = &self.primary_key {
-            write!(f, " PRIMARY KEY {}", primary_key)?;
+            write!(f, " PRIMARY KEY {primary_key}")?;
         }
         if let Some(order_by) = &self.order_by {
-            write!(f, " ORDER BY {}", order_by)?;
+            write!(f, " ORDER BY {order_by}")?;
+        }
+        if let Some(inherits) = &self.inherits {
+            write!(f, " INHERITS ({})", display_comma_separated(inherits))?;
         }
         if let Some(partition_by) = self.partition_by.as_ref() {
             write!(f, " PARTITION BY {partition_by}")?;
@@ -373,12 +402,31 @@ impl Display for CreateTable {
         if let Some(cluster_by) = self.cluster_by.as_ref() {
             write!(f, " CLUSTER BY {cluster_by}")?;
         }
+        if let options @ CreateTableOptions::Options(_) = &self.table_options {
+            write!(f, " {options}")?;
+        }
+        if let Some(external_volume) = self.external_volume.as_ref() {
+            write!(f, " EXTERNAL_VOLUME = '{external_volume}'")?;
+        }
+
+        if let Some(catalog) = self.catalog.as_ref() {
+            write!(f, " CATALOG = '{catalog}'")?;
+        }
 
-        if let Some(options) = self.options.as_ref() {
+        if self.iceberg {
+            if let Some(base_location) = self.base_location.as_ref() {
+                write!(f, " BASE_LOCATION = '{base_location}'")?;
+            }
+        }
+
+        if let Some(catalog_sync) = self.catalog_sync.as_ref() {
+            write!(f, " CATALOG_SYNC = '{catalog_sync}'")?;
+        }
+
+        if let Some(storage_serialization_policy) = self.storage_serialization_policy.as_ref() {
             write!(
                 f,
-                " OPTIONS({})",
-                display_comma_separated(options.as_slice())
+                " STORAGE_SERIALIZATION_POLICY = {storage_serialization_policy}"
             )?;
         }
 
@@ -432,13 +480,6 @@ impl Display for CreateTable {
             write!(f, " WITH TAG ({})", display_comma_separated(tag.as_slice()))?;
         }
 
-        if let Some(default_charset) = &self.default_charset {
-            write!(f, " DEFAULT CHARSET={default_charset}")?;
-        }
-        if let Some(collation) = &self.collation {
-            write!(f, " COLLATE={collation}")?;
-        }
-
         if self.on_commit.is_some() {
             let on_commit = match self.on_commit {
                 Some(OnCommit::DeleteRows) => "ON COMMIT DELETE ROWS",
@@ -470,8 +511,7 @@ pub struct Insert {
     /// INTO - optional keyword
     pub into: bool,
     /// TABLE
-    #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
-    pub table_name: ObjectName,
+    pub table: TableObject,
     /// table_name as foo (for PostgreSQL)
     pub table_alias: Option<Ident>,
     /// COLUMNS
@@ -480,12 +520,15 @@ pub struct Insert {
     pub overwrite: bool,
     /// A SQL query that specifies what to insert
     pub source: Option<Box<Query>>,
+    /// MySQL `INSERT INTO ... SET`
+    /// See: <https://dev.mysql.com/doc/refman/8.4/en/insert.html>
+    pub assignments: Vec<Assignment>,
     /// partitioned insert (Hive)
     pub partitioned: Option<Vec<Expr>>,
     /// Columns defined after PARTITION
     pub after_columns: Vec<Ident>,
     /// whether the insert has the table keyword (Hive)
-    pub table: bool,
+    pub has_table_keyword: bool,
     pub on: Option<OnInsert>,
     /// RETURNING
     pub returning: Option<Vec<SelectItem>>,
@@ -495,14 +538,27 @@ pub struct Insert {
     pub priority: Option<MysqlInsertPriority>,
     /// Only for mysql
     pub insert_alias: Option<InsertAliases>,
+    /// Settings used for ClickHouse.
+    ///
+    /// ClickHouse syntax: `INSERT INTO tbl SETTINGS format_template_resultset = '/some/path/resultset.format'`
+    ///
+    /// [ClickHouse `INSERT INTO`](https://clickhouse.com/docs/en/sql-reference/statements/insert-into)
+    pub settings: Option<Vec<Setting>>,
+    /// Format for `INSERT` statement when not using standard SQL format. Can be e.g. `CSV`,
+    /// `JSON`, `JSONAsString`, `LineAsString` and more.
+    ///
+    /// ClickHouse syntax: `INSERT INTO tbl FORMAT JSONEachRow {"foo": 1, "bar": 2}, {"foo": 3}`
+    ///
+    /// [ClickHouse formats JSON insert](https://clickhouse.com/docs/en/interfaces/formats#json-inserting-data)
+    pub format_clause: Option<InputFormatClause>,
 }
 
 impl Display for Insert {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         let table_name = if let Some(alias) = &self.table_alias {
-            format!("{0} AS {alias}", self.table_name)
+            format!("{0} AS {alias}", self.table)
         } else {
-            self.table_name.to_string()
+            self.table.to_string()
         };
 
         if let Some(on_conflict) = self.or {
@@ -528,26 +584,37 @@ impl Display for Insert {
                 ignore = if self.ignore { " IGNORE" } else { "" },
                 over = if self.overwrite { " OVERWRITE" } else { "" },
                 int = if self.into { " INTO" } else { "" },
-                tbl = if self.table { " TABLE" } else { "" },
+                tbl = if self.has_table_keyword { " TABLE" } else { "" },
             )?;
         }
         if !self.columns.is_empty() {
-            write!(f, "({}) ", display_comma_separated(&self.columns))?;
+            write!(f, "({})", display_comma_separated(&self.columns))?;
+            SpaceOrNewline.fmt(f)?;
         }
         if let Some(ref parts) = self.partitioned {
             if !parts.is_empty() {
-                write!(f, "PARTITION ({}) ", display_comma_separated(parts))?;
+                write!(f, "PARTITION ({})", display_comma_separated(parts))?;
+                SpaceOrNewline.fmt(f)?;
             }
         }
         if !self.after_columns.is_empty() {
-            write!(f, "({}) ", display_comma_separated(&self.after_columns))?;
+            write!(f, "({})", display_comma_separated(&self.after_columns))?;
+            SpaceOrNewline.fmt(f)?;
         }
 
-        if let Some(source) = &self.source {
-            write!(f, "{source}")?;
+        if let Some(settings) = &self.settings {
+            write!(f, "SETTINGS {}", display_comma_separated(settings))?;
+            SpaceOrNewline.fmt(f)?;
         }
 
-        if self.source.is_none() && self.columns.is_empty() {
+        if let Some(source) = &self.source {
+            source.fmt(f)?;
+        } else if !self.assignments.is_empty() {
+            write!(f, "SET")?;
+            indented_list(f, &self.assignments)?;
+        } else if let Some(format_clause) = &self.format_clause {
+            format_clause.fmt(f)?;
+        } else if self.columns.is_empty() {
             write!(f, "DEFAULT VALUES")?;
         }
 
@@ -566,7 +633,9 @@ impl Display for Insert {
         }
 
         if let Some(returning) = &self.returning {
-            write!(f, " RETURNING {}", display_comma_separated(returning))?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("RETURNING")?;
+            indented_list(f, returning)?;
         }
         Ok(())
     }
@@ -595,32 +664,45 @@ pub struct Delete {
 
 impl Display for Delete {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "DELETE ")?;
+        f.write_str("DELETE")?;
         if !self.tables.is_empty() {
-            write!(f, "{} ", display_comma_separated(&self.tables))?;
+            indented_list(f, &self.tables)?;
         }
         match &self.from {
             FromTable::WithFromKeyword(from) => {
-                write!(f, "FROM {}", display_comma_separated(from))?;
+                f.write_str(" FROM")?;
+                indented_list(f, from)?;
             }
             FromTable::WithoutKeyword(from) => {
-                write!(f, "{}", display_comma_separated(from))?;
+                indented_list(f, from)?;
             }
         }
         if let Some(using) = &self.using {
-            write!(f, " USING {}", display_comma_separated(using))?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("USING")?;
+            indented_list(f, using)?;
         }
         if let Some(selection) = &self.selection {
-            write!(f, " WHERE {selection}")?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("WHERE")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(selection).fmt(f)?;
         }
         if let Some(returning) = &self.returning {
-            write!(f, " RETURNING {}", display_comma_separated(returning))?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("RETURNING")?;
+            indented_list(f, returning)?;
         }
         if !self.order_by.is_empty() {
-            write!(f, " ORDER BY {}", display_comma_separated(&self.order_by))?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("ORDER BY")?;
+            indented_list(f, &self.order_by)?;
         }
         if let Some(limit) = &self.limit {
-            write!(f, " LIMIT {limit}")?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("LIMIT")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(limit).fmt(f)?;
         }
         Ok(())
     }
diff --git a/src/ast/helpers/attached_token.rs b/src/ast/helpers/attached_token.rs
new file mode 100644
index 000000000..6b930b513
--- /dev/null
+++ b/src/ast/helpers/attached_token.rs
@@ -0,0 +1,136 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use core::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
+use core::fmt::{self, Debug, Formatter};
+use core::hash::{Hash, Hasher};
+
+use crate::tokenizer::TokenWithSpan;
+
+#[cfg(feature = "serde")]
+use serde::{Deserialize, Serialize};
+
+#[cfg(feature = "visitor")]
+use sqlparser_derive::{Visit, VisitMut};
+
+/// A wrapper over [`TokenWithSpan`]s that ignores the token and source
+/// location in comparisons and hashing.
+///
+/// This type is used when the token and location is not relevant for semantics,
+/// but is still needed for accurate source location tracking, for example, in
+/// the nodes in the [ast](crate::ast) module.
+///
+/// Note: **All** `AttachedTokens` are equal.
+///
+/// # Examples
+///
+/// Same token, different location are equal
+/// ```
+/// # use sqlparser::ast::helpers::attached_token::AttachedToken;
+/// # use sqlparser::tokenizer::{Location, Span, Token, TokenWithLocation};
+/// // commas @ line 1, column 10
+/// let tok1 = TokenWithLocation::new(
+///   Token::Comma,
+///   Span::new(Location::new(1, 10), Location::new(1, 11)),
+/// );
+/// // commas @ line 2, column 20
+/// let tok2 = TokenWithLocation::new(
+///   Token::Comma,
+///   Span::new(Location::new(2, 20), Location::new(2, 21)),
+/// );
+///
+/// assert_ne!(tok1, tok2); // token with locations are *not* equal
+/// assert_eq!(AttachedToken(tok1), AttachedToken(tok2)); // attached tokens are
+/// ```
+///
+/// Different token, different location are equal 🤯
+///
+/// ```
+/// # use sqlparser::ast::helpers::attached_token::AttachedToken;
+/// # use sqlparser::tokenizer::{Location, Span, Token, TokenWithLocation};
+/// // commas @ line 1, column 10
+/// let tok1 = TokenWithLocation::new(
+///   Token::Comma,
+///   Span::new(Location::new(1, 10), Location::new(1, 11)),
+/// );
+/// // period @ line 2, column 20
+/// let tok2 = TokenWithLocation::new(
+///  Token::Period,
+///   Span::new(Location::new(2, 10), Location::new(2, 21)),
+/// );
+///
+/// assert_ne!(tok1, tok2); // token with locations are *not* equal
+/// assert_eq!(AttachedToken(tok1), AttachedToken(tok2)); // attached tokens are
+/// ```
+/// // period @ line 2, column 20
+#[derive(Clone)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct AttachedToken(pub TokenWithSpan);
+
+impl AttachedToken {
+    /// Return a new Empty AttachedToken
+    pub fn empty() -> Self {
+        AttachedToken(TokenWithSpan::new_eof())
+    }
+}
+
+// Conditional Implementations
+impl Debug for AttachedToken {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        self.0.fmt(f)
+    }
+}
+
+// Blanket Implementations
+impl PartialEq for AttachedToken {
+    fn eq(&self, _: &Self) -> bool {
+        true
+    }
+}
+
+impl Eq for AttachedToken {}
+
+impl PartialOrd for AttachedToken {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl Ord for AttachedToken {
+    fn cmp(&self, _: &Self) -> Ordering {
+        Ordering::Equal
+    }
+}
+
+impl Hash for AttachedToken {
+    fn hash<H: Hasher>(&self, _state: &mut H) {
+        // Do nothing
+    }
+}
+
+impl From<TokenWithSpan> for AttachedToken {
+    fn from(value: TokenWithSpan) -> Self {
+        AttachedToken(value)
+    }
+}
+
+impl From<AttachedToken> for TokenWithSpan {
+    fn from(value: AttachedToken) -> Self {
+        value.0
+    }
+}
diff --git a/src/ast/helpers/key_value_options.rs b/src/ast/helpers/key_value_options.rs
new file mode 100644
index 000000000..7f1bb0fdb
--- /dev/null
+++ b/src/ast/helpers/key_value_options.rs
@@ -0,0 +1,93 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+//! Key-value options for SQL statements.
+//! See [this page](https://docs.snowflake.com/en/sql-reference/commands-data-loading) for more details.
+
+#[cfg(not(feature = "std"))]
+use alloc::string::String;
+#[cfg(not(feature = "std"))]
+use alloc::vec::Vec;
+use core::fmt;
+use core::fmt::Formatter;
+
+#[cfg(feature = "serde")]
+use serde::{Deserialize, Serialize};
+
+#[cfg(feature = "visitor")]
+use sqlparser_derive::{Visit, VisitMut};
+
+use crate::ast::display_separated;
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct KeyValueOptions {
+    pub options: Vec<KeyValueOption>,
+    pub delimiter: KeyValueOptionsDelimiter,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum KeyValueOptionsDelimiter {
+    Space,
+    Comma,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum KeyValueOptionType {
+    STRING,
+    BOOLEAN,
+    ENUM,
+    NUMBER,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct KeyValueOption {
+    pub option_name: String,
+    pub option_type: KeyValueOptionType,
+    pub value: String,
+}
+
+impl fmt::Display for KeyValueOptions {
+    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+        let sep = match self.delimiter {
+            KeyValueOptionsDelimiter::Space => " ",
+            KeyValueOptionsDelimiter::Comma => ", ",
+        };
+        write!(f, "{}", display_separated(&self.options, sep))
+    }
+}
+
+impl fmt::Display for KeyValueOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.option_type {
+            KeyValueOptionType::STRING => {
+                write!(f, "{}='{}'", self.option_name, self.value)?;
+            }
+            KeyValueOptionType::ENUM | KeyValueOptionType::BOOLEAN | KeyValueOptionType::NUMBER => {
+                write!(f, "{}={}", self.option_name, self.value)?;
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/src/ast/helpers/mod.rs b/src/ast/helpers/mod.rs
index d6924ab88..3efbcf7b0 100644
--- a/src/ast/helpers/mod.rs
+++ b/src/ast/helpers/mod.rs
@@ -14,5 +14,8 @@
 // KIND, either express or implied.  See the License for the
 // specific language governing permissions and limitations
 // under the License.
+pub mod attached_token;
+pub mod key_value_options;
+pub mod stmt_create_database;
 pub mod stmt_create_table;
 pub mod stmt_data_loading;
diff --git a/src/ast/helpers/stmt_create_database.rs b/src/ast/helpers/stmt_create_database.rs
new file mode 100644
index 000000000..94997bfa5
--- /dev/null
+++ b/src/ast/helpers/stmt_create_database.rs
@@ -0,0 +1,324 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#[cfg(not(feature = "std"))]
+use alloc::{boxed::Box, format, string::String, vec, vec::Vec};
+
+#[cfg(feature = "serde")]
+use serde::{Deserialize, Serialize};
+
+#[cfg(feature = "visitor")]
+use sqlparser_derive::{Visit, VisitMut};
+
+use crate::ast::{
+    CatalogSyncNamespaceMode, ContactEntry, ObjectName, Statement, StorageSerializationPolicy, Tag,
+};
+use crate::parser::ParserError;
+
+/// Builder for create database statement variant ([1]).
+///
+/// This structure helps building and accessing a create database with more ease, without needing to:
+/// - Match the enum itself a lot of times; or
+/// - Moving a lot of variables around the code.
+///
+/// # Example
+/// ```rust
+/// use sqlparser::ast::helpers::stmt_create_database::CreateDatabaseBuilder;
+/// use sqlparser::ast::{ColumnDef, Ident, ObjectName};
+/// let builder = CreateDatabaseBuilder::new(ObjectName::from(vec![Ident::new("database_name")]))
+///    .if_not_exists(true);
+/// // You can access internal elements with ease
+/// assert!(builder.if_not_exists);
+/// // Convert to a statement
+/// assert_eq!(
+///    builder.build().to_string(),
+///    "CREATE DATABASE IF NOT EXISTS database_name"
+/// )
+/// ```
+///
+/// [1]: Statement::CreateDatabase
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateDatabaseBuilder {
+    pub db_name: ObjectName,
+    pub if_not_exists: bool,
+    pub location: Option<String>,
+    pub managed_location: Option<String>,
+    pub or_replace: bool,
+    pub transient: bool,
+    pub clone: Option<ObjectName>,
+    pub data_retention_time_in_days: Option<u64>,
+    pub max_data_extension_time_in_days: Option<u64>,
+    pub external_volume: Option<String>,
+    pub catalog: Option<String>,
+    pub replace_invalid_characters: Option<bool>,
+    pub default_ddl_collation: Option<String>,
+    pub storage_serialization_policy: Option<StorageSerializationPolicy>,
+    pub comment: Option<String>,
+    pub catalog_sync: Option<String>,
+    pub catalog_sync_namespace_mode: Option<CatalogSyncNamespaceMode>,
+    pub catalog_sync_namespace_flatten_delimiter: Option<String>,
+    pub with_tags: Option<Vec<Tag>>,
+    pub with_contacts: Option<Vec<ContactEntry>>,
+}
+
+impl CreateDatabaseBuilder {
+    pub fn new(name: ObjectName) -> Self {
+        Self {
+            db_name: name,
+            if_not_exists: false,
+            location: None,
+            managed_location: None,
+            or_replace: false,
+            transient: false,
+            clone: None,
+            data_retention_time_in_days: None,
+            max_data_extension_time_in_days: None,
+            external_volume: None,
+            catalog: None,
+            replace_invalid_characters: None,
+            default_ddl_collation: None,
+            storage_serialization_policy: None,
+            comment: None,
+            catalog_sync: None,
+            catalog_sync_namespace_mode: None,
+            catalog_sync_namespace_flatten_delimiter: None,
+            with_tags: None,
+            with_contacts: None,
+        }
+    }
+
+    pub fn location(mut self, location: Option<String>) -> Self {
+        self.location = location;
+        self
+    }
+
+    pub fn managed_location(mut self, managed_location: Option<String>) -> Self {
+        self.managed_location = managed_location;
+        self
+    }
+
+    pub fn or_replace(mut self, or_replace: bool) -> Self {
+        self.or_replace = or_replace;
+        self
+    }
+
+    pub fn transient(mut self, transient: bool) -> Self {
+        self.transient = transient;
+        self
+    }
+
+    pub fn if_not_exists(mut self, if_not_exists: bool) -> Self {
+        self.if_not_exists = if_not_exists;
+        self
+    }
+
+    pub fn clone_clause(mut self, clone: Option<ObjectName>) -> Self {
+        self.clone = clone;
+        self
+    }
+
+    pub fn data_retention_time_in_days(mut self, data_retention_time_in_days: Option<u64>) -> Self {
+        self.data_retention_time_in_days = data_retention_time_in_days;
+        self
+    }
+
+    pub fn max_data_extension_time_in_days(
+        mut self,
+        max_data_extension_time_in_days: Option<u64>,
+    ) -> Self {
+        self.max_data_extension_time_in_days = max_data_extension_time_in_days;
+        self
+    }
+
+    pub fn external_volume(mut self, external_volume: Option<String>) -> Self {
+        self.external_volume = external_volume;
+        self
+    }
+
+    pub fn catalog(mut self, catalog: Option<String>) -> Self {
+        self.catalog = catalog;
+        self
+    }
+
+    pub fn replace_invalid_characters(mut self, replace_invalid_characters: Option<bool>) -> Self {
+        self.replace_invalid_characters = replace_invalid_characters;
+        self
+    }
+
+    pub fn default_ddl_collation(mut self, default_ddl_collation: Option<String>) -> Self {
+        self.default_ddl_collation = default_ddl_collation;
+        self
+    }
+
+    pub fn storage_serialization_policy(
+        mut self,
+        storage_serialization_policy: Option<StorageSerializationPolicy>,
+    ) -> Self {
+        self.storage_serialization_policy = storage_serialization_policy;
+        self
+    }
+
+    pub fn comment(mut self, comment: Option<String>) -> Self {
+        self.comment = comment;
+        self
+    }
+
+    pub fn catalog_sync(mut self, catalog_sync: Option<String>) -> Self {
+        self.catalog_sync = catalog_sync;
+        self
+    }
+
+    pub fn catalog_sync_namespace_mode(
+        mut self,
+        catalog_sync_namespace_mode: Option<CatalogSyncNamespaceMode>,
+    ) -> Self {
+        self.catalog_sync_namespace_mode = catalog_sync_namespace_mode;
+        self
+    }
+
+    pub fn catalog_sync_namespace_flatten_delimiter(
+        mut self,
+        catalog_sync_namespace_flatten_delimiter: Option<String>,
+    ) -> Self {
+        self.catalog_sync_namespace_flatten_delimiter = catalog_sync_namespace_flatten_delimiter;
+        self
+    }
+
+    pub fn with_tags(mut self, with_tags: Option<Vec<Tag>>) -> Self {
+        self.with_tags = with_tags;
+        self
+    }
+
+    pub fn with_contacts(mut self, with_contacts: Option<Vec<ContactEntry>>) -> Self {
+        self.with_contacts = with_contacts;
+        self
+    }
+
+    pub fn build(self) -> Statement {
+        Statement::CreateDatabase {
+            db_name: self.db_name,
+            if_not_exists: self.if_not_exists,
+            managed_location: self.managed_location,
+            location: self.location,
+            or_replace: self.or_replace,
+            transient: self.transient,
+            clone: self.clone,
+            data_retention_time_in_days: self.data_retention_time_in_days,
+            max_data_extension_time_in_days: self.max_data_extension_time_in_days,
+            external_volume: self.external_volume,
+            catalog: self.catalog,
+            replace_invalid_characters: self.replace_invalid_characters,
+            default_ddl_collation: self.default_ddl_collation,
+            storage_serialization_policy: self.storage_serialization_policy,
+            comment: self.comment,
+            catalog_sync: self.catalog_sync,
+            catalog_sync_namespace_mode: self.catalog_sync_namespace_mode,
+            catalog_sync_namespace_flatten_delimiter: self.catalog_sync_namespace_flatten_delimiter,
+            with_tags: self.with_tags,
+            with_contacts: self.with_contacts,
+        }
+    }
+}
+
+impl TryFrom<Statement> for CreateDatabaseBuilder {
+    type Error = ParserError;
+
+    fn try_from(stmt: Statement) -> Result<Self, Self::Error> {
+        match stmt {
+            Statement::CreateDatabase {
+                db_name,
+                if_not_exists,
+                location,
+                managed_location,
+                or_replace,
+                transient,
+                clone,
+                data_retention_time_in_days,
+                max_data_extension_time_in_days,
+                external_volume,
+                catalog,
+                replace_invalid_characters,
+                default_ddl_collation,
+                storage_serialization_policy,
+                comment,
+                catalog_sync,
+                catalog_sync_namespace_mode,
+                catalog_sync_namespace_flatten_delimiter,
+                with_tags,
+                with_contacts,
+            } => Ok(Self {
+                db_name,
+                if_not_exists,
+                location,
+                managed_location,
+                or_replace,
+                transient,
+                clone,
+                data_retention_time_in_days,
+                max_data_extension_time_in_days,
+                external_volume,
+                catalog,
+                replace_invalid_characters,
+                default_ddl_collation,
+                storage_serialization_policy,
+                comment,
+                catalog_sync,
+                catalog_sync_namespace_mode,
+                catalog_sync_namespace_flatten_delimiter,
+                with_tags,
+                with_contacts,
+            }),
+            _ => Err(ParserError::ParserError(format!(
+                "Expected create database statement, but received: {stmt}"
+            ))),
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::ast::helpers::stmt_create_database::CreateDatabaseBuilder;
+    use crate::ast::{Ident, ObjectName, Statement};
+    use crate::parser::ParserError;
+
+    #[test]
+    pub fn test_from_valid_statement() {
+        let builder = CreateDatabaseBuilder::new(ObjectName::from(vec![Ident::new("db_name")]));
+
+        let stmt = builder.clone().build();
+
+        assert_eq!(builder, CreateDatabaseBuilder::try_from(stmt).unwrap());
+    }
+
+    #[test]
+    pub fn test_from_invalid_statement() {
+        let stmt = Statement::Commit {
+            chain: false,
+            end: false,
+            modifier: None,
+        };
+
+        assert_eq!(
+            CreateDatabaseBuilder::try_from(stmt).unwrap_err(),
+            ParserError::ParserError(
+                "Expected create database statement, but received: COMMIT".to_owned()
+            )
+        );
+    }
+}
diff --git a/src/ast/helpers/stmt_create_table.rs b/src/ast/helpers/stmt_create_table.rs
index 364969c40..60b8fb2a0 100644
--- a/src/ast/helpers/stmt_create_table.rs
+++ b/src/ast/helpers/stmt_create_table.rs
@@ -26,10 +26,12 @@ use sqlparser_derive::{Visit, VisitMut};
 
 use super::super::dml::CreateTable;
 use crate::ast::{
-    ClusteredBy, ColumnDef, CommentDef, Expr, FileFormat, HiveDistributionStyle, HiveFormat, Ident,
-    ObjectName, OnCommit, OneOrManyWithParens, Query, RowAccessPolicy, SqlOption, Statement,
-    TableConstraint, TableEngine, Tag, WrappedCollection,
+    ClusteredBy, ColumnDef, CommentDef, CreateTableOptions, Expr, FileFormat,
+    HiveDistributionStyle, HiveFormat, Ident, ObjectName, OnCommit, OneOrManyWithParens, Query,
+    RowAccessPolicy, Statement, StorageSerializationPolicy, TableConstraint, Tag,
+    WrappedCollection,
 };
+
 use crate::parser::ParserError;
 
 /// Builder for create table statement variant ([1]).
@@ -42,12 +44,11 @@ use crate::parser::ParserError;
 /// ```rust
 /// use sqlparser::ast::helpers::stmt_create_table::CreateTableBuilder;
 /// use sqlparser::ast::{ColumnDef, DataType, Ident, ObjectName};
-/// let builder = CreateTableBuilder::new(ObjectName(vec![Ident::new("table_name")]))
+/// let builder = CreateTableBuilder::new(ObjectName::from(vec![Ident::new("table_name")]))
 ///    .if_not_exists(true)
 ///    .columns(vec![ColumnDef {
 ///        name: Ident::new("c1"),
 ///        data_type: DataType::Int(None),
-///        collation: None,
 ///        options: vec![],
 /// }]);
 /// // You can access internal elements with ease
@@ -71,32 +72,27 @@ pub struct CreateTableBuilder {
     pub if_not_exists: bool,
     pub transient: bool,
     pub volatile: bool,
+    pub iceberg: bool,
     pub name: ObjectName,
     pub columns: Vec<ColumnDef>,
     pub constraints: Vec<TableConstraint>,
     pub hive_distribution: HiveDistributionStyle,
     pub hive_formats: Option<HiveFormat>,
-    pub table_properties: Vec<SqlOption>,
-    pub with_options: Vec<SqlOption>,
     pub file_format: Option<FileFormat>,
     pub location: Option<String>,
     pub query: Option<Box<Query>>,
     pub without_rowid: bool,
     pub like: Option<ObjectName>,
     pub clone: Option<ObjectName>,
-    pub engine: Option<TableEngine>,
     pub comment: Option<CommentDef>,
-    pub auto_increment_offset: Option<u32>,
-    pub default_charset: Option<String>,
-    pub collation: Option<String>,
     pub on_commit: Option<OnCommit>,
     pub on_cluster: Option<Ident>,
     pub primary_key: Option<Box<Expr>>,
     pub order_by: Option<OneOrManyWithParens<Expr>>,
     pub partition_by: Option<Box<Expr>>,
-    pub cluster_by: Option<WrappedCollection<Vec<Ident>>>,
+    pub cluster_by: Option<WrappedCollection<Vec<Expr>>>,
     pub clustered_by: Option<ClusteredBy>,
-    pub options: Option<Vec<SqlOption>>,
+    pub inherits: Option<Vec<ObjectName>>,
     pub strict: bool,
     pub copy_grants: bool,
     pub enable_schema_evolution: Option<bool>,
@@ -107,6 +103,12 @@ pub struct CreateTableBuilder {
     pub with_aggregation_policy: Option<ObjectName>,
     pub with_row_access_policy: Option<RowAccessPolicy>,
     pub with_tags: Option<Vec<Tag>>,
+    pub base_location: Option<String>,
+    pub external_volume: Option<String>,
+    pub catalog: Option<String>,
+    pub catalog_sync: Option<String>,
+    pub storage_serialization_policy: Option<StorageSerializationPolicy>,
+    pub table_options: CreateTableOptions,
 }
 
 impl CreateTableBuilder {
@@ -119,24 +121,19 @@ impl CreateTableBuilder {
             if_not_exists: false,
             transient: false,
             volatile: false,
+            iceberg: false,
             name,
             columns: vec![],
             constraints: vec![],
             hive_distribution: HiveDistributionStyle::NONE,
             hive_formats: None,
-            table_properties: vec![],
-            with_options: vec![],
             file_format: None,
             location: None,
             query: None,
             without_rowid: false,
             like: None,
             clone: None,
-            engine: None,
             comment: None,
-            auto_increment_offset: None,
-            default_charset: None,
-            collation: None,
             on_commit: None,
             on_cluster: None,
             primary_key: None,
@@ -144,7 +141,7 @@ impl CreateTableBuilder {
             partition_by: None,
             cluster_by: None,
             clustered_by: None,
-            options: None,
+            inherits: None,
             strict: false,
             copy_grants: false,
             enable_schema_evolution: None,
@@ -155,6 +152,12 @@ impl CreateTableBuilder {
             with_aggregation_policy: None,
             with_row_access_policy: None,
             with_tags: None,
+            base_location: None,
+            external_volume: None,
+            catalog: None,
+            catalog_sync: None,
+            storage_serialization_policy: None,
+            table_options: CreateTableOptions::None,
         }
     }
     pub fn or_replace(mut self, or_replace: bool) -> Self {
@@ -192,6 +195,11 @@ impl CreateTableBuilder {
         self
     }
 
+    pub fn iceberg(mut self, iceberg: bool) -> Self {
+        self.iceberg = iceberg;
+        self
+    }
+
     pub fn columns(mut self, columns: Vec<ColumnDef>) -> Self {
         self.columns = columns;
         self
@@ -212,15 +220,6 @@ impl CreateTableBuilder {
         self
     }
 
-    pub fn table_properties(mut self, table_properties: Vec<SqlOption>) -> Self {
-        self.table_properties = table_properties;
-        self
-    }
-
-    pub fn with_options(mut self, with_options: Vec<SqlOption>) -> Self {
-        self.with_options = with_options;
-        self
-    }
     pub fn file_format(mut self, file_format: Option<FileFormat>) -> Self {
         self.file_format = file_format;
         self
@@ -250,31 +249,11 @@ impl CreateTableBuilder {
         self
     }
 
-    pub fn engine(mut self, engine: Option<TableEngine>) -> Self {
-        self.engine = engine;
-        self
-    }
-
-    pub fn comment(mut self, comment: Option<CommentDef>) -> Self {
+    pub fn comment_after_column_def(mut self, comment: Option<CommentDef>) -> Self {
         self.comment = comment;
         self
     }
 
-    pub fn auto_increment_offset(mut self, offset: Option<u32>) -> Self {
-        self.auto_increment_offset = offset;
-        self
-    }
-
-    pub fn default_charset(mut self, default_charset: Option<String>) -> Self {
-        self.default_charset = default_charset;
-        self
-    }
-
-    pub fn collation(mut self, collation: Option<String>) -> Self {
-        self.collation = collation;
-        self
-    }
-
     pub fn on_commit(mut self, on_commit: Option<OnCommit>) -> Self {
         self.on_commit = on_commit;
         self
@@ -300,7 +279,7 @@ impl CreateTableBuilder {
         self
     }
 
-    pub fn cluster_by(mut self, cluster_by: Option<WrappedCollection<Vec<Ident>>>) -> Self {
+    pub fn cluster_by(mut self, cluster_by: Option<WrappedCollection<Vec<Expr>>>) -> Self {
         self.cluster_by = cluster_by;
         self
     }
@@ -310,8 +289,8 @@ impl CreateTableBuilder {
         self
     }
 
-    pub fn options(mut self, options: Option<Vec<SqlOption>>) -> Self {
-        self.options = options;
+    pub fn inherits(mut self, inherits: Option<Vec<ObjectName>>) -> Self {
+        self.inherits = inherits;
         self
     }
 
@@ -371,6 +350,59 @@ impl CreateTableBuilder {
         self
     }
 
+    pub fn base_location(mut self, base_location: Option<String>) -> Self {
+        self.base_location = base_location;
+        self
+    }
+
+    pub fn external_volume(mut self, external_volume: Option<String>) -> Self {
+        self.external_volume = external_volume;
+        self
+    }
+
+    pub fn catalog(mut self, catalog: Option<String>) -> Self {
+        self.catalog = catalog;
+        self
+    }
+
+    pub fn catalog_sync(mut self, catalog_sync: Option<String>) -> Self {
+        self.catalog_sync = catalog_sync;
+        self
+    }
+
+    pub fn storage_serialization_policy(
+        mut self,
+        storage_serialization_policy: Option<StorageSerializationPolicy>,
+    ) -> Self {
+        self.storage_serialization_policy = storage_serialization_policy;
+        self
+    }
+
+    pub fn table_options(mut self, table_options: CreateTableOptions) -> Self {
+        self.table_options = table_options;
+        self
+    }
+
+    /// Returns true if the statement has exactly one source of info on the schema of the new table.
+    /// This is Snowflake-specific, some dialects allow more than one source.
+    pub(crate) fn validate_schema_info(&self) -> bool {
+        let mut sources = 0;
+        if !self.columns.is_empty() {
+            sources += 1;
+        }
+        if self.query.is_some() {
+            sources += 1;
+        }
+        if self.like.is_some() {
+            sources += 1;
+        }
+        if self.clone.is_some() {
+            sources += 1;
+        }
+
+        sources == 1
+    }
+
     pub fn build(self) -> Statement {
         Statement::CreateTable(CreateTable {
             or_replace: self.or_replace,
@@ -380,24 +412,19 @@ impl CreateTableBuilder {
             if_not_exists: self.if_not_exists,
             transient: self.transient,
             volatile: self.volatile,
+            iceberg: self.iceberg,
             name: self.name,
             columns: self.columns,
             constraints: self.constraints,
             hive_distribution: self.hive_distribution,
             hive_formats: self.hive_formats,
-            table_properties: self.table_properties,
-            with_options: self.with_options,
             file_format: self.file_format,
             location: self.location,
             query: self.query,
             without_rowid: self.without_rowid,
             like: self.like,
             clone: self.clone,
-            engine: self.engine,
             comment: self.comment,
-            auto_increment_offset: self.auto_increment_offset,
-            default_charset: self.default_charset,
-            collation: self.collation,
             on_commit: self.on_commit,
             on_cluster: self.on_cluster,
             primary_key: self.primary_key,
@@ -405,7 +432,7 @@ impl CreateTableBuilder {
             partition_by: self.partition_by,
             cluster_by: self.cluster_by,
             clustered_by: self.clustered_by,
-            options: self.options,
+            inherits: self.inherits,
             strict: self.strict,
             copy_grants: self.copy_grants,
             enable_schema_evolution: self.enable_schema_evolution,
@@ -416,6 +443,12 @@ impl CreateTableBuilder {
             with_aggregation_policy: self.with_aggregation_policy,
             with_row_access_policy: self.with_row_access_policy,
             with_tags: self.with_tags,
+            base_location: self.base_location,
+            external_volume: self.external_volume,
+            catalog: self.catalog,
+            catalog_sync: self.catalog_sync,
+            storage_serialization_policy: self.storage_serialization_policy,
+            table_options: self.table_options,
         })
     }
 }
@@ -435,24 +468,19 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 if_not_exists,
                 transient,
                 volatile,
+                iceberg,
                 name,
                 columns,
                 constraints,
                 hive_distribution,
                 hive_formats,
-                table_properties,
-                with_options,
                 file_format,
                 location,
                 query,
                 without_rowid,
                 like,
                 clone,
-                engine,
                 comment,
-                auto_increment_offset,
-                default_charset,
-                collation,
                 on_commit,
                 on_cluster,
                 primary_key,
@@ -460,7 +488,7 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 partition_by,
                 cluster_by,
                 clustered_by,
-                options,
+                inherits,
                 strict,
                 copy_grants,
                 enable_schema_evolution,
@@ -471,6 +499,12 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 with_aggregation_policy,
                 with_row_access_policy,
                 with_tags,
+                base_location,
+                external_volume,
+                catalog,
+                catalog_sync,
+                storage_serialization_policy,
+                table_options,
             }) => Ok(Self {
                 or_replace,
                 temporary,
@@ -483,19 +517,13 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 constraints,
                 hive_distribution,
                 hive_formats,
-                table_properties,
-                with_options,
                 file_format,
                 location,
                 query,
                 without_rowid,
                 like,
                 clone,
-                engine,
                 comment,
-                auto_increment_offset,
-                default_charset,
-                collation,
                 on_commit,
                 on_cluster,
                 primary_key,
@@ -503,8 +531,9 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 partition_by,
                 cluster_by,
                 clustered_by,
-                options,
+                inherits,
                 strict,
+                iceberg,
                 copy_grants,
                 enable_schema_evolution,
                 change_tracking,
@@ -515,6 +544,12 @@ impl TryFrom<Statement> for CreateTableBuilder {
                 with_row_access_policy,
                 with_tags,
                 volatile,
+                base_location,
+                external_volume,
+                catalog,
+                catalog_sync,
+                storage_serialization_policy,
+                table_options,
             }),
             _ => Err(ParserError::ParserError(format!(
                 "Expected create table statement, but received: {stmt}"
@@ -527,8 +562,9 @@ impl TryFrom<Statement> for CreateTableBuilder {
 #[derive(Default)]
 pub(crate) struct CreateTableConfiguration {
     pub partition_by: Option<Box<Expr>>,
-    pub cluster_by: Option<WrappedCollection<Vec<Ident>>>,
-    pub options: Option<Vec<SqlOption>>,
+    pub cluster_by: Option<WrappedCollection<Vec<Expr>>>,
+    pub inherits: Option<Vec<ObjectName>>,
+    pub table_options: CreateTableOptions,
 }
 
 #[cfg(test)]
@@ -539,7 +575,7 @@ mod tests {
 
     #[test]
     pub fn test_from_valid_statement() {
-        let builder = CreateTableBuilder::new(ObjectName(vec![Ident::new("table_name")]));
+        let builder = CreateTableBuilder::new(ObjectName::from(vec![Ident::new("table_name")]));
 
         let stmt = builder.clone().build();
 
@@ -548,7 +584,11 @@ mod tests {
 
     #[test]
     pub fn test_from_invalid_statement() {
-        let stmt = Statement::Commit { chain: false };
+        let stmt = Statement::Commit {
+            chain: false,
+            end: false,
+            modifier: None,
+        };
 
         assert_eq!(
             CreateTableBuilder::try_from(stmt).unwrap_err(),
diff --git a/src/ast/helpers/stmt_data_loading.rs b/src/ast/helpers/stmt_data_loading.rs
index cda6c6ea4..92a727279 100644
--- a/src/ast/helpers/stmt_data_loading.rs
+++ b/src/ast/helpers/stmt_data_loading.rs
@@ -21,15 +21,13 @@
 
 #[cfg(not(feature = "std"))]
 use alloc::string::String;
-#[cfg(not(feature = "std"))]
-use alloc::vec::Vec;
 use core::fmt;
-use core::fmt::Formatter;
 
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
 
-use crate::ast::Ident;
+use crate::ast::helpers::key_value_options::KeyValueOptions;
+use crate::ast::{Ident, ObjectName, SelectItem};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
@@ -38,35 +36,29 @@ use sqlparser_derive::{Visit, VisitMut};
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct StageParamsObject {
     pub url: Option<String>,
-    pub encryption: DataLoadingOptions,
+    pub encryption: KeyValueOptions,
     pub endpoint: Option<String>,
     pub storage_integration: Option<String>,
-    pub credentials: DataLoadingOptions,
+    pub credentials: KeyValueOptions,
 }
 
+/// This enum enables support for both standard SQL select item expressions
+/// and Snowflake-specific ones for data loading.
 #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub struct DataLoadingOptions {
-    pub options: Vec<DataLoadingOption>,
+pub enum StageLoadSelectItemKind {
+    SelectItem(SelectItem),
+    StageLoadSelectItem(StageLoadSelectItem),
 }
 
-#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
-#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub enum DataLoadingOptionType {
-    STRING,
-    BOOLEAN,
-    ENUM,
-}
-
-#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
-#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub struct DataLoadingOption {
-    pub option_name: String,
-    pub option_type: DataLoadingOptionType,
-    pub value: String,
+impl fmt::Display for StageLoadSelectItemKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match &self {
+            StageLoadSelectItemKind::SelectItem(item) => write!(f, "{item}"),
+            StageLoadSelectItemKind::StageLoadSelectItem(item) => write!(f, "{item}"),
+        }
+    }
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
@@ -105,42 +97,6 @@ impl fmt::Display for StageParamsObject {
     }
 }
 
-impl fmt::Display for DataLoadingOptions {
-    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
-        if !self.options.is_empty() {
-            let mut first = false;
-            for option in &self.options {
-                if !first {
-                    first = true;
-                } else {
-                    f.write_str(" ")?;
-                }
-                write!(f, "{}", option)?;
-            }
-        }
-        Ok(())
-    }
-}
-
-impl fmt::Display for DataLoadingOption {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self.option_type {
-            DataLoadingOptionType::STRING => {
-                write!(f, "{}='{}'", self.option_name, self.value)?;
-            }
-            DataLoadingOptionType::ENUM => {
-                // single quote is omitted
-                write!(f, "{}={}", self.option_name, self.value)?;
-            }
-            DataLoadingOptionType::BOOLEAN => {
-                // single quote is omitted
-                write!(f, "{}={}", self.option_name, self.value)?;
-            }
-        }
-        Ok(())
-    }
-}
-
 impl fmt::Display for StageLoadSelectItem {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if self.alias.is_some() {
@@ -156,3 +112,22 @@ impl fmt::Display for StageLoadSelectItem {
         Ok(())
     }
 }
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct FileStagingCommand {
+    #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
+    pub stage: ObjectName,
+    pub pattern: Option<String>,
+}
+
+impl fmt::Display for FileStagingCommand {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.stage)?;
+        if let Some(pattern) = self.pattern.as_ref() {
+            write!(f, " PATTERN='{pattern}'")?;
+        }
+        Ok(())
+    }
+}
diff --git a/src/ast/mod.rs b/src/ast/mod.rs
index 9185c9df4..4a864cfa7 100644
--- a/src/ast/mod.rs
+++ b/src/ast/mod.rs
@@ -23,9 +23,17 @@ use alloc::{
     string::{String, ToString},
     vec::Vec,
 };
+use helpers::{
+    attached_token::AttachedToken,
+    stmt_data_loading::{FileStagingCommand, StageLoadSelectItemKind},
+};
 
-use core::fmt::{self, Display};
+use core::cmp::Ordering;
 use core::ops::Deref;
+use core::{
+    fmt::{self, Display},
+    hash,
+};
 
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
@@ -33,35 +41,56 @@ use serde::{Deserialize, Serialize};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
+use crate::{
+    display_utils::{indented_list, SpaceOrNewline},
+    tokenizer::{Span, Token},
+};
+use crate::{
+    display_utils::{Indent, NewLine},
+    keywords::Keyword,
+};
+
 pub use self::data_type::{
-    ArrayElemTypeDef, CharLengthUnits, CharacterLength, DataType, ExactNumberInfo,
-    StructBracketKind, TimezoneInfo,
+    ArrayElemTypeDef, BinaryLength, CharLengthUnits, CharacterLength, DataType, EnumMember,
+    ExactNumberInfo, IntervalFields, StructBracketKind, TimezoneInfo,
+};
+pub use self::dcl::{
+    AlterRoleOperation, ResetConfig, RoleOption, SecondaryRoles, SetConfigValue, Use,
 };
-pub use self::dcl::{AlterRoleOperation, ResetConfig, RoleOption, SetConfigValue, Use};
 pub use self::ddl::{
-    AlterColumnOperation, AlterIndexOperation, AlterPolicyOperation, AlterTableOperation,
-    ClusteredBy, ColumnDef, ColumnOption, ColumnOptionDef, ColumnPolicy, ColumnPolicyProperty,
-    ConstraintCharacteristics, Deduplicate, DeferrableInitial, GeneratedAs,
-    GeneratedExpressionMode, IdentityParameters, IdentityProperty, IdentityPropertyFormatKind,
-    IdentityPropertyKind, IdentityPropertyOrder, IndexOption, IndexType, KeyOrIndexDisplay, Owner,
-    Partition, ProcedureParam, ReferentialAction, TableConstraint, TagsColumnOption,
-    UserDefinedTypeCompositeAttributeDef, UserDefinedTypeRepresentation, ViewColumnDef,
+    AlterColumnOperation, AlterConnectorOwner, AlterIndexOperation, AlterPolicyOperation,
+    AlterTableAlgorithm, AlterTableLock, AlterTableOperation, AlterType, AlterTypeAddValue,
+    AlterTypeAddValuePosition, AlterTypeOperation, AlterTypeRename, AlterTypeRenameValue,
+    ClusteredBy, ColumnDef, ColumnOption, ColumnOptionDef, ColumnOptions, ColumnPolicy,
+    ColumnPolicyProperty, ConstraintCharacteristics, CreateConnector, CreateDomain, CreateFunction,
+    Deduplicate, DeferrableInitial, DropBehavior, GeneratedAs, GeneratedExpressionMode,
+    IdentityParameters, IdentityProperty, IdentityPropertyFormatKind, IdentityPropertyKind,
+    IdentityPropertyOrder, IndexOption, IndexType, KeyOrIndexDisplay, NullsDistinctOption, Owner,
+    Partition, ProcedureParam, ReferentialAction, RenameTableNameKind, ReplicaIdentity,
+    TableConstraint, TagsColumnOption, UserDefinedTypeCompositeAttributeDef,
+    UserDefinedTypeRepresentation, ViewColumnDef,
 };
-pub use self::dml::{CreateIndex, CreateTable, Delete, Insert};
+pub use self::dml::{CreateIndex, CreateTable, Delete, IndexColumn, Insert};
 pub use self::operator::{BinaryOperator, UnaryOperator};
 pub use self::query::{
     AfterMatchSkip, ConnectBy, Cte, CteAsMaterialized, Distinct, EmptyMatchesMode,
-    ExceptSelectItem, ExcludeSelectItem, ExprWithAlias, Fetch, ForClause, ForJson, ForXml,
-    FormatClause, GroupByExpr, GroupByWithModifier, IdentWithAlias, IlikeSelectItem, Interpolate,
-    InterpolateExpr, Join, JoinConstraint, JoinOperator, JsonTableColumn,
-    JsonTableColumnErrorHandling, JsonTableNamedColumn, JsonTableNestedColumn, LateralView,
-    LockClause, LockType, MatchRecognizePattern, MatchRecognizeSymbol, Measure,
-    NamedWindowDefinition, NamedWindowExpr, NonBlock, Offset, OffsetRows, OpenJsonTableColumn,
-    OrderBy, OrderByExpr, PivotValueSource, ProjectionSelect, Query, RenameSelectItem,
+    ExceptSelectItem, ExcludeSelectItem, ExprWithAlias, ExprWithAliasAndOrderBy, Fetch, ForClause,
+    ForJson, ForXml, FormatClause, GroupByExpr, GroupByWithModifier, IdentWithAlias,
+    IlikeSelectItem, InputFormatClause, Interpolate, InterpolateExpr, Join, JoinConstraint,
+    JoinOperator, JsonTableColumn, JsonTableColumnErrorHandling, JsonTableNamedColumn,
+    JsonTableNestedColumn, LateralView, LimitClause, LockClause, LockType, MatchRecognizePattern,
+    MatchRecognizeSymbol, Measure, NamedWindowDefinition, NamedWindowExpr, NonBlock, Offset,
+    OffsetRows, OpenJsonTableColumn, OrderBy, OrderByExpr, OrderByKind, OrderByOptions,
+    PipeOperator, PivotValueSource, ProjectionSelect, Query, RenameSelectItem,
     RepetitionQuantifier, ReplaceSelectElement, ReplaceSelectItem, RowsPerMatch, Select,
-    SelectInto, SelectItem, SetExpr, SetOperator, SetQuantifier, Setting, SymbolDefinition, Table,
-    TableAlias, TableAliasColumnDef, TableFactor, TableFunctionArgs, TableVersion, TableWithJoins,
-    Top, TopQuantity, ValueTableMode, Values, WildcardAdditionalOptions, With, WithFill,
+    SelectFlavor, SelectInto, SelectItem, SelectItemQualifiedWildcardKind, SetExpr, SetOperator,
+    SetQuantifier, Setting, SymbolDefinition, Table, TableAlias, TableAliasColumnDef, TableFactor,
+    TableFunctionArgs, TableIndexHintForClause, TableIndexHintType, TableIndexHints,
+    TableIndexType, TableSample, TableSampleBucket, TableSampleKind, TableSampleMethod,
+    TableSampleModifier, TableSampleQuantity, TableSampleSeed, TableSampleSeedModifier,
+    TableSampleUnit, TableVersion, TableWithJoins, Top, TopQuantity, UpdateTableFromKind,
+    ValueTableMode, Values, WildcardAdditionalOptions, With, WithFill, XmlNamespaceDefinition,
+    XmlPassingArgument, XmlPassingClause, XmlTableColumn, XmlTableColumnOption,
 };
 
 pub use self::trigger::{
@@ -71,15 +100,17 @@ pub use self::trigger::{
 
 pub use self::value::{
     escape_double_quote_string, escape_quoted_string, DateTimeField, DollarQuotedString,
-    TrimWhereField, Value,
+    NormalizationForm, TrimWhereField, Value, ValueWithSpan,
 };
 
-use crate::ast::helpers::stmt_data_loading::{
-    DataLoadingOptions, StageLoadSelectItem, StageParamsObject,
-};
+use crate::ast::helpers::key_value_options::KeyValueOptions;
+use crate::ast::helpers::stmt_data_loading::StageParamsObject;
+
 #[cfg(feature = "visitor")]
 pub use visitor::*;
 
+pub use self::data_type::GeometricTypeKind;
+
 mod data_type;
 mod dcl;
 mod ddl;
@@ -87,6 +118,9 @@ mod dml;
 pub mod helpers;
 mod operator;
 mod query;
+mod spans;
+pub use spans::Spanned;
+
 mod trigger;
 mod value;
 
@@ -101,16 +135,16 @@ where
     sep: &'static str,
 }
 
-impl<'a, T> fmt::Display for DisplaySeparated<'a, T>
+impl<T> fmt::Display for DisplaySeparated<'_, T>
 where
     T: fmt::Display,
 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         let mut delim = "";
         for t in self.slice {
-            write!(f, "{delim}")?;
+            f.write_str(delim)?;
             delim = self.sep;
-            write!(f, "{t}")?;
+            t.fmt(f)?;
         }
         Ok(())
     }
@@ -130,8 +164,17 @@ where
     DisplaySeparated { slice, sep: ", " }
 }
 
+/// Writes the given statements to the formatter, each ending with
+/// a semicolon and space separated.
+fn format_statement_list(f: &mut fmt::Formatter, statements: &[Statement]) -> fmt::Result {
+    write!(f, "{}", display_separated(statements, "; "))?;
+    // We manually insert semicolon for the last statement,
+    // since display_separated doesn't handle that case.
+    write!(f, ";")
+}
+
 /// An identifier, decomposed into its value or character data and the quote style.
-#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[derive(Debug, Clone)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Ident {
@@ -140,10 +183,70 @@ pub struct Ident {
     /// The starting quote if any. Valid quote characters are the single quote,
     /// double quote, backtick, and opening square bracket.
     pub quote_style: Option<char>,
+    /// The span of the identifier in the original SQL string.
+    pub span: Span,
+}
+
+impl PartialEq for Ident {
+    fn eq(&self, other: &Self) -> bool {
+        let Ident {
+            value,
+            quote_style,
+            // exhaustiveness check; we ignore spans in comparisons
+            span: _,
+        } = self;
+
+        value == &other.value && quote_style == &other.quote_style
+    }
+}
+
+impl core::hash::Hash for Ident {
+    fn hash<H: hash::Hasher>(&self, state: &mut H) {
+        let Ident {
+            value,
+            quote_style,
+            // exhaustiveness check; we ignore spans in hashes
+            span: _,
+        } = self;
+
+        value.hash(state);
+        quote_style.hash(state);
+    }
+}
+
+impl Eq for Ident {}
+
+impl PartialOrd for Ident {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+impl Ord for Ident {
+    fn cmp(&self, other: &Self) -> Ordering {
+        let Ident {
+            value,
+            quote_style,
+            // exhaustiveness check; we ignore spans in ordering
+            span: _,
+        } = self;
+
+        let Ident {
+            value: other_value,
+            quote_style: other_quote_style,
+            // exhaustiveness check; we ignore spans in ordering
+            span: _,
+        } = other;
+
+        // First compare by value, then by quote_style
+        value
+            .cmp(other_value)
+            .then_with(|| quote_style.cmp(other_quote_style))
+    }
 }
 
 impl Ident {
-    /// Create a new identifier with the given value and no quotes.
+    /// Create a new identifier with the given value and no quotes and an empty span.
     pub fn new<S>(value: S) -> Self
     where
         S: Into<String>,
@@ -151,6 +254,7 @@ impl Ident {
         Ident {
             value: value.into(),
             quote_style: None,
+            span: Span::empty(),
         }
     }
 
@@ -164,6 +268,30 @@ impl Ident {
         Ident {
             value: value.into(),
             quote_style: Some(quote),
+            span: Span::empty(),
+        }
+    }
+
+    pub fn with_span<S>(span: Span, value: S) -> Self
+    where
+        S: Into<String>,
+    {
+        Ident {
+            value: value.into(),
+            quote_style: None,
+            span,
+        }
+    }
+
+    pub fn with_quote_and_span<S>(quote: char, span: Span, value: S) -> Self
+    where
+        S: Into<String>,
+    {
+        assert!(quote == '\'' || quote == '"' || quote == '`' || quote == '[');
+        Ident {
+            value: value.into(),
+            quote_style: Some(quote),
+            span,
         }
     }
 }
@@ -173,6 +301,7 @@ impl From<&str> for Ident {
         Ident {
             value: value.to_string(),
             quote_style: None,
+            span: Span::empty(),
         }
     }
 }
@@ -195,7 +324,13 @@ impl fmt::Display for Ident {
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub struct ObjectName(pub Vec<Ident>);
+pub struct ObjectName(pub Vec<ObjectNamePart>);
+
+impl From<Vec<Ident>> for ObjectName {
+    fn from(idents: Vec<Ident>) -> Self {
+        ObjectName(idents.into_iter().map(ObjectNamePart::Identifier).collect())
+    }
+}
 
 impl fmt::Display for ObjectName {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
@@ -203,6 +338,52 @@ impl fmt::Display for ObjectName {
     }
 }
 
+/// A single part of an ObjectName
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ObjectNamePart {
+    Identifier(Ident),
+    Function(ObjectNamePartFunction),
+}
+
+impl ObjectNamePart {
+    pub fn as_ident(&self) -> Option<&Ident> {
+        match self {
+            ObjectNamePart::Identifier(ident) => Some(ident),
+            ObjectNamePart::Function(_) => None,
+        }
+    }
+}
+
+impl fmt::Display for ObjectNamePart {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ObjectNamePart::Identifier(ident) => write!(f, "{ident}"),
+            ObjectNamePart::Function(func) => write!(f, "{func}"),
+        }
+    }
+}
+
+/// An object name part that consists of a function that dynamically
+/// constructs identifiers.
+///
+/// - [Snowflake](https://docs.snowflake.com/en/sql-reference/identifier-literal)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ObjectNamePartFunction {
+    pub name: Ident,
+    pub args: Vec<FunctionArg>,
+}
+
+impl fmt::Display for ObjectNamePartFunction {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}(", self.name)?;
+        write!(f, "{})", display_comma_separated(&self.args))
+    }
+}
+
 /// Represents an Array Expression, either
 /// `ARRAY[..]`, or `[..]`
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -293,28 +474,36 @@ impl fmt::Display for Interval {
 
 /// A field definition within a struct
 ///
-/// [bigquery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type
+/// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct StructField {
     pub field_name: Option<Ident>,
     pub field_type: DataType,
+    /// Struct field options.
+    /// See [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#column_name_and_column_schema)
+    pub options: Option<Vec<SqlOption>>,
 }
 
 impl fmt::Display for StructField {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         if let Some(name) = &self.field_name {
-            write!(f, "{name} {}", self.field_type)
+            write!(f, "{name} {}", self.field_type)?;
+        } else {
+            write!(f, "{}", self.field_type)?;
+        }
+        if let Some(options) = &self.options {
+            write!(f, " OPTIONS({})", display_separated(options, ", "))
         } else {
-            write!(f, "{}", self.field_type)
+            Ok(())
         }
     }
 }
 
 /// A field definition within a union
 ///
-/// [duckdb]: https://duckdb.org/docs/sql/data_types/union.html
+/// [DuckDB]: https://duckdb.org/docs/sql/data_types/union.html
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -331,7 +520,7 @@ impl fmt::Display for UnionField {
 
 /// A dictionary field within a dictionary.
 ///
-/// [duckdb]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
+/// [DuckDB]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -362,7 +551,7 @@ impl Display for Map {
 
 /// A map field within a map.
 ///
-/// [duckdb]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
+/// [DuckDB]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -387,40 +576,6 @@ pub enum CastFormat {
     ValueAtTimeZone(Value, Value),
 }
 
-/// Represents the syntax/style used in a map access.
-#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
-#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub enum MapAccessSyntax {
-    /// Access using bracket notation. `mymap[mykey]`
-    Bracket,
-    /// Access using period notation. `mymap.mykey`
-    Period,
-}
-
-/// Expression used to access a value in a nested structure.
-///
-/// Example: `SAFE_OFFSET(0)` in
-/// ```sql
-/// SELECT mymap[SAFE_OFFSET(0)];
-/// ```
-#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
-#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub struct MapAccessKey {
-    pub key: Expr,
-    pub syntax: MapAccessSyntax,
-}
-
-impl fmt::Display for MapAccessKey {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self.syntax {
-            MapAccessSyntax::Bracket => write!(f, "[{}]", self.key),
-            MapAccessSyntax::Period => write!(f, ".{}", self.key),
-        }
-    }
-}
-
 /// An element of a JSON path.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -528,11 +683,44 @@ pub enum CeilFloorKind {
     Scale(Value),
 }
 
+/// A WHEN clause in a CASE expression containing both
+/// the condition and its corresponding result
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CaseWhen {
+    pub condition: Expr,
+    pub result: Expr,
+}
+
+impl fmt::Display for CaseWhen {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str("WHEN ")?;
+        self.condition.fmt(f)?;
+        f.write_str(" THEN")?;
+        SpaceOrNewline.fmt(f)?;
+        Indent(&self.result).fmt(f)?;
+        Ok(())
+    }
+}
+
 /// An SQL expression of any type.
 ///
+/// # Semantics / Type Checking
+///
 /// The parser does not distinguish between expressions of different types
-/// (e.g. boolean vs string), so the caller must handle expressions of
-/// inappropriate type, like `WHERE 1` or `SELECT 1=1`, as necessary.
+/// (e.g. boolean vs string). The caller is responsible for detecting and
+/// validating types as necessary (for example  `WHERE 1` vs `SELECT 1=1`)
+/// See the [README.md] for more details.
+///
+/// [README.md]: https://github.com/apache/datafusion-sqlparser-rs/blob/main/README.md#syntax-vs-semantics
+///
+/// # Equality and Hashing Does not Include Source Locations
+///
+/// The `Expr` type implements `PartialEq` and `Eq` based on the semantic value
+/// of the expression (not bitwise comparison). This means that `Expr` instances
+/// that are semantically equivalent but have different spans (locations in the
+/// source tree) will compare as equal.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(
@@ -545,6 +733,28 @@ pub enum Expr {
     Identifier(Ident),
     /// Multi-part identifier, e.g. `table_alias.column` or `schema.table.col`
     CompoundIdentifier(Vec<Ident>),
+    /// Multi-part expression access.
+    ///
+    /// This structure represents an access chain in structured / nested types
+    /// such as maps, arrays, and lists:
+    /// - Array
+    ///     - A 1-dim array `a[1]` will be represented like:
+    ///       `CompoundFieldAccess(Ident('a'), vec![Subscript(1)]`
+    ///     - A 2-dim array `a[1][2]` will be represented like:
+    ///       `CompoundFieldAccess(Ident('a'), vec![Subscript(1), Subscript(2)]`
+    /// - Map or Struct (Bracket-style)
+    ///     - A map `a['field1']` will be represented like:
+    ///       `CompoundFieldAccess(Ident('a'), vec![Subscript('field')]`
+    ///     - A 2-dim map `a['field1']['field2']` will be represented like:
+    ///       `CompoundFieldAccess(Ident('a'), vec![Subscript('field1'), Subscript('field2')]`
+    /// - Struct (Dot-style) (only effect when the chain contains both subscript and expr)
+    ///     - A struct access `a[field1].field2` will be represented like:
+    ///       `CompoundFieldAccess(Ident('a'), vec![Subscript('field1'), Ident('field2')]`
+    /// - If a struct access likes `a.field1.field2`, it will be represented by CompoundIdentifier([a, field1, field2])
+    CompoundFieldAccess {
+        root: Box<Expr>,
+        access_chain: Vec<AccessExpr>,
+    },
     /// Access data nested in a value containing semi-structured data, such as
     /// the `VARIANT` type on Snowflake. for example `src:customer[0].name`.
     ///
@@ -556,11 +766,6 @@ pub enum Expr {
         /// The path to the data to extract.
         path: JsonPath,
     },
-    /// CompositeAccess (postgres) eg: SELECT (information_schema._pg_expandarray(array['i','i'])).n
-    CompositeAccess {
-        expr: Box<Expr>,
-        key: Ident,
-    },
     /// `IS FALSE` operator
     IsFalse(Box<Expr>),
     /// `IS NOT FALSE` operator
@@ -581,6 +786,12 @@ pub enum Expr {
     IsDistinctFrom(Box<Expr>, Box<Expr>),
     /// `IS NOT DISTINCT FROM` operator
     IsNotDistinctFrom(Box<Expr>, Box<Expr>),
+    /// `<expr> IS [ NOT ] [ form ] NORMALIZED`
+    IsNormalized {
+        expr: Box<Expr>,
+        form: Option<NormalizationForm>,
+        negated: bool,
+    },
     /// `[ NOT ] IN (val1, val2, ...)`
     InList {
         expr: Box<Expr>,
@@ -620,7 +831,7 @@ pub enum Expr {
         any: bool,
         expr: Box<Expr>,
         pattern: Box<Expr>,
-        escape_char: Option<String>,
+        escape_char: Option<Value>,
     },
     /// `ILIKE` (case-insensitive `LIKE`)
     ILike {
@@ -630,14 +841,14 @@ pub enum Expr {
         any: bool,
         expr: Box<Expr>,
         pattern: Box<Expr>,
-        escape_char: Option<String>,
+        escape_char: Option<Value>,
     },
     /// SIMILAR TO regex
     SimilarTo {
         negated: bool,
         expr: Box<Expr>,
         pattern: Box<Expr>,
-        escape_char: Option<String>,
+        escape_char: Option<Value>,
     },
     /// MySQL: RLIKE regex or REGEXP regex
     RLike {
@@ -691,8 +902,9 @@ pub enum Expr {
         kind: CastKind,
         expr: Box<Expr>,
         data_type: DataType,
-        // Optional CAST(string_expression AS type FORMAT format_string_expression) as used by BigQuery
-        // https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements#formatting_syntax
+        /// Optional CAST(string_expression AS type FORMAT format_string_expression) as used by [BigQuery]
+        ///
+        /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/format-elements#formatting_syntax
         format: Option<CastFormat>,
     },
     /// AT a timestamp to a different timezone e.g. `FROM_UNIXTIME(0) AT TIME ZONE 'UTC-06:00'`
@@ -755,6 +967,10 @@ pub enum Expr {
         /// true if the expression is represented using the `SUBSTRING(expr, start, len)` syntax
         /// This flag is used for formatting.
         special: bool,
+
+        /// true if the expression is represented using the `SUBSTR` shorthand
+        /// This flag is used for formatting.
+        shorthand: bool,
     },
     /// ```sql
     /// TRIM([BOTH | LEADING | TRAILING] [<expr> FROM] <expr>)
@@ -785,55 +1001,32 @@ pub enum Expr {
     /// Nested expression e.g. `(foo > bar)` or `(1)`
     Nested(Box<Expr>),
     /// A literal value, such as string, number, date or NULL
-    Value(Value),
+    Value(ValueWithSpan),
+    /// Prefixed expression, e.g. introducer strings, projection prefix
     /// <https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html>
-    IntroducedString {
-        introducer: String,
-        value: Value,
+    /// <https://docs.snowflake.com/en/sql-reference/constructs/connect-by>
+    Prefixed {
+        prefix: Ident,
+        /// The value of the constant.
+        /// Hint: you can unwrap the string value using `value.into_string()`.
+        value: Box<Expr>,
     },
     /// A constant of form `<data_type> 'value'`.
     /// This can represent ANSI SQL `DATE`, `TIME`, and `TIMESTAMP` literals (such as `DATE '2020-01-01'`),
     /// as well as constants of other types (a non-standard PostgreSQL extension).
-    TypedString {
-        data_type: DataType,
-        value: String,
-    },
-    /// Access a map-like object by field (e.g. `column['field']` or `column[4]`
-    /// Note that depending on the dialect, struct like accesses may be
-    /// parsed as [`Subscript`](Self::Subscript) or [`MapAccess`](Self::MapAccess)
-    /// <https://clickhouse.com/docs/en/sql-reference/data-types/map/>
-    MapAccess {
-        column: Box<Expr>,
-        keys: Vec<MapAccessKey>,
-    },
+    TypedString(TypedString),
     /// Scalar function call e.g. `LEFT(foo, 5)`
     Function(Function),
-    /// Arbitrary expr method call
-    ///
-    /// Syntax:
-    ///
-    /// `<arbitrary-expr>.<function-call>.<function-call-expr>...`
-    ///
-    /// > `arbitrary-expr` can be any expression including a function call.
-    ///
-    /// Example:
-    ///
-    /// ```sql
-    /// SELECT (SELECT ',' + name FROM sys.objects  FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)')   
-    /// SELECT CONVERT(XML,'<Book>abc</Book>').value('.','NVARCHAR(MAX)').value('.','NVARCHAR(MAX)')
-    /// ```
-    ///
-    /// (mssql): <https://learn.microsoft.com/en-us/sql/t-sql/xml/xml-data-type-methods?view=sql-server-ver16>
-    Method(Method),
     /// `CASE [<operand>] WHEN <condition> THEN <result> ... [ELSE <result>] END`
     ///
     /// Note we only recognize a complete single expression as `<condition>`,
     /// not `< 0` nor `1, 2, 3` as allowed in a `<simple when clause>` per
     /// <https://jakewheat.github.io/sql-overview/sql-2011-foundation-grammar.html#simple-when-clause>
     Case {
+        case_token: AttachedToken,
+        end_token: AttachedToken,
         operand: Option<Box<Expr>>,
-        conditions: Vec<Expr>,
-        results: Vec<Expr>,
+        conditions: Vec<CaseWhen>,
         else_result: Option<Box<Expr>>,
     },
     /// An exists expression `[ NOT ] EXISTS(SELECT ...)`, used in expressions like
@@ -853,12 +1046,14 @@ pub enum Expr {
     Rollup(Vec<Vec<Expr>>),
     /// ROW / TUPLE a single value, such as `SELECT (1, 2)`
     Tuple(Vec<Expr>),
-    /// `BigQuery` specific `Struct` literal expression [1]
+    /// `Struct` literal expression
     /// Syntax:
     /// ```sql
     /// STRUCT<[field_name] field_type, ...>( expr1 [, ... ])
+    ///
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type)
+    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/functions/struct.html)
     /// ```
-    /// [1]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_type
     Struct {
         /// Struct values.
         values: Vec<Expr>,
@@ -892,11 +1087,6 @@ pub enum Expr {
     /// ```
     /// [1]: https://duckdb.org/docs/sql/data_types/map#creating-maps
     Map(Map),
-    /// An access of nested data using subscript syntax, for example `array[2]`.
-    Subscript {
-        expr: Box<Expr>,
-        subscript: Box<Subscript>,
-    },
     /// An array expression e.g. `ARRAY[1, 2]`
     Array(Array),
     /// An interval expression e.g. `INTERVAL '1' YEAR`
@@ -913,16 +1103,16 @@ pub enum Expr {
     /// [(1)]: https://dev.mysql.com/doc/refman/8.0/en/fulltext-search.html#function_match
     MatchAgainst {
         /// `(<col>, <col>, ...)`.
-        columns: Vec<Ident>,
+        columns: Vec<ObjectName>,
         /// `<expr>`.
         match_value: Value,
         /// `<search modifier>`
         opt_search_modifier: Option<SearchModifier>,
     },
-    Wildcard,
+    Wildcard(AttachedToken),
     /// Qualified wildcard, e.g. `alias.*` or `schema.table.*`.
     /// (Same caveats apply to `QualifiedWildcard` as to `Wildcard`.)
-    QualifiedWildcard(ObjectName),
+    QualifiedWildcard(ObjectName, AttachedToken),
     /// Some dialects support an older syntax for outer joins where columns are
     /// marked with the `(+)` operator in the WHERE clause, for example:
     ///
@@ -947,8 +1137,19 @@ pub enum Expr {
     /// param -> expr | (param1, ...) -> expr
     /// ```
     ///
-    /// See <https://docs.databricks.com/en/sql/language-manual/sql-ref-lambda-functions.html>.
+    /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function)
+    /// [Databricks](https://docs.databricks.com/en/sql/language-manual/sql-ref-lambda-functions.html)
+    /// [DuckDB](https://duckdb.org/docs/stable/sql/functions/lambda)
     Lambda(LambdaFunction),
+    /// Checks membership of a value in a JSON array
+    MemberOf(MemberOf),
+}
+
+impl Expr {
+    /// Creates a new [`Expr::Value`]
+    pub fn value(value: impl Into<ValueWithSpan>) -> Self {
+        Expr::Value(value.into())
+    }
 }
 
 /// The contents inside the `[` and `]` in a subscript expression.
@@ -1013,6 +1214,27 @@ impl fmt::Display for Subscript {
     }
 }
 
+/// An element of a [`Expr::CompoundFieldAccess`].
+/// It can be an expression or a subscript.
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AccessExpr {
+    /// Accesses a field using dot notation, e.g. `foo.bar.baz`.
+    Dot(Expr),
+    /// Accesses a field or array element using bracket notation, e.g. `foo['bar']`.
+    Subscript(Subscript),
+}
+
+impl fmt::Display for AccessExpr {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            AccessExpr::Dot(expr) => write!(f, ".{expr}"),
+            AccessExpr::Subscript(subscript) => write!(f, "[{subscript}]"),
+        }
+    }
+}
+
 /// A lambda function.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -1036,7 +1258,7 @@ impl fmt::Display for LambdaFunction {
 /// `OneOrManyWithParens` implements `Deref<Target = [T]>` and `IntoIterator`,
 /// so you can call slice methods on it and iterate over items
 /// # Examples
-/// Acessing as a slice:
+/// Accessing as a slice:
 /// ```
 /// # use sqlparser::ast::OneOrManyWithParens;
 /// let one = OneOrManyWithParens::One("a");
@@ -1205,15 +1427,20 @@ impl fmt::Display for CastFormat {
 }
 
 impl fmt::Display for Expr {
+    #[cfg_attr(feature = "recursive-protection", recursive::recursive)]
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
             Expr::Identifier(s) => write!(f, "{s}"),
-            Expr::MapAccess { column, keys } => {
-                write!(f, "{column}{}", display_separated(keys, ""))
-            }
-            Expr::Wildcard => f.write_str("*"),
-            Expr::QualifiedWildcard(prefix) => write!(f, "{}.*", prefix),
+            Expr::Wildcard(_) => f.write_str("*"),
+            Expr::QualifiedWildcard(prefix, _) => write!(f, "{prefix}.*"),
             Expr::CompoundIdentifier(s) => write!(f, "{}", display_separated(s, ".")),
+            Expr::CompoundFieldAccess { root, access_chain } => {
+                write!(f, "{root}")?;
+                for field in access_chain {
+                    write!(f, "{field}")?;
+                }
+                Ok(())
+            }
             Expr::IsTrue(ast) => write!(f, "{ast} IS TRUE"),
             Expr::IsNotTrue(ast) => write!(f, "{ast} IS NOT TRUE"),
             Expr::IsFalse(ast) => write!(f, "{ast} IS FALSE"),
@@ -1278,7 +1505,7 @@ impl fmt::Display for Expr {
             } => match escape_char {
                 Some(ch) => write!(
                     f,
-                    "{} {}LIKE {}{} ESCAPE '{}'",
+                    "{} {}LIKE {}{} ESCAPE {}",
                     expr,
                     if *negated { "NOT " } else { "" },
                     if *any { "ANY " } else { "" },
@@ -1303,7 +1530,7 @@ impl fmt::Display for Expr {
             } => match escape_char {
                 Some(ch) => write!(
                     f,
-                    "{} {}ILIKE {}{} ESCAPE '{}'",
+                    "{} {}ILIKE {}{} ESCAPE {}",
                     expr,
                     if *negated { "NOT " } else { "" },
                     if *any { "ANY" } else { "" },
@@ -1332,6 +1559,24 @@ impl fmt::Display for Expr {
                 if *regexp { "REGEXP" } else { "RLIKE" },
                 pattern
             ),
+            Expr::IsNormalized {
+                expr,
+                form,
+                negated,
+            } => {
+                let not_ = if *negated { "NOT " } else { "" };
+                if form.is_none() {
+                    write!(f, "{expr} IS {not_}NORMALIZED")
+                } else {
+                    write!(
+                        f,
+                        "{} IS {}{} NORMALIZED",
+                        expr,
+                        not_,
+                        form.as_ref().unwrap()
+                    )
+                }
+            }
             Expr::SimilarTo {
                 negated,
                 expr,
@@ -1340,7 +1585,7 @@ impl fmt::Display for Expr {
             } => match escape_char {
                 Some(ch) => write!(
                     f,
-                    "{} {}SIMILAR TO {} ESCAPE '{}'",
+                    "{} {}SIMILAR TO {} ESCAPE {}",
                     expr,
                     if *negated { "NOT " } else { "" },
                     pattern,
@@ -1385,7 +1630,15 @@ impl fmt::Display for Expr {
             Expr::UnaryOp { op, expr } => {
                 if op == &UnaryOperator::PGPostfixFactorial {
                     write!(f, "{expr}{op}")
-                } else if op == &UnaryOperator::Not {
+                } else if matches!(
+                    op,
+                    UnaryOperator::Not
+                        | UnaryOperator::Hash
+                        | UnaryOperator::AtDashAt
+                        | UnaryOperator::DoubleAt
+                        | UnaryOperator::QuestionDash
+                        | UnaryOperator::QuestionPipe
+                ) {
                     write!(f, "{op} {expr}")
                 } else {
                     write!(f, "{op}{expr}")
@@ -1475,31 +1728,33 @@ impl fmt::Display for Expr {
             Expr::Collate { expr, collation } => write!(f, "{expr} COLLATE {collation}"),
             Expr::Nested(ast) => write!(f, "({ast})"),
             Expr::Value(v) => write!(f, "{v}"),
-            Expr::IntroducedString { introducer, value } => write!(f, "{introducer} {value}"),
-            Expr::TypedString { data_type, value } => {
-                write!(f, "{data_type}")?;
-                write!(f, " '{}'", &value::escape_single_quote_string(value))
-            }
-            Expr::Function(fun) => write!(f, "{fun}"),
-            Expr::Method(method) => write!(f, "{method}"),
+            Expr::Prefixed { prefix, value } => write!(f, "{prefix} {value}"),
+            Expr::TypedString(ts) => ts.fmt(f),
+            Expr::Function(fun) => fun.fmt(f),
             Expr::Case {
+                case_token: _,
+                end_token: _,
                 operand,
                 conditions,
-                results,
                 else_result,
             } => {
-                write!(f, "CASE")?;
+                f.write_str("CASE")?;
                 if let Some(operand) = operand {
-                    write!(f, " {operand}")?;
+                    f.write_str(" ")?;
+                    operand.fmt(f)?;
                 }
-                for (c, r) in conditions.iter().zip(results) {
-                    write!(f, " WHEN {c} THEN {r}")?;
+                for when in conditions {
+                    SpaceOrNewline.fmt(f)?;
+                    Indent(when).fmt(f)?;
                 }
-
                 if let Some(else_result) = else_result {
-                    write!(f, " ELSE {else_result}")?;
+                    SpaceOrNewline.fmt(f)?;
+                    Indent("ELSE").fmt(f)?;
+                    SpaceOrNewline.fmt(f)?;
+                    Indent(Indent(else_result)).fmt(f)?;
                 }
-                write!(f, " END")
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("END")
             }
             Expr::Exists { subquery, negated } => write!(
                 f,
@@ -1551,8 +1806,13 @@ impl fmt::Display for Expr {
                 substring_from,
                 substring_for,
                 special,
+                shorthand,
             } => {
-                write!(f, "SUBSTRING({expr}")?;
+                f.write_str("SUBSTR")?;
+                if !*shorthand {
+                    f.write_str("ING")?;
+                }
+                write!(f, "({expr}")?;
                 if let Some(from_part) = substring_from {
                     if *special {
                         write!(f, ", {from_part}")?;
@@ -1625,7 +1885,7 @@ impl fmt::Display for Expr {
                 }
             }
             Expr::Named { expr, name } => {
-                write!(f, "{} AS {}", expr, name)
+                write!(f, "{expr} AS {name}")
             }
             Expr::Dictionary(fields) => {
                 write!(f, "{{{}}}", display_comma_separated(fields))
@@ -1633,21 +1893,12 @@ impl fmt::Display for Expr {
             Expr::Map(map) => {
                 write!(f, "{map}")
             }
-            Expr::Subscript {
-                expr,
-                subscript: key,
-            } => {
-                write!(f, "{expr}[{key}]")
-            }
             Expr::Array(set) => {
                 write!(f, "{set}")
             }
             Expr::JsonAccess { value, path } => {
                 write!(f, "{value}{path}")
             }
-            Expr::CompositeAccess { expr, key } => {
-                write!(f, "{expr}.{key}")
-            }
             Expr::AtTimeZone {
                 timestamp,
                 time_zone,
@@ -1677,6 +1928,7 @@ impl fmt::Display for Expr {
             }
             Expr::Prior(expr) => write!(f, "PRIOR {expr}"),
             Expr::Lambda(lambda) => write!(f, "{lambda}"),
+            Expr::MemberOf(member_of) => write!(f, "{member_of}"),
         }
     }
 }
@@ -1692,8 +1944,14 @@ pub enum WindowType {
 impl Display for WindowType {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
-            WindowType::WindowSpec(spec) => write!(f, "({})", spec),
-            WindowType::NamedWindow(name) => write!(f, "{}", name),
+            WindowType::WindowSpec(spec) => {
+                f.write_str("(")?;
+                NewLine.fmt(f)?;
+                Indent(spec).fmt(f)?;
+                NewLine.fmt(f)?;
+                f.write_str(")")
+            }
+            WindowType::NamedWindow(name) => name.fmt(f),
         }
     }
 }
@@ -1721,14 +1979,19 @@ pub struct WindowSpec {
 
 impl fmt::Display for WindowSpec {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let mut delim = "";
+        let mut is_first = true;
         if let Some(window_name) = &self.window_name {
-            delim = " ";
+            if !is_first {
+                SpaceOrNewline.fmt(f)?;
+            }
+            is_first = false;
             write!(f, "{window_name}")?;
         }
         if !self.partition_by.is_empty() {
-            f.write_str(delim)?;
-            delim = " ";
+            if !is_first {
+                SpaceOrNewline.fmt(f)?;
+            }
+            is_first = false;
             write!(
                 f,
                 "PARTITION BY {}",
@@ -1736,12 +1999,16 @@ impl fmt::Display for WindowSpec {
             )?;
         }
         if !self.order_by.is_empty() {
-            f.write_str(delim)?;
-            delim = " ";
+            if !is_first {
+                SpaceOrNewline.fmt(f)?;
+            }
+            is_first = false;
             write!(f, "ORDER BY {}", display_comma_separated(&self.order_by))?;
         }
         if let Some(window_frame) = &self.window_frame {
-            f.write_str(delim)?;
+            if !is_first {
+                SpaceOrNewline.fmt(f)?;
+            }
             if let Some(end_bound) = &window_frame.end_bound {
                 write!(
                     f,
@@ -1930,79 +2197,419 @@ pub enum Password {
     NullPassword,
 }
 
-/// Represents an expression assignment within a variable `DECLARE` statement.
+/// A `CASE` statement.
 ///
 /// Examples:
 /// ```sql
-/// DECLARE variable_name := 42
-/// DECLARE variable_name DEFAULT 42
+/// CASE
+///     WHEN EXISTS(SELECT 1)
+///         THEN SELECT 1 FROM T;
+///     WHEN EXISTS(SELECT 2)
+///         THEN SELECT 1 FROM U;
+///     ELSE
+///         SELECT 1 FROM V;
+/// END CASE;
 /// ```
+///
+/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#case_search_expression)
+/// [Snowflake](https://docs.snowflake.com/en/sql-reference/snowflake-scripting/case)
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub enum DeclareAssignment {
-    /// Plain expression specified.
-    Expr(Box<Expr>),
+pub struct CaseStatement {
+    /// The `CASE` token that starts the statement.
+    pub case_token: AttachedToken,
+    pub match_expr: Option<Expr>,
+    pub when_blocks: Vec<ConditionalStatementBlock>,
+    pub else_block: Option<ConditionalStatementBlock>,
+    /// The last token of the statement (`END` or `CASE`).
+    pub end_case_token: AttachedToken,
+}
 
-    /// Expression assigned via the `DEFAULT` keyword
-    Default(Box<Expr>),
+impl fmt::Display for CaseStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let CaseStatement {
+            case_token: _,
+            match_expr,
+            when_blocks,
+            else_block,
+            end_case_token: AttachedToken(end),
+        } = self;
 
-    /// Expression assigned via the `:=` syntax
-    ///
-    /// Example:
-    /// ```sql
-    /// DECLARE variable_name := 42;
-    /// ```
-    DuckAssignment(Box<Expr>),
+        write!(f, "CASE")?;
 
-    /// Expression via the `FOR` keyword
-    ///
-    /// Example:
-    /// ```sql
-    /// DECLARE c1 CURSOR FOR res
-    /// ```
-    For(Box<Expr>),
+        if let Some(expr) = match_expr {
+            write!(f, " {expr}")?;
+        }
 
-    /// Expression via the `=` syntax.
-    ///
-    /// Example:
-    /// ```sql
-    /// DECLARE @variable AS INT = 100
-    /// ```
-    MsSqlAssignment(Box<Expr>),
-}
+        if !when_blocks.is_empty() {
+            write!(f, " {}", display_separated(when_blocks, " "))?;
+        }
 
-impl fmt::Display for DeclareAssignment {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            DeclareAssignment::Expr(expr) => {
-                write!(f, "{expr}")
-            }
-            DeclareAssignment::Default(expr) => {
-                write!(f, "DEFAULT {expr}")
-            }
-            DeclareAssignment::DuckAssignment(expr) => {
-                write!(f, ":= {expr}")
-            }
-            DeclareAssignment::MsSqlAssignment(expr) => {
-                write!(f, "= {expr}")
-            }
-            DeclareAssignment::For(expr) => {
-                write!(f, "FOR {expr}")
+        if let Some(else_block) = else_block {
+            write!(f, " {else_block}")?;
+        }
+
+        write!(f, " END")?;
+
+        if let Token::Word(w) = &end.token {
+            if w.keyword == Keyword::CASE {
+                write!(f, " CASE")?;
             }
         }
+
+        Ok(())
     }
 }
 
-/// Represents the type of a `DECLARE` statement.
+/// An `IF` statement.
+///
+/// Example (BigQuery or Snowflake):
+/// ```sql
+/// IF TRUE THEN
+///     SELECT 1;
+///     SELECT 2;
+/// ELSEIF TRUE THEN
+///     SELECT 3;
+/// ELSE
+///     SELECT 4;
+/// END IF
+/// ```
+/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#if)
+/// [Snowflake](https://docs.snowflake.com/en/sql-reference/snowflake-scripting/if)
+///
+/// Example (MSSQL):
+/// ```sql
+/// IF 1=1 SELECT 1 ELSE SELECT 2
+/// ```
+/// [MSSQL](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/if-else-transact-sql?view=sql-server-ver16)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct IfStatement {
+    pub if_block: ConditionalStatementBlock,
+    pub elseif_blocks: Vec<ConditionalStatementBlock>,
+    pub else_block: Option<ConditionalStatementBlock>,
+    pub end_token: Option<AttachedToken>,
+}
+
+impl fmt::Display for IfStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let IfStatement {
+            if_block,
+            elseif_blocks,
+            else_block,
+            end_token,
+        } = self;
+
+        write!(f, "{if_block}")?;
+
+        for elseif_block in elseif_blocks {
+            write!(f, " {elseif_block}")?;
+        }
+
+        if let Some(else_block) = else_block {
+            write!(f, " {else_block}")?;
+        }
+
+        if let Some(AttachedToken(end_token)) = end_token {
+            write!(f, " END {end_token}")?;
+        }
+
+        Ok(())
+    }
+}
+
+/// A `WHILE` statement.
+///
+/// Example:
+/// ```sql
+/// WHILE @@FETCH_STATUS = 0
+/// BEGIN
+///    FETCH NEXT FROM c1 INTO @var1, @var2;
+/// END
+/// ```
+///
+/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/while-transact-sql)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct WhileStatement {
+    pub while_block: ConditionalStatementBlock,
+}
+
+impl fmt::Display for WhileStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let WhileStatement { while_block } = self;
+        write!(f, "{while_block}")?;
+        Ok(())
+    }
+}
+
+/// A block within a [Statement::Case] or [Statement::If] or [Statement::While]-like statement
+///
+/// Example 1:
+/// ```sql
+/// WHEN EXISTS(SELECT 1) THEN SELECT 1;
+/// ```
+///
+/// Example 2:
+/// ```sql
+/// IF TRUE THEN SELECT 1; SELECT 2;
+/// ```
+///
+/// Example 3:
+/// ```sql
+/// ELSE SELECT 1; SELECT 2;
+/// ```
+///
+/// Example 4:
+/// ```sql
+/// WHILE @@FETCH_STATUS = 0
+/// BEGIN
+///    FETCH NEXT FROM c1 INTO @var1, @var2;
+/// END
+/// ```
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ConditionalStatementBlock {
+    pub start_token: AttachedToken,
+    pub condition: Option<Expr>,
+    pub then_token: Option<AttachedToken>,
+    pub conditional_statements: ConditionalStatements,
+}
+
+impl ConditionalStatementBlock {
+    pub fn statements(&self) -> &Vec<Statement> {
+        self.conditional_statements.statements()
+    }
+}
+
+impl fmt::Display for ConditionalStatementBlock {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let ConditionalStatementBlock {
+            start_token: AttachedToken(start_token),
+            condition,
+            then_token,
+            conditional_statements,
+        } = self;
+
+        write!(f, "{start_token}")?;
+
+        if let Some(condition) = condition {
+            write!(f, " {condition}")?;
+        }
+
+        if then_token.is_some() {
+            write!(f, " THEN")?;
+        }
+
+        if !conditional_statements.statements().is_empty() {
+            write!(f, " {conditional_statements}")?;
+        }
+
+        Ok(())
+    }
+}
+
+/// A list of statements in a [ConditionalStatementBlock].
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ConditionalStatements {
+    /// SELECT 1; SELECT 2; SELECT 3; ...
+    Sequence { statements: Vec<Statement> },
+    /// BEGIN SELECT 1; SELECT 2; SELECT 3; ... END
+    BeginEnd(BeginEndStatements),
+}
+
+impl ConditionalStatements {
+    pub fn statements(&self) -> &Vec<Statement> {
+        match self {
+            ConditionalStatements::Sequence { statements } => statements,
+            ConditionalStatements::BeginEnd(bes) => &bes.statements,
+        }
+    }
+}
+
+impl fmt::Display for ConditionalStatements {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ConditionalStatements::Sequence { statements } => {
+                if !statements.is_empty() {
+                    format_statement_list(f, statements)?;
+                }
+                Ok(())
+            }
+            ConditionalStatements::BeginEnd(bes) => write!(f, "{bes}"),
+        }
+    }
+}
+
+/// Represents a list of statements enclosed within `BEGIN` and `END` keywords.
+/// Example:
+/// ```sql
+/// BEGIN
+///     SELECT 1;
+///     SELECT 2;
+/// END
+/// ```
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct BeginEndStatements {
+    pub begin_token: AttachedToken,
+    pub statements: Vec<Statement>,
+    pub end_token: AttachedToken,
+}
+
+impl fmt::Display for BeginEndStatements {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let BeginEndStatements {
+            begin_token: AttachedToken(begin_token),
+            statements,
+            end_token: AttachedToken(end_token),
+        } = self;
+
+        if begin_token.token != Token::EOF {
+            write!(f, "{begin_token} ")?;
+        }
+        if !statements.is_empty() {
+            format_statement_list(f, statements)?;
+        }
+        if end_token.token != Token::EOF {
+            write!(f, " {end_token}")?;
+        }
+        Ok(())
+    }
+}
+
+/// A `RAISE` statement.
+///
+/// Examples:
+/// ```sql
+/// RAISE USING MESSAGE = 'error';
+///
+/// RAISE myerror;
+/// ```
+///
+/// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#raise)
+/// [Snowflake](https://docs.snowflake.com/en/sql-reference/snowflake-scripting/raise)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct RaiseStatement {
+    pub value: Option<RaiseStatementValue>,
+}
+
+impl fmt::Display for RaiseStatement {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let RaiseStatement { value } = self;
+
+        write!(f, "RAISE")?;
+        if let Some(value) = value {
+            write!(f, " {value}")?;
+        }
+
+        Ok(())
+    }
+}
+
+/// Represents the error value of a [RaiseStatement].
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum RaiseStatementValue {
+    /// `RAISE USING MESSAGE = 'error'`
+    UsingMessage(Expr),
+    /// `RAISE myerror`
+    Expr(Expr),
+}
+
+impl fmt::Display for RaiseStatementValue {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            RaiseStatementValue::Expr(expr) => write!(f, "{expr}"),
+            RaiseStatementValue::UsingMessage(expr) => write!(f, "USING MESSAGE = {expr}"),
+        }
+    }
+}
+
+/// Represents an expression assignment within a variable `DECLARE` statement.
+///
+/// Examples:
+/// ```sql
+/// DECLARE variable_name := 42
+/// DECLARE variable_name DEFAULT 42
+/// ```
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum DeclareAssignment {
+    /// Plain expression specified.
+    Expr(Box<Expr>),
+
+    /// Expression assigned via the `DEFAULT` keyword
+    Default(Box<Expr>),
+
+    /// Expression assigned via the `:=` syntax
+    ///
+    /// Example:
+    /// ```sql
+    /// DECLARE variable_name := 42;
+    /// ```
+    DuckAssignment(Box<Expr>),
+
+    /// Expression via the `FOR` keyword
+    ///
+    /// Example:
+    /// ```sql
+    /// DECLARE c1 CURSOR FOR res
+    /// ```
+    For(Box<Expr>),
+
+    /// Expression via the `=` syntax.
+    ///
+    /// Example:
+    /// ```sql
+    /// DECLARE @variable AS INT = 100
+    /// ```
+    MsSqlAssignment(Box<Expr>),
+}
+
+impl fmt::Display for DeclareAssignment {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            DeclareAssignment::Expr(expr) => {
+                write!(f, "{expr}")
+            }
+            DeclareAssignment::Default(expr) => {
+                write!(f, "DEFAULT {expr}")
+            }
+            DeclareAssignment::DuckAssignment(expr) => {
+                write!(f, ":= {expr}")
+            }
+            DeclareAssignment::MsSqlAssignment(expr) => {
+                write!(f, "= {expr}")
+            }
+            DeclareAssignment::For(expr) => {
+                write!(f, "FOR {expr}")
+            }
+        }
+    }
+}
+
+/// Represents the type of a `DECLARE` statement.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum DeclareType {
-    /// Cursor variable type. e.g. [Snowflake] [Postgres]
+    /// Cursor variable type. e.g. [Snowflake] [PostgreSQL] [MsSql]
     ///
     /// [Snowflake]: https://docs.snowflake.com/en/developer-guide/snowflake-scripting/cursors#declaring-a-cursor
-    /// [Postgres]: https://www.postgresql.org/docs/current/plpgsql-cursors.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/plpgsql-cursors.html
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql
     Cursor,
 
     /// Result set variable type. [Snowflake]
@@ -2041,7 +2648,7 @@ impl fmt::Display for DeclareType {
 }
 
 /// A `DECLARE` statement.
-/// [Postgres] [Snowflake] [BigQuery]
+/// [PostgreSQL] [Snowflake] [BigQuery]
 ///
 /// Examples:
 /// ```sql
@@ -2049,7 +2656,7 @@ impl fmt::Display for DeclareType {
 /// DECLARE liahona CURSOR FOR SELECT * FROM films;
 /// ```
 ///
-/// [Postgres]: https://www.postgresql.org/docs/current/sql-declare.html
+/// [PostgreSQL]: https://www.postgresql.org/docs/current/sql-declare.html
 /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/snowflake-scripting/declare
 /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -2171,6 +2778,18 @@ pub enum CreateTableOptions {
     ///
     /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#table_option_list>
     Options(Vec<SqlOption>),
+
+    /// Plain options, options which are not part on any declerative statement e.g. WITH/OPTIONS/...
+    /// <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+    Plain(Vec<SqlOption>),
+
+    TableProperties(Vec<SqlOption>),
+}
+
+impl Default for CreateTableOptions {
+    fn default() -> Self {
+        Self::None
+    }
 }
 
 impl fmt::Display for CreateTableOptions {
@@ -2182,6 +2801,12 @@ impl fmt::Display for CreateTableOptions {
             CreateTableOptions::Options(options) => {
                 write!(f, "OPTIONS({})", display_comma_separated(options))
             }
+            CreateTableOptions::TableProperties(options) => {
+                write!(f, "TBLPROPERTIES ({})", display_comma_separated(options))
+            }
+            CreateTableOptions::Plain(options) => {
+                write!(f, "{}", display_separated(options, " "))
+            }
             CreateTableOptions::None => Ok(()),
         }
     }
@@ -2229,20 +2854,216 @@ pub enum CreatePolicyType {
     Restrictive,
 }
 
-/// Policy command for a `CREATE POLICY` statement.
-/// ```sql
-/// FOR [ALL | SELECT | INSERT | UPDATE | DELETE]
-/// ```
-/// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createpolicy.html)
+/// Policy command for a `CREATE POLICY` statement.
+/// ```sql
+/// FOR [ALL | SELECT | INSERT | UPDATE | DELETE]
+/// ```
+/// [PostgreSQL](https://www.postgresql.org/docs/current/sql-createpolicy.html)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum CreatePolicyCommand {
+    All,
+    Select,
+    Insert,
+    Update,
+    Delete,
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum Set {
+    /// SQL Standard-style
+    /// SET a = 1;
+    SingleAssignment {
+        scope: Option<ContextModifier>,
+        hivevar: bool,
+        variable: ObjectName,
+        values: Vec<Expr>,
+    },
+    /// Snowflake-style
+    /// SET (a, b, ..) = (1, 2, ..);
+    ParenthesizedAssignments {
+        variables: Vec<ObjectName>,
+        values: Vec<Expr>,
+    },
+    /// MySQL-style
+    /// SET a = 1, b = 2, ..;
+    MultipleAssignments { assignments: Vec<SetAssignment> },
+    /// MS-SQL session
+    ///
+    /// See <https://learn.microsoft.com/en-us/sql/t-sql/statements/set-statements-transact-sql>
+    SetSessionParam(SetSessionParamKind),
+    /// ```sql
+    /// SET [ SESSION | LOCAL ] ROLE role_name
+    /// ```
+    ///
+    /// Sets session state. Examples: [ANSI][1], [Postgresql][2], [MySQL][3], and [Oracle][4]
+    ///
+    /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#set-role-statement
+    /// [2]: https://www.postgresql.org/docs/14/sql-set-role.html
+    /// [3]: https://dev.mysql.com/doc/refman/8.0/en/set-role.html
+    /// [4]: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10004.htm
+    SetRole {
+        /// Non-ANSI optional identifier to inform if the role is defined inside the current session (`SESSION`) or transaction (`LOCAL`).
+        context_modifier: Option<ContextModifier>,
+        /// Role name. If NONE is specified, then the current role name is removed.
+        role_name: Option<Ident>,
+    },
+    /// ```sql
+    /// SET TIME ZONE <value>
+    /// ```
+    ///
+    /// Note: this is a PostgreSQL-specific statements
+    /// `SET TIME ZONE <value>` is an alias for `SET timezone TO <value>` in PostgreSQL
+    /// However, we allow it for all dialects.
+    SetTimeZone { local: bool, value: Expr },
+    /// ```sql
+    /// SET NAMES 'charset_name' [COLLATE 'collation_name']
+    /// ```
+    SetNames {
+        charset_name: Ident,
+        collation_name: Option<String>,
+    },
+    /// ```sql
+    /// SET NAMES DEFAULT
+    /// ```
+    ///
+    /// Note: this is a MySQL-specific statement.
+    SetNamesDefault {},
+    /// ```sql
+    /// SET TRANSACTION ...
+    /// ```
+    SetTransaction {
+        modes: Vec<TransactionMode>,
+        snapshot: Option<Value>,
+        session: bool,
+    },
+}
+
+impl Display for Set {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            Self::ParenthesizedAssignments { variables, values } => write!(
+                f,
+                "SET ({}) = ({})",
+                display_comma_separated(variables),
+                display_comma_separated(values)
+            ),
+            Self::MultipleAssignments { assignments } => {
+                write!(f, "SET {}", display_comma_separated(assignments))
+            }
+            Self::SetRole {
+                context_modifier,
+                role_name,
+            } => {
+                let role_name = role_name.clone().unwrap_or_else(|| Ident::new("NONE"));
+                write!(
+                    f,
+                    "SET {modifier}ROLE {role_name}",
+                    modifier = context_modifier.map(|m| format!("{m}")).unwrap_or_default()
+                )
+            }
+            Self::SetSessionParam(kind) => write!(f, "SET {kind}"),
+            Self::SetTransaction {
+                modes,
+                snapshot,
+                session,
+            } => {
+                if *session {
+                    write!(f, "SET SESSION CHARACTERISTICS AS TRANSACTION")?;
+                } else {
+                    write!(f, "SET TRANSACTION")?;
+                }
+                if !modes.is_empty() {
+                    write!(f, " {}", display_comma_separated(modes))?;
+                }
+                if let Some(snapshot_id) = snapshot {
+                    write!(f, " SNAPSHOT {snapshot_id}")?;
+                }
+                Ok(())
+            }
+            Self::SetTimeZone { local, value } => {
+                f.write_str("SET ")?;
+                if *local {
+                    f.write_str("LOCAL ")?;
+                }
+                write!(f, "TIME ZONE {value}")
+            }
+            Self::SetNames {
+                charset_name,
+                collation_name,
+            } => {
+                write!(f, "SET NAMES {charset_name}")?;
+
+                if let Some(collation) = collation_name {
+                    f.write_str(" COLLATE ")?;
+                    f.write_str(collation)?;
+                };
+
+                Ok(())
+            }
+            Self::SetNamesDefault {} => {
+                f.write_str("SET NAMES DEFAULT")?;
+
+                Ok(())
+            }
+            Set::SingleAssignment {
+                scope,
+                hivevar,
+                variable,
+                values,
+            } => {
+                write!(
+                    f,
+                    "SET {}{}{} = {}",
+                    scope.map(|s| format!("{s}")).unwrap_or_default(),
+                    if *hivevar { "HIVEVAR:" } else { "" },
+                    variable,
+                    display_comma_separated(values)
+                )
+            }
+        }
+    }
+}
+
+/// Convert a `Set` into a `Statement`.
+/// Convenience function, instead of writing `Statement::Set(Set::Set...{...})`
+impl From<Set> for Statement {
+    fn from(set: Set) -> Self {
+        Statement::Set(set)
+    }
+}
+
+/// A representation of a `WHEN` arm with all the identifiers catched and the statements to execute
+/// for the arm.
+///
+/// Snowflake: <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/exception>
+/// BigQuery: <https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#beginexceptionend>
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub enum CreatePolicyCommand {
-    All,
-    Select,
-    Insert,
-    Update,
-    Delete,
+pub struct ExceptionWhen {
+    pub idents: Vec<Ident>,
+    pub statements: Vec<Statement>,
+}
+
+impl Display for ExceptionWhen {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "WHEN {idents} THEN",
+            idents = display_separated(&self.idents, " OR ")
+        )?;
+
+        if !self.statements.is_empty() {
+            write!(f, " ")?;
+            format_statement_list(f, &self.statements)?;
+        }
+
+        Ok(())
+    }
 }
 
 /// A top-level statement (SELECT, INSERT, CREATE, etc.)
@@ -2268,7 +3089,9 @@ pub enum Statement {
         cache_metadata: bool,
         noscan: bool,
         compute_statistics: bool,
+        has_table_keyword: bool,
     },
+    Set(Set),
     /// ```sql
     /// TRUNCATE
     /// ```
@@ -2279,14 +3102,11 @@ pub enum Statement {
         /// TABLE - optional keyword;
         table: bool,
         /// Postgres-specific option
-        /// [ TRUNCATE TABLE ONLY ]
-        only: bool,
-        /// Postgres-specific option
         /// [ RESTART IDENTITY | CONTINUE IDENTITY ]
         identity: Option<TruncateIdentityOption>,
         /// Postgres-specific option
         /// [ CASCADE | RESTRICT ]
-        cascade: Option<TruncateCascadeOption>,
+        cascade: Option<CascadeOption>,
         /// ClickHouse-specific option
         /// [ ON CLUSTER cluster_name ]
         ///
@@ -2333,6 +3153,14 @@ pub enum Statement {
         file_format: Option<FileFormat>,
         source: Box<Query>,
     },
+    /// A `CASE` statement.
+    Case(CaseStatement),
+    /// An `IF` statement.
+    If(IfStatement),
+    /// A `WHILE` statement.
+    While(WhileStatement),
+    /// A `RAISE` statement.
+    Raise(RaiseStatement),
     /// ```sql
     /// CALL <function>
     /// ```
@@ -2355,26 +3183,38 @@ pub enum Statement {
         values: Vec<Option<String>>,
     },
     /// ```sql
-    /// COPY INTO
+    /// COPY INTO <table> | <location>
     /// ```
-    /// See <https://docs.snowflake.com/en/sql-reference/sql/copy-into-table>
+    /// See:
+    /// <https://docs.snowflake.com/en/sql-reference/sql/copy-into-table>
+    /// <https://docs.snowflake.com/en/sql-reference/sql/copy-into-location>
+    ///
     /// Copy Into syntax available for Snowflake is different than the one implemented in
     /// Postgres. Although they share common prefix, it is reasonable to implement them
     /// in different enums. This can be refactored later once custom dialects
     /// are allowed to have custom Statements.
     CopyIntoSnowflake {
+        kind: CopyIntoSnowflakeKind,
         into: ObjectName,
-        from_stage: ObjectName,
-        from_stage_alias: Option<Ident>,
+        into_columns: Option<Vec<Ident>>,
+        from_obj: Option<ObjectName>,
+        from_obj_alias: Option<Ident>,
         stage_params: StageParamsObject,
-        from_transformations: Option<Vec<StageLoadSelectItem>>,
+        from_transformations: Option<Vec<StageLoadSelectItemKind>>,
+        from_query: Option<Box<Query>>,
         files: Option<Vec<String>>,
         pattern: Option<String>,
-        file_format: DataLoadingOptions,
-        copy_options: DataLoadingOptions,
+        file_format: KeyValueOptions,
+        copy_options: KeyValueOptions,
         validation_mode: Option<String>,
+        partition: Option<Box<Expr>>,
     },
     /// ```sql
+    /// OPEN cursor_name
+    /// ```
+    /// Opens a cursor.
+    Open(OpenStatement),
+    /// ```sql
     /// CLOSE
     /// ```
     /// Closes the portal underlying an open cursor.
@@ -2391,7 +3231,7 @@ pub enum Statement {
         /// Column assignments
         assignments: Vec<Assignment>,
         /// Table which provide value to be set
-        from: Option<TableWithJoins>,
+        from: Option<UpdateTableFromKind>,
         /// WHERE
         selection: Option<Expr>,
         /// RETURNING
@@ -2407,10 +3247,25 @@ pub enum Statement {
     /// CREATE VIEW
     /// ```
     CreateView {
+        /// True if this is a `CREATE OR ALTER VIEW` statement
+        ///
+        /// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql)
+        or_alter: bool,
         or_replace: bool,
         materialized: bool,
         /// View name
         name: ObjectName,
+        /// If `if_not_exists` is true, this flag is set to true if the view name comes before the `IF NOT EXISTS` clause.
+        /// Example:
+        /// ```sql
+        /// CREATE VIEW myview IF NOT EXISTS AS SELECT 1`
+        ///  ```
+        /// Otherwise, the flag is set to false if the view name comes after the clause
+        /// Example:
+        /// ```sql
+        /// CREATE VIEW IF NOT EXISTS myview AS SELECT 1`
+        ///  ```
+        name_before_not_exists: bool,
         columns: Vec<ViewColumnDef>,
         query: Box<Query>,
         options: CreateTableOptions,
@@ -2427,6 +3282,8 @@ pub enum Statement {
         /// if not None, has Clickhouse `TO` clause, specify the table into which to insert results
         /// <https://clickhouse.com/docs/en/sql-reference/statements/create/view#materialized-view>
         to: Option<ObjectName>,
+        /// MySQL: Optional parameters for the view algorithm, definer, and security context
+        params: Option<CreateViewParams>,
     },
     /// ```sql
     /// CREATE TABLE
@@ -2450,7 +3307,7 @@ pub enum Statement {
     /// ```sql
     /// CREATE ROLE
     /// ```
-    /// See [postgres](https://www.postgresql.org/docs/current/sql-createrole.html)
+    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createrole.html)
     CreateRole {
         names: Vec<ObjectName>,
         if_not_exists: bool,
@@ -2476,7 +3333,7 @@ pub enum Statement {
     /// ```sql
     /// CREATE SECRET
     /// ```
-    /// See [duckdb](https://duckdb.org/docs/sql/statements/create_secret.html)
+    /// See [DuckDB](https://duckdb.org/docs/sql/statements/create_secret.html)
     CreateSecret {
         or_replace: bool,
         temporary: Option<bool>,
@@ -2486,6 +3343,8 @@ pub enum Statement {
         secret_type: Ident,
         options: Vec<SecretOption>,
     },
+    /// A `CREATE SERVER` statement.
+    CreateServer(CreateServerStatement),
     /// ```sql
     /// CREATE POLICY
     /// ```
@@ -2501,6 +3360,11 @@ pub enum Statement {
         with_check: Option<Expr>,
     },
     /// ```sql
+    /// CREATE CONNECTOR
+    /// ```
+    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
+    CreateConnector(CreateConnector),
+    /// ```sql
     /// ALTER TABLE
     /// ```
     AlterTable {
@@ -2515,6 +3379,9 @@ pub enum Statement {
         /// For example: `ALTER TABLE table_name ON CLUSTER cluster_name ADD COLUMN c UInt32`
         /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/alter/update)
         on_cluster: Option<Ident>,
+        /// Snowflake "ICEBERG" clause for Iceberg tables
+        /// <https://docs.snowflake.com/en/sql-reference/sql/alter-iceberg-table>
+        iceberg: bool,
     },
     /// ```sql
     /// ALTER INDEX
@@ -2535,6 +3402,11 @@ pub enum Statement {
         with_options: Vec<SqlOption>,
     },
     /// ```sql
+    /// ALTER TYPE
+    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-altertype.html)
+    /// ```
+    AlterType(AlterType),
+    /// ```sql
     /// ALTER ROLE
     /// ```
     AlterRole {
@@ -2552,6 +3424,31 @@ pub enum Statement {
         operation: AlterPolicyOperation,
     },
     /// ```sql
+    /// ALTER CONNECTOR connector_name SET DCPROPERTIES(property_name=property_value, ...);
+    /// or
+    /// ALTER CONNECTOR connector_name SET URL new_url;
+    /// or
+    /// ALTER CONNECTOR connector_name SET OWNER [USER|ROLE] user_or_role;
+    /// ```
+    /// (Hive-specific)
+    AlterConnector {
+        name: Ident,
+        properties: Option<Vec<SqlOption>>,
+        url: Option<String>,
+        owner: Option<ddl::AlterConnectorOwner>,
+    },
+    /// ```sql
+    /// ALTER SESSION SET sessionParam
+    /// ALTER SESSION UNSET <param_name> [ , <param_name> , ... ]
+    /// ```
+    /// See <https://docs.snowflake.com/en/sql-reference/sql/alter-session>
+    AlterSession {
+        /// true is to set for the session parameters, false is to unset
+        set: bool,
+        /// The session parameters to set or unset
+        session_params: KeyValueOptions,
+    },
+    /// ```sql
     /// ATTACH DATABASE 'path/to/file' AS alias
     /// ```
     /// (SQLite-specific)
@@ -2609,6 +3506,9 @@ pub enum Statement {
         purge: bool,
         /// MySQL-specific "TEMPORARY" keyword
         temporary: bool,
+        /// MySQL-specific drop index syntax, which requires table specification
+        /// See <https://dev.mysql.com/doc/refman/8.4/en/drop-index.html>
+        table: Option<ObjectName>,
     },
     /// ```sql
     /// DROP FUNCTION
@@ -2618,9 +3518,17 @@ pub enum Statement {
         /// One or more function to drop
         func_desc: Vec<FunctionDesc>,
         /// `CASCADE` or `RESTRICT`
-        option: Option<ReferentialAction>,
+        drop_behavior: Option<DropBehavior>,
     },
     /// ```sql
+    /// DROP DOMAIN
+    /// ```
+    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-dropdomain.html)
+    ///
+    /// DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
+    ///
+    DropDomain(DropDomain),
+    /// ```sql
     /// DROP PROCEDURE
     /// ```
     DropProcedure {
@@ -2628,7 +3536,7 @@ pub enum Statement {
         /// One or more function to drop
         proc_desc: Vec<FunctionDesc>,
         /// `CASCADE` or `RESTRICT`
-        option: Option<ReferentialAction>,
+        drop_behavior: Option<DropBehavior>,
     },
     /// ```sql
     /// DROP SECRET
@@ -2647,7 +3555,15 @@ pub enum Statement {
         if_exists: bool,
         name: Ident,
         table_name: ObjectName,
-        option: Option<ReferentialAction>,
+        drop_behavior: Option<DropBehavior>,
+    },
+    /// ```sql
+    /// DROP CONNECTOR
+    /// ```
+    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
+    DropConnector {
+        if_exists: bool,
+        name: Ident,
     },
     /// ```sql
     /// DECLARE
@@ -2656,7 +3572,9 @@ pub enum Statement {
     ///
     /// Note: this is a PostgreSQL-specific statement,
     /// but may also compatible with other SQL.
-    Declare { stmts: Vec<Declare> },
+    Declare {
+        stmts: Vec<Declare>,
+    },
     /// ```sql
     /// CREATE EXTENSION [ IF NOT EXISTS ] extension_name
     ///     [ WITH ] [ SCHEMA schema_name ]
@@ -2673,6 +3591,18 @@ pub enum Statement {
         version: Option<Ident>,
     },
     /// ```sql
+    /// DROP EXTENSION [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
+    ///
+    /// Note: this is a PostgreSQL-specific statement.
+    /// https://www.postgresql.org/docs/current/sql-dropextension.html
+    /// ```
+    DropExtension {
+        names: Vec<Ident>,
+        if_exists: bool,
+        /// `CASCADE` or `RESTRICT`
+        cascade_or_restrict: Option<ReferentialAction>,
+    },
+    /// ```sql
     /// FETCH
     /// ```
     /// Retrieve rows from a query using a cursor
@@ -2683,6 +3613,7 @@ pub enum Statement {
         /// Cursor name
         name: Ident,
         direction: FetchDirection,
+        position: FetchPosition,
         /// Optional, It's possible to fetch rows form cursor to the table
         into: Option<ObjectName>,
     },
@@ -2706,69 +3637,23 @@ pub enum Statement {
     ///
     /// Note: this is a PostgreSQL-specific statement,
     /// but may also compatible with other SQL.
-    Discard { object_type: DiscardObject },
-    /// ```sql
-    /// SET [ SESSION | LOCAL ] ROLE role_name
-    /// ```
-    ///
-    /// Sets session state. Examples: [ANSI][1], [Postgresql][2], [MySQL][3], and [Oracle][4]
-    ///
-    /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#set-role-statement
-    /// [2]: https://www.postgresql.org/docs/14/sql-set-role.html
-    /// [3]: https://dev.mysql.com/doc/refman/8.0/en/set-role.html
-    /// [4]: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10004.htm
-    SetRole {
-        /// Non-ANSI optional identifier to inform if the role is defined inside the current session (`SESSION`) or transaction (`LOCAL`).
-        context_modifier: ContextModifier,
-        /// Role name. If NONE is specified, then the current role name is removed.
-        role_name: Option<Ident>,
-    },
-    /// ```sql
-    /// SET <variable> = expression;
-    /// SET (variable[, ...]) = (expression[, ...]);
-    /// ```
-    ///
-    /// Note: this is not a standard SQL statement, but it is supported by at
-    /// least MySQL and PostgreSQL. Not all MySQL-specific syntactic forms are
-    /// supported yet.
-    SetVariable {
-        local: bool,
-        hivevar: bool,
-        variables: OneOrManyWithParens<ObjectName>,
-        value: Vec<Expr>,
-    },
-    /// ```sql
-    /// SET TIME ZONE <value>
-    /// ```
-    ///
-    /// Note: this is a PostgreSQL-specific statements
-    /// `SET TIME ZONE <value>` is an alias for `SET timezone TO <value>` in PostgreSQL
-    SetTimeZone { local: bool, value: Expr },
-    /// ```sql
-    /// SET NAMES 'charset_name' [COLLATE 'collation_name']
-    /// ```
-    ///
-    /// Note: this is a MySQL-specific statement.
-    SetNames {
-        charset_name: String,
-        collation_name: Option<String>,
+    Discard {
+        object_type: DiscardObject,
     },
-    /// ```sql
-    /// SET NAMES DEFAULT
-    /// ```
-    ///
-    /// Note: this is a MySQL-specific statement.
-    SetNamesDefault {},
     /// `SHOW FUNCTIONS`
     ///
     /// Note: this is a Presto-specific statement.
-    ShowFunctions { filter: Option<ShowStatementFilter> },
+    ShowFunctions {
+        filter: Option<ShowStatementFilter>,
+    },
     /// ```sql
     /// SHOW <variable>
     /// ```
     ///
     /// Note: this is a PostgreSQL-specific statement.
-    ShowVariable { variable: Vec<Ident> },
+    ShowVariable {
+        variable: Vec<Ident>,
+    },
     /// ```sql
     /// SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr]
     /// ```
@@ -2822,6 +3707,18 @@ pub enum Statement {
         history: bool,
         show_options: ShowStatementOptions,
     },
+    // ```sql
+    // SHOW {CHARACTER SET | CHARSET}
+    // ```
+    // [MySQL]:
+    // <https://dev.mysql.com/doc/refman/8.4/en/show.html#:~:text=SHOW%20%7BCHARACTER%20SET%20%7C%20CHARSET%7D%20%5Blike_or_where%5D>
+    ShowCharset(ShowCharset),
+    /// ```sql
+    /// SHOW OBJECTS LIKE 'line%' IN mydb.public
+    /// ```
+    /// Snowflake-specific statement
+    /// <https://docs.snowflake.com/en/sql-reference/sql/show-objects>
+    ShowObjects(ShowObjects),
     /// ```sql
     /// SHOW TABLES
     /// ```
@@ -2846,7 +3743,9 @@ pub enum Statement {
     /// ```
     ///
     /// Note: this is a MySQL-specific statement.
-    ShowCollation { filter: Option<ShowStatementFilter> },
+    ShowCollation {
+        filter: Option<ShowStatementFilter>,
+    },
     /// ```sql
     /// `USE ...`
     /// ```
@@ -2863,16 +3762,33 @@ pub enum Statement {
     StartTransaction {
         modes: Vec<TransactionMode>,
         begin: bool,
-        /// Only for SQLite
+        transaction: Option<BeginTransactionKind>,
         modifier: Option<TransactionModifier>,
-    },
-    /// ```sql
-    /// SET TRANSACTION ...
-    /// ```
-    SetTransaction {
-        modes: Vec<TransactionMode>,
-        snapshot: Option<Value>,
-        session: bool,
+        /// List of statements belonging to the `BEGIN` block.
+        /// Example:
+        /// ```sql
+        /// BEGIN
+        ///     SELECT 1;
+        ///     SELECT 2;
+        /// END;
+        /// ```
+        statements: Vec<Statement>,
+        /// Exception handling with exception clauses.
+        /// Example:
+        /// ```sql
+        /// EXCEPTION
+        ///     WHEN EXCEPTION_1 THEN
+        ///         SELECT 2;
+        ///     WHEN EXCEPTION_2 OR EXCEPTION_3 THEN
+        ///         SELECT 3;
+        ///     WHEN OTHER THEN
+        ///         SELECT 4;
+        /// ```
+        /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#beginexceptionend>
+        /// <https://docs.snowflake.com/en/sql-reference/snowflake-scripting/exception>
+        exception: Option<Vec<ExceptionWhen>>,
+        /// TRUE if the statement has an `END` keyword.
+        has_end_keyword: bool,
     },
     /// ```sql
     /// COMMENT ON ...
@@ -2890,7 +3806,17 @@ pub enum Statement {
     /// ```sql
     /// COMMIT [ TRANSACTION | WORK ] [ AND [ NO ] CHAIN ]
     /// ```
-    Commit { chain: bool },
+    /// If `end` is false
+    ///
+    /// ```sql
+    /// END [ TRY | CATCH ]
+    /// ```
+    /// If `end` is true
+    Commit {
+        chain: bool,
+        end: bool,
+        modifier: Option<TransactionModifier>,
+    },
     /// ```sql
     /// ROLLBACK [ TRANSACTION | WORK ] [ AND [ NO ] CHAIN ] [ TO [ SAVEPOINT ] savepoint_name ]
     /// ```
@@ -2905,15 +3831,65 @@ pub enum Statement {
         /// `<schema name> | AUTHORIZATION <schema authorization identifier>  | <schema name>  AUTHORIZATION <schema authorization identifier>`
         schema_name: SchemaName,
         if_not_exists: bool,
+        /// Schema properties.
+        ///
+        /// ```sql
+        /// CREATE SCHEMA myschema WITH (key1='value1');
+        /// ```
+        ///
+        /// [Trino](https://trino.io/docs/current/sql/create-schema.html)
+        with: Option<Vec<SqlOption>>,
+        /// Schema options.
+        ///
+        /// ```sql
+        /// CREATE SCHEMA myschema OPTIONS(key1='value1');
+        /// ```
+        ///
+        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_schema_statement)
+        options: Option<Vec<SqlOption>>,
+        /// Default collation specification for the schema.
+        ///
+        /// ```sql
+        /// CREATE SCHEMA myschema DEFAULT COLLATE 'und:ci';
+        /// ```
+        ///
+        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_schema_statement)
+        default_collate_spec: Option<Expr>,
+        /// Clones a schema
+        ///
+        /// ```sql
+        /// CREATE SCHEMA myschema CLONE otherschema
+        /// ```
+        ///
+        /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/create-clone#databases-schemas)
+        clone: Option<ObjectName>,
     },
     /// ```sql
     /// CREATE DATABASE
     /// ```
+    /// See:
+    /// <https://docs.snowflake.com/en/sql-reference/sql/create-database>
     CreateDatabase {
         db_name: ObjectName,
         if_not_exists: bool,
         location: Option<String>,
         managed_location: Option<String>,
+        or_replace: bool,
+        transient: bool,
+        clone: Option<ObjectName>,
+        data_retention_time_in_days: Option<u64>,
+        max_data_extension_time_in_days: Option<u64>,
+        external_volume: Option<String>,
+        catalog: Option<String>,
+        replace_invalid_characters: Option<bool>,
+        default_ddl_collation: Option<String>,
+        storage_serialization_policy: Option<StorageSerializationPolicy>,
+        comment: Option<String>,
+        catalog_sync: Option<String>,
+        catalog_sync_namespace_mode: Option<CatalogSyncNamespaceMode>,
+        catalog_sync_namespace_flatten_delimiter: Option<String>,
+        with_tags: Option<Vec<Tag>>,
+        with_contacts: Option<Vec<ContactEntry>>,
     },
     /// ```sql
     /// CREATE FUNCTION
@@ -2921,66 +3897,10 @@ pub enum Statement {
     ///
     /// Supported variants:
     /// 1. [Hive](https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-Create/Drop/ReloadFunction)
-    /// 2. [Postgres](https://www.postgresql.org/docs/15/sql-createfunction.html)
+    /// 2. [PostgreSQL](https://www.postgresql.org/docs/15/sql-createfunction.html)
     /// 3. [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement)
-    CreateFunction {
-        or_replace: bool,
-        temporary: bool,
-        if_not_exists: bool,
-        name: ObjectName,
-        args: Option<Vec<OperateFunctionArg>>,
-        return_type: Option<DataType>,
-        /// The expression that defines the function.
-        ///
-        /// Examples:
-        /// ```sql
-        /// AS ((SELECT 1))
-        /// AS "console.log();"
-        /// ```
-        function_body: Option<CreateFunctionBody>,
-        /// Behavior attribute for the function
-        ///
-        /// IMMUTABLE | STABLE | VOLATILE
-        ///
-        /// [Postgres](https://www.postgresql.org/docs/current/sql-createfunction.html)
-        behavior: Option<FunctionBehavior>,
-        /// CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
-        ///
-        /// [Postgres](https://www.postgresql.org/docs/current/sql-createfunction.html)
-        called_on_null: Option<FunctionCalledOnNull>,
-        /// PARALLEL { UNSAFE | RESTRICTED | SAFE }
-        ///
-        /// [Postgres](https://www.postgresql.org/docs/current/sql-createfunction.html)
-        parallel: Option<FunctionParallel>,
-        /// USING ... (Hive only)
-        using: Option<CreateFunctionUsing>,
-        /// Language used in a UDF definition.
-        ///
-        /// Example:
-        /// ```sql
-        /// CREATE FUNCTION foo() LANGUAGE js AS "console.log();"
-        /// ```
-        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_a_javascript_udf)
-        language: Option<Ident>,
-        /// Determinism keyword used for non-sql UDF definitions.
-        ///
-        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11)
-        determinism_specifier: Option<FunctionDeterminismSpecifier>,
-        /// List of options for creating the function.
-        ///
-        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11)
-        options: Option<Vec<SqlOption>>,
-        /// Connection resource for a remote function.
-        ///
-        /// Example:
-        /// ```sql
-        /// CREATE FUNCTION foo()
-        /// RETURNS FLOAT64
-        /// REMOTE WITH CONNECTION us.myconnection
-        /// ```
-        /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_a_remote_function)
-        remote_connection: Option<ObjectName>,
-    },
+    /// 4. [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql)
+    CreateFunction(CreateFunction),
     /// CREATE TRIGGER
     ///
     /// Examples:
@@ -2993,7 +3913,12 @@ pub enum Statement {
     /// ```
     ///
     /// Postgres: <https://www.postgresql.org/docs/current/sql-createtrigger.html>
+    /// SQL Server: <https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql>
     CreateTrigger {
+        /// True if this is a `CREATE OR ALTER TRIGGER` statement
+        ///
+        /// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver16#arguments)
+        or_alter: bool,
         /// The `OR REPLACE` clause is used to re-create the trigger if it already exists.
         ///
         /// Example:
@@ -3054,7 +3979,9 @@ pub enum Statement {
         ///  Triggering conditions
         condition: Option<Expr>,
         /// Execute logic block
-        exec_body: TriggerExecBody,
+        exec_body: Option<TriggerExecBody>,
+        /// For SQL dialects with statement(s) for a body
+        statements: Option<ConditionalStatements>,
         /// The characteristic of the trigger, which include whether the trigger is `DEFERRABLE`, `INITIALLY DEFERRED`, or `INITIALLY IMMEDIATE`,
         characteristics: Option<ConstraintCharacteristics>,
     },
@@ -3067,7 +3994,7 @@ pub enum Statement {
     DropTrigger {
         if_exists: bool,
         trigger_name: ObjectName,
-        table_name: ObjectName,
+        table_name: Option<ObjectName>,
         /// `CASCADE` or `RESTRICT`
         option: Option<ReferentialAction>,
     },
@@ -3078,7 +4005,8 @@ pub enum Statement {
         or_alter: bool,
         name: ObjectName,
         params: Option<Vec<ProcedureParam>>,
-        body: Vec<Statement>,
+        language: Option<Ident>,
+        body: ConditionalStatements,
     },
     /// ```sql
     /// CREATE MACRO
@@ -3103,9 +4031,9 @@ pub enum Statement {
         if_not_exists: bool,
         name: ObjectName,
         stage_params: StageParamsObject,
-        directory_table_params: DataLoadingOptions,
-        file_format: DataLoadingOptions,
-        copy_options: DataLoadingOptions,
+        directory_table_params: KeyValueOptions,
+        file_format: KeyValueOptions,
+        copy_options: KeyValueOptions,
         comment: Option<String>,
     },
     /// ```sql
@@ -3120,40 +4048,58 @@ pub enum Statement {
     /// ```
     Grant {
         privileges: Privileges,
-        objects: GrantObjects,
-        grantees: Vec<Ident>,
+        objects: Option<GrantObjects>,
+        grantees: Vec<Grantee>,
         with_grant_option: bool,
+        as_grantor: Option<Ident>,
         granted_by: Option<Ident>,
+        current_grants: Option<CurrentGrantsKind>,
     },
     /// ```sql
+    /// DENY privileges ON object TO grantees
+    /// ```
+    Deny(DenyStatement),
+    /// ```sql
     /// REVOKE privileges ON objects FROM grantees
     /// ```
     Revoke {
         privileges: Privileges,
-        objects: GrantObjects,
-        grantees: Vec<Ident>,
+        objects: Option<GrantObjects>,
+        grantees: Vec<Grantee>,
         granted_by: Option<Ident>,
-        cascade: bool,
+        cascade: Option<CascadeOption>,
     },
     /// ```sql
     /// DEALLOCATE [ PREPARE ] { name | ALL }
     /// ```
     ///
     /// Note: this is a PostgreSQL-specific statement.
-    Deallocate { name: Ident, prepare: bool },
+    Deallocate {
+        name: Ident,
+        prepare: bool,
+    },
     /// ```sql
-    /// EXECUTE name [ ( parameter [, ...] ) ] [USING <expr>]
+    /// An `EXECUTE` statement
     /// ```
     ///
-    /// Note: this statement is supported by Postgres and MSSQL, with slight differences in syntax.
-    ///
     /// Postgres: <https://www.postgresql.org/docs/current/sql-execute.html>
     /// MSSQL: <https://learn.microsoft.com/en-us/sql/relational-databases/stored-procedures/execute-a-stored-procedure>
+    /// BigQuery: <https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#execute_immediate>
+    /// Snowflake: <https://docs.snowflake.com/en/sql-reference/sql/execute-immediate>
     Execute {
-        name: ObjectName,
+        name: Option<ObjectName>,
         parameters: Vec<Expr>,
         has_parentheses: bool,
-        using: Vec<Expr>,
+        /// Is this an `EXECUTE IMMEDIATE`
+        immediate: bool,
+        into: Vec<Ident>,
+        using: Vec<ExprWithAlias>,
+        /// Whether the last parameter is the return value of the procedure
+        /// MSSQL: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver17#output>
+        output: bool,
+        /// Whether to invoke the procedure with the default parameter values
+        /// MSSQL: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/execute-transact-sql?view=sql-server-ver17#default>
+        default: bool,
     },
     /// ```sql
     /// PREPARE name [ ( data_type [, ...] ) ] AS statement
@@ -3209,10 +4155,13 @@ pub enum Statement {
         ///
         /// [SQLite](https://sqlite.org/lang_explain.html)
         query_plan: bool,
+        /// `EXPLAIN ESTIMATE`
+        /// [Clickhouse](https://clickhouse.com/docs/en/sql-reference/statements/explain#explain-estimate)
+        estimate: bool,
         /// A SQL query that specifies what to explain
         statement: Box<Statement>,
         /// Optional output format of explain
-        format: Option<AnalyzeFormat>,
+        format: Option<AnalyzeFormatKind>,
         /// Postgres style utility options, `(analyze, verbose true)`
         options: Option<Vec<UtilityOption>>,
     },
@@ -3220,11 +4169,15 @@ pub enum Statement {
     /// SAVEPOINT
     /// ```
     /// Define a new savepoint within the current transaction
-    Savepoint { name: Ident },
+    Savepoint {
+        name: Ident,
+    },
     /// ```sql
     /// RELEASE [ SAVEPOINT ] savepoint_name
     /// ```
-    ReleaseSavepoint { name: Ident },
+    ReleaseSavepoint {
+        name: Ident,
+    },
     /// A `MERGE` statement.
     ///
     /// ```sql
@@ -3232,6 +4185,7 @@ pub enum Statement {
     /// ```
     /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/merge)
     /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement)
+    /// [MSSQL](https://learn.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver16)
     Merge {
         /// optional INTO keyword
         into: bool,
@@ -3243,6 +4197,8 @@ pub enum Statement {
         on: Box<Expr>,
         /// Specifies the actions to perform when values match or do not match.
         clauses: Vec<MergeClause>,
+        // Specifies the output to save changes in MSSQL
+        output: Option<OutputClause>,
     },
     /// ```sql
     /// CACHE [ FLAG ] TABLE <table_name> [ OPTIONS('K1' = 'V1', 'K2' = V2) ] [ AS ] [ <query> ]
@@ -3285,6 +4241,8 @@ pub enum Statement {
         sequence_options: Vec<SequenceOptions>,
         owned_by: Option<ObjectName>,
     },
+    /// A `CREATE DOMAIN` statement.
+    CreateDomain(CreateDomain),
     /// ```sql
     /// CREATE TYPE <name>
     /// ```
@@ -3304,7 +4262,9 @@ pub enum Statement {
     /// LOCK TABLES <table_name> [READ [LOCAL] | [LOW_PRIORITY] WRITE]
     /// ```
     /// Note: this is a MySQL-specific statement. See <https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html>
-    LockTables { tables: Vec<LockTable> },
+    LockTables {
+        tables: Vec<LockTable>,
+    },
     /// ```sql
     /// UNLOCK TABLES
     /// ```
@@ -3338,18 +4298,22 @@ pub enum Statement {
     /// listen for a notification channel
     ///
     /// See Postgres <https://www.postgresql.org/docs/current/sql-listen.html>
-    LISTEN { channel: Ident },
+    LISTEN {
+        channel: Ident,
+    },
     /// ```sql
     /// UNLISTEN
     /// ```
     /// stop listening for a notification
     ///
     /// See Postgres <https://www.postgresql.org/docs/current/sql-unlisten.html>
-    UNLISTEN { channel: Ident },
+    UNLISTEN {
+        channel: Ident,
+    },
     /// ```sql
     /// NOTIFY channel [ , payload ]
     /// ```
-    /// send a notification event together with an optional “payload” string to channel
+    /// send a notification event together with an optional "payload" string to channel
     ///
     /// See Postgres <https://www.postgresql.org/docs/current/sql-notify.html>
     NOTIFY {
@@ -3372,9 +4336,124 @@ pub enum Statement {
         partitioned: Option<Vec<Expr>>,
         table_format: Option<HiveLoadDataFormat>,
     },
+    /// ```sql
+    /// Rename TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2] ...
+    /// ```
+    /// Renames one or more tables
+    ///
+    /// See Mysql <https://dev.mysql.com/doc/refman/9.1/en/rename-table.html>
+    RenameTable(Vec<RenameTable>),
+    /// Snowflake `LIST`
+    /// See: <https://docs.snowflake.com/en/sql-reference/sql/list>
+    List(FileStagingCommand),
+    /// Snowflake `REMOVE`
+    /// See: <https://docs.snowflake.com/en/sql-reference/sql/remove>
+    Remove(FileStagingCommand),
+    /// RaiseError (MSSQL)
+    /// RAISERROR ( { msg_id | msg_str | @local_variable }
+    /// { , severity , state }
+    /// [ , argument [ , ...n ] ] )
+    /// [ WITH option [ , ...n ] ]
+    /// See <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql?view=sql-server-ver16>
+    RaisError {
+        message: Box<Expr>,
+        severity: Box<Expr>,
+        state: Box<Expr>,
+        arguments: Vec<Expr>,
+        options: Vec<RaisErrorOption>,
+    },
+    /// ```sql
+    /// PRINT msg_str | @local_variable | string_expr
+    /// ```
+    ///
+    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/statements/print-transact-sql>
+    Print(PrintStatement),
+    /// ```sql
+    /// RETURN [ expression ]
+    /// ```
+    ///
+    /// See [ReturnStatement]
+    Return(ReturnStatement),
+    /// Export data statement
+    ///
+    /// Example:
+    /// ```sql
+    /// EXPORT DATA OPTIONS(uri='gs://bucket/folder/*', format='PARQUET', overwrite=true) AS
+    /// SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 LIMIT 10
+    /// ```
+    /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/export-statements)
+    ExportData(ExportData),
+    /// ```sql
+    /// CREATE [OR REPLACE] USER <user> [IF NOT EXISTS]
+    /// ```
+    /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/create-user)
+    CreateUser(CreateUser),
+}
+
+/// ```sql
+/// {COPY | REVOKE} CURRENT GRANTS
+/// ```
+///
+/// - [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/grant-ownership#optional-parameters)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum CurrentGrantsKind {
+    CopyCurrentGrants,
+    RevokeCurrentGrants,
+}
+
+impl fmt::Display for CurrentGrantsKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            CurrentGrantsKind::CopyCurrentGrants => write!(f, "COPY CURRENT GRANTS"),
+            CurrentGrantsKind::RevokeCurrentGrants => write!(f, "REVOKE CURRENT GRANTS"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum RaisErrorOption {
+    Log,
+    NoWait,
+    SetError,
+}
+
+impl fmt::Display for RaisErrorOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            RaisErrorOption::Log => write!(f, "LOG"),
+            RaisErrorOption::NoWait => write!(f, "NOWAIT"),
+            RaisErrorOption::SetError => write!(f, "SETERROR"),
+        }
+    }
 }
 
 impl fmt::Display for Statement {
+    /// Formats a SQL statement with support for pretty printing.
+    ///
+    /// When using the alternate flag (`{:#}`), the statement will be formatted with proper
+    /// indentation and line breaks. For example:
+    ///
+    /// ```
+    /// # use sqlparser::dialect::GenericDialect;
+    /// # use sqlparser::parser::Parser;
+    /// let sql = "SELECT a, b FROM table_1";
+    /// let ast = Parser::parse_sql(&GenericDialect, sql).unwrap();
+    ///
+    /// // Regular formatting
+    /// assert_eq!(format!("{}", ast[0]), "SELECT a, b FROM table_1");
+    ///
+    /// // Pretty printing
+    /// assert_eq!(format!("{:#}", ast[0]),
+    /// r#"SELECT
+    ///   a,
+    ///   b
+    /// FROM
+    ///   table_1"#);
+    /// ```
     // Clippy thinks this function is too complicated, but it is painful to
     // split up without extracting structs for each `Statement` variant.
     #[allow(clippy::cognitive_complexity)]
@@ -3390,7 +4469,8 @@ impl fmt::Display for Statement {
             } => {
                 write!(f, "FLUSH")?;
                 if let Some(location) = location {
-                    write!(f, " {location}")?;
+                    f.write_str(" ")?;
+                    location.fmt(f)?;
                 }
                 write!(f, " {object_type}")?;
 
@@ -3428,7 +4508,7 @@ impl fmt::Display for Statement {
                 write!(f, "{describe_alias} ")?;
 
                 if let Some(format) = hive_format {
-                    write!(f, "{} ", format)?;
+                    write!(f, "{format} ")?;
                 }
                 if *has_table_keyword {
                     write!(f, "TABLE ")?;
@@ -3441,6 +4521,7 @@ impl fmt::Display for Statement {
                 verbose,
                 analyze,
                 query_plan,
+                estimate,
                 statement,
                 format,
                 options,
@@ -3453,13 +4534,16 @@ impl fmt::Display for Statement {
                 if *analyze {
                     write!(f, "ANALYZE ")?;
                 }
+                if *estimate {
+                    write!(f, "ESTIMATE ")?;
+                }
 
                 if *verbose {
                     write!(f, "VERBOSE ")?;
                 }
 
                 if let Some(format) = format {
-                    write!(f, "FORMAT {format} ")?;
+                    write!(f, "{format} ")?;
                 }
 
                 if let Some(options) = options {
@@ -3468,7 +4552,7 @@ impl fmt::Display for Statement {
 
                 write!(f, "{statement}")
             }
-            Statement::Query(s) => write!(f, "{s}"),
+            Statement::Query(s) => s.fmt(f),
             Statement::Declare { stmts } => {
                 write!(f, "DECLARE ")?;
                 write!(f, "{}", display_separated(stmts, "; "))
@@ -3476,11 +4560,10 @@ impl fmt::Display for Statement {
             Statement::Fetch {
                 name,
                 direction,
+                position,
                 into,
             } => {
-                write!(f, "FETCH {direction} ")?;
-
-                write!(f, "IN {name}")?;
+                write!(f, "FETCH {direction} {position} {name}")?;
 
                 if let Some(into) = into {
                     write!(f, " INTO {into}")?;
@@ -3527,17 +4610,15 @@ impl fmt::Display for Statement {
                 table_names,
                 partitions,
                 table,
-                only,
                 identity,
                 cascade,
                 on_cluster,
             } => {
                 let table = if *table { "TABLE " } else { "" };
-                let only = if *only { "ONLY " } else { "" };
 
                 write!(
                     f,
-                    "TRUNCATE {table}{only}{table_names}",
+                    "TRUNCATE {table}{table_names}",
                     table_names = display_comma_separated(table_names)
                 )?;
 
@@ -3549,8 +4630,8 @@ impl fmt::Display for Statement {
                 }
                 if let Some(cascade) = cascade {
                     match cascade {
-                        TruncateCascadeOption::Cascade => write!(f, " CASCADE")?,
-                        TruncateCascadeOption::Restrict => write!(f, " RESTRICT")?,
+                        CascadeOption::Cascade => write!(f, " CASCADE")?,
+                        CascadeOption::Restrict => write!(f, " RESTRICT")?,
                     }
                 }
 
@@ -3564,6 +4645,18 @@ impl fmt::Display for Statement {
                 }
                 Ok(())
             }
+            Statement::Case(stmt) => {
+                write!(f, "{stmt}")
+            }
+            Statement::If(stmt) => {
+                write!(f, "{stmt}")
+            }
+            Statement::While(stmt) => {
+                write!(f, "{stmt}")
+            }
+            Statement::Raise(stmt) => {
+                write!(f, "{stmt}")
+            }
             Statement::AttachDatabase {
                 schema_name,
                 database_file_name,
@@ -3614,8 +4707,13 @@ impl fmt::Display for Statement {
                 cache_metadata,
                 noscan,
                 compute_statistics,
+                has_table_keyword,
             } => {
-                write!(f, "ANALYZE TABLE {table_name}")?;
+                write!(
+                    f,
+                    "ANALYZE{}{table_name}",
+                    if *has_table_keyword { " TABLE " } else { " " }
+                )?;
                 if let Some(ref parts) = partitions {
                     if !parts.is_empty() {
                         write!(f, " PARTITION ({})", display_comma_separated(parts))?;
@@ -3639,7 +4737,7 @@ impl fmt::Display for Statement {
                 }
                 Ok(())
             }
-            Statement::Insert(insert) => write!(f, "{insert}"),
+            Statement::Insert(insert) => insert.fmt(f),
             Statement::Install {
                 extension_name: name,
             } => write!(f, "INSTALL {name}"),
@@ -3702,26 +4800,42 @@ impl fmt::Display for Statement {
                 returning,
                 or,
             } => {
-                write!(f, "UPDATE ")?;
+                f.write_str("UPDATE ")?;
                 if let Some(or) = or {
-                    write!(f, "{or} ")?;
+                    or.fmt(f)?;
+                    f.write_str(" ")?;
+                }
+                table.fmt(f)?;
+                if let Some(UpdateTableFromKind::BeforeSet(from)) = from {
+                    SpaceOrNewline.fmt(f)?;
+                    f.write_str("FROM")?;
+                    indented_list(f, from)?;
                 }
-                write!(f, "{table}")?;
                 if !assignments.is_empty() {
-                    write!(f, " SET {}", display_comma_separated(assignments))?;
+                    SpaceOrNewline.fmt(f)?;
+                    f.write_str("SET")?;
+                    indented_list(f, assignments)?;
                 }
-                if let Some(from) = from {
-                    write!(f, " FROM {from}")?;
+                if let Some(UpdateTableFromKind::AfterSet(from)) = from {
+                    SpaceOrNewline.fmt(f)?;
+                    f.write_str("FROM")?;
+                    indented_list(f, from)?;
                 }
                 if let Some(selection) = selection {
-                    write!(f, " WHERE {selection}")?;
+                    SpaceOrNewline.fmt(f)?;
+                    f.write_str("WHERE")?;
+                    SpaceOrNewline.fmt(f)?;
+                    Indent(selection).fmt(f)?;
                 }
                 if let Some(returning) = returning {
-                    write!(f, " RETURNING {}", display_comma_separated(returning))?;
+                    SpaceOrNewline.fmt(f)?;
+                    f.write_str("RETURNING")?;
+                    indented_list(f, returning)?;
                 }
                 Ok(())
             }
-            Statement::Delete(delete) => write!(f, "{delete}"),
+            Statement::Delete(delete) => delete.fmt(f),
+            Statement::Open(open) => open.fmt(f),
             Statement::Close { cursor } => {
                 write!(f, "CLOSE {cursor}")?;
 
@@ -3732,90 +4846,101 @@ impl fmt::Display for Statement {
                 if_not_exists,
                 location,
                 managed_location,
-            } => {
-                write!(f, "CREATE DATABASE")?;
-                if *if_not_exists {
-                    write!(f, " IF NOT EXISTS")?;
-                }
-                write!(f, " {db_name}")?;
-                if let Some(l) = location {
-                    write!(f, " LOCATION '{l}'")?;
-                }
-                if let Some(ml) = managed_location {
-                    write!(f, " MANAGEDLOCATION '{ml}'")?;
-                }
-                Ok(())
-            }
-            Statement::CreateFunction {
                 or_replace,
-                temporary,
-                if_not_exists,
-                name,
-                args,
-                return_type,
-                function_body,
-                language,
-                behavior,
-                called_on_null,
-                parallel,
-                using,
-                determinism_specifier,
-                options,
-                remote_connection,
+                transient,
+                clone,
+                data_retention_time_in_days,
+                max_data_extension_time_in_days,
+                external_volume,
+                catalog,
+                replace_invalid_characters,
+                default_ddl_collation,
+                storage_serialization_policy,
+                comment,
+                catalog_sync,
+                catalog_sync_namespace_mode,
+                catalog_sync_namespace_flatten_delimiter,
+                with_tags,
+                with_contacts,
             } => {
                 write!(
                     f,
-                    "CREATE {or_replace}{temp}FUNCTION {if_not_exists}{name}",
-                    temp = if *temporary { "TEMPORARY " } else { "" },
+                    "CREATE {or_replace}{transient}DATABASE {if_not_exists}{name}",
                     or_replace = if *or_replace { "OR REPLACE " } else { "" },
+                    transient = if *transient { "TRANSIENT " } else { "" },
                     if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
+                    name = db_name,
                 )?;
-                if let Some(args) = args {
-                    write!(f, "({})", display_comma_separated(args))?;
+
+                if let Some(l) = location {
+                    write!(f, " LOCATION '{l}'")?;
                 }
-                if let Some(return_type) = return_type {
-                    write!(f, " RETURNS {return_type}")?;
+                if let Some(ml) = managed_location {
+                    write!(f, " MANAGEDLOCATION '{ml}'")?;
                 }
-                if let Some(determinism_specifier) = determinism_specifier {
-                    write!(f, " {determinism_specifier}")?;
+                if let Some(clone) = clone {
+                    write!(f, " CLONE {clone}")?;
                 }
-                if let Some(language) = language {
-                    write!(f, " LANGUAGE {language}")?;
+
+                if let Some(value) = data_retention_time_in_days {
+                    write!(f, " DATA_RETENTION_TIME_IN_DAYS = {value}")?;
                 }
-                if let Some(behavior) = behavior {
-                    write!(f, " {behavior}")?;
+
+                if let Some(value) = max_data_extension_time_in_days {
+                    write!(f, " MAX_DATA_EXTENSION_TIME_IN_DAYS = {value}")?;
                 }
-                if let Some(called_on_null) = called_on_null {
-                    write!(f, " {called_on_null}")?;
+
+                if let Some(vol) = external_volume {
+                    write!(f, " EXTERNAL_VOLUME = '{vol}'")?;
                 }
-                if let Some(parallel) = parallel {
-                    write!(f, " {parallel}")?;
+
+                if let Some(cat) = catalog {
+                    write!(f, " CATALOG = '{cat}'")?;
                 }
-                if let Some(remote_connection) = remote_connection {
-                    write!(f, " REMOTE WITH CONNECTION {remote_connection}")?;
+
+                if let Some(true) = replace_invalid_characters {
+                    write!(f, " REPLACE_INVALID_CHARACTERS = TRUE")?;
+                } else if let Some(false) = replace_invalid_characters {
+                    write!(f, " REPLACE_INVALID_CHARACTERS = FALSE")?;
                 }
-                if let Some(CreateFunctionBody::AsBeforeOptions(function_body)) = function_body {
-                    write!(f, " AS {function_body}")?;
+
+                if let Some(collation) = default_ddl_collation {
+                    write!(f, " DEFAULT_DDL_COLLATION = '{collation}'")?;
                 }
-                if let Some(CreateFunctionBody::Return(function_body)) = function_body {
-                    write!(f, " RETURN {function_body}")?;
+
+                if let Some(policy) = storage_serialization_policy {
+                    write!(f, " STORAGE_SERIALIZATION_POLICY = {policy}")?;
                 }
-                if let Some(using) = using {
-                    write!(f, " {using}")?;
+
+                if let Some(comment) = comment {
+                    write!(f, " COMMENT = '{comment}'")?;
                 }
-                if let Some(options) = options {
-                    write!(
-                        f,
-                        " OPTIONS({})",
-                        display_comma_separated(options.as_slice())
-                    )?;
+
+                if let Some(sync) = catalog_sync {
+                    write!(f, " CATALOG_SYNC = '{sync}'")?;
+                }
+
+                if let Some(mode) = catalog_sync_namespace_mode {
+                    write!(f, " CATALOG_SYNC_NAMESPACE_MODE = {mode}")?;
+                }
+
+                if let Some(delim) = catalog_sync_namespace_flatten_delimiter {
+                    write!(f, " CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER = '{delim}'")?;
+                }
+
+                if let Some(tags) = with_tags {
+                    write!(f, " WITH TAG ({})", display_comma_separated(tags))?;
                 }
-                if let Some(CreateFunctionBody::AsAfterOptions(function_body)) = function_body {
-                    write!(f, " AS {function_body}")?;
+
+                if let Some(contacts) = with_contacts {
+                    write!(f, " WITH CONTACT ({})", display_comma_separated(contacts))?;
                 }
                 Ok(())
             }
+            Statement::CreateFunction(create_function) => create_function.fmt(f),
+            Statement::CreateDomain(create_domain) => create_domain.fmt(f),
             Statement::CreateTrigger {
+                or_alter,
                 or_replace,
                 is_constraint,
                 name,
@@ -3828,19 +4953,30 @@ impl fmt::Display for Statement {
                 condition,
                 include_each,
                 exec_body,
+                statements,
                 characteristics,
             } => {
                 write!(
                     f,
-                    "CREATE {or_replace}{is_constraint}TRIGGER {name} {period}",
+                    "CREATE {or_alter}{or_replace}{is_constraint}TRIGGER {name} ",
+                    or_alter = if *or_alter { "OR ALTER " } else { "" },
                     or_replace = if *or_replace { "OR REPLACE " } else { "" },
                     is_constraint = if *is_constraint { "CONSTRAINT " } else { "" },
                 )?;
 
-                if !events.is_empty() {
-                    write!(f, " {}", display_separated(events, " OR "))?;
+                if exec_body.is_some() {
+                    write!(f, "{period}")?;
+                    if !events.is_empty() {
+                        write!(f, " {}", display_separated(events, " OR "))?;
+                    }
+                    write!(f, " ON {table_name}")?;
+                } else {
+                    write!(f, "ON {table_name}")?;
+                    write!(f, " {period}")?;
+                    if !events.is_empty() {
+                        write!(f, " {}", display_separated(events, ", "))?;
+                    }
                 }
-                write!(f, " ON {table_name}")?;
 
                 if let Some(referenced_table_name) = referenced_table_name {
                     write!(f, " FROM {referenced_table_name}")?;
@@ -3856,13 +4992,19 @@ impl fmt::Display for Statement {
 
                 if *include_each {
                     write!(f, " FOR EACH {trigger_object}")?;
-                } else {
+                } else if exec_body.is_some() {
                     write!(f, " FOR {trigger_object}")?;
                 }
                 if let Some(condition) = condition {
                     write!(f, " WHEN {condition}")?;
                 }
-                write!(f, " EXECUTE {exec_body}")
+                if let Some(exec_body) = exec_body {
+                    write!(f, " EXECUTE {exec_body}")?;
+                }
+                if let Some(statements) = statements {
+                    write!(f, " AS {statements}")?;
+                }
+                Ok(())
             }
             Statement::DropTrigger {
                 if_exists,
@@ -3874,7 +5016,10 @@ impl fmt::Display for Statement {
                 if *if_exists {
                     write!(f, " IF EXISTS")?;
                 }
-                write!(f, " {trigger_name} ON {table_name}")?;
+                match &table_name {
+                    Some(table_name) => write!(f, " {trigger_name} ON {table_name}")?,
+                    None => write!(f, " {trigger_name}")?,
+                };
                 if let Some(option) = option {
                     write!(f, " {option}")?;
                 }
@@ -3884,6 +5029,7 @@ impl fmt::Display for Statement {
                 name,
                 or_alter,
                 params,
+                language,
                 body,
             } => {
                 write!(
@@ -3898,11 +5044,12 @@ impl fmt::Display for Statement {
                         write!(f, " ({})", display_comma_separated(p))?;
                     }
                 }
-                write!(
-                    f,
-                    " AS BEGIN {body} END",
-                    body = display_separated(body, "; ")
-                )
+
+                if let Some(language) = language {
+                    write!(f, " LANGUAGE {language}")?;
+                }
+
+                write!(f, " AS {body}")
             }
             Statement::CreateMacro {
                 or_replace,
@@ -3927,6 +5074,7 @@ impl fmt::Display for Statement {
                 Ok(())
             }
             Statement::CreateView {
+                or_alter,
                 name,
                 or_replace,
                 columns,
@@ -3939,15 +5087,32 @@ impl fmt::Display for Statement {
                 if_not_exists,
                 temporary,
                 to,
+                params,
+                name_before_not_exists,
             } => {
                 write!(
                     f,
-                    "CREATE {or_replace}{materialized}{temporary}VIEW {if_not_exists}{name}{to}",
+                    "CREATE {or_alter}{or_replace}",
+                    or_alter = if *or_alter { "OR ALTER " } else { "" },
                     or_replace = if *or_replace { "OR REPLACE " } else { "" },
+                )?;
+                if let Some(params) = params {
+                    params.fmt(f)?;
+                }
+                write!(
+                    f,
+                    "{materialized}{temporary}VIEW {if_not_and_name}{to}",
+                    if_not_and_name = if *if_not_exists {
+                        if *name_before_not_exists {
+                            format!("{name} IF NOT EXISTS")
+                        } else {
+                            format!("IF NOT EXISTS {name}")
+                        }
+                    } else {
+                        format!("{name}")
+                    },
                     materialized = if *materialized { "MATERIALIZED " } else { "" },
-                    name = name,
                     temporary = if *temporary { "TEMPORARY " } else { "" },
-                    if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
                     to = to
                         .as_ref()
                         .map(|to| format!(" TO {to}"))
@@ -3972,7 +5137,9 @@ impl fmt::Display for Statement {
                 if matches!(options, CreateTableOptions::Options(_)) {
                     write!(f, " {options}")?;
                 }
-                write!(f, " AS {query}")?;
+                f.write_str(" AS")?;
+                SpaceOrNewline.fmt(f)?;
+                query.fmt(f)?;
                 if *with_no_schema_binding {
                     write!(f, " WITH NO SCHEMA BINDING")?;
                 }
@@ -4056,6 +5223,21 @@ impl fmt::Display for Statement {
 
                 Ok(())
             }
+            Statement::DropExtension {
+                names,
+                if_exists,
+                cascade_or_restrict,
+            } => {
+                write!(f, "DROP EXTENSION")?;
+                if *if_exists {
+                    write!(f, " IF EXISTS")?;
+                }
+                write!(f, " {}", display_comma_separated(names))?;
+                if let Some(cascade_or_restrict) = cascade_or_restrict {
+                    write!(f, " {cascade_or_restrict}")?;
+                }
+                Ok(())
+            }
             Statement::CreateRole {
                 names,
                 if_not_exists,
@@ -4183,6 +5365,9 @@ impl fmt::Display for Statement {
                 write!(f, " )")?;
                 Ok(())
             }
+            Statement::CreateServer(stmt) => {
+                write!(f, "{stmt}")
+            }
             Statement::CreatePolicy {
                 name,
                 table_name,
@@ -4225,6 +5410,7 @@ impl fmt::Display for Statement {
 
                 Ok(())
             }
+            Statement::CreateConnector(create_connector) => create_connector.fmt(f),
             Statement::AlterTable {
                 name,
                 if_exists,
@@ -4232,15 +5418,21 @@ impl fmt::Display for Statement {
                 operations,
                 location,
                 on_cluster,
+                iceberg,
             } => {
-                write!(f, "ALTER TABLE ")?;
+                if *iceberg {
+                    write!(f, "ALTER ICEBERG TABLE ")?;
+                } else {
+                    write!(f, "ALTER TABLE ")?;
+                }
+
                 if *if_exists {
                     write!(f, "IF EXISTS ")?;
                 }
                 if *only {
                     write!(f, "ONLY ")?;
                 }
-                write!(f, "{name} ", name = name)?;
+                write!(f, "{name} ")?;
                 if let Some(cluster) = on_cluster {
                     write!(f, "ON CLUSTER {cluster} ")?;
                 }
@@ -4272,6 +5464,9 @@ impl fmt::Display for Statement {
                 }
                 write!(f, " AS {query}")
             }
+            Statement::AlterType(AlterType { name, operation }) => {
+                write!(f, "ALTER TYPE {name} {operation}")
+            }
             Statement::AlterRole { name, operation } => {
                 write!(f, "ALTER ROLE {name} {operation}")
             }
@@ -4282,6 +5477,51 @@ impl fmt::Display for Statement {
             } => {
                 write!(f, "ALTER POLICY {name} ON {table_name}{operation}")
             }
+            Statement::AlterConnector {
+                name,
+                properties,
+                url,
+                owner,
+            } => {
+                write!(f, "ALTER CONNECTOR {name}")?;
+                if let Some(properties) = properties {
+                    write!(
+                        f,
+                        " SET DCPROPERTIES({})",
+                        display_comma_separated(properties)
+                    )?;
+                }
+                if let Some(url) = url {
+                    write!(f, " SET URL '{url}'")?;
+                }
+                if let Some(owner) = owner {
+                    write!(f, " SET OWNER {owner}")?;
+                }
+                Ok(())
+            }
+            Statement::AlterSession {
+                set,
+                session_params,
+            } => {
+                write!(
+                    f,
+                    "ALTER SESSION {set}",
+                    set = if *set { "SET" } else { "UNSET" }
+                )?;
+                if !session_params.options.is_empty() {
+                    if *set {
+                        write!(f, " {session_params}")?;
+                    } else {
+                        let options = session_params
+                            .options
+                            .iter()
+                            .map(|p| p.option_name.clone())
+                            .collect::<Vec<_>>();
+                        write!(f, " {}", display_separated(&options, ", "))?;
+                    }
+                }
+                Ok(())
+            }
             Statement::Drop {
                 object_type,
                 if_exists,
@@ -4290,21 +5530,28 @@ impl fmt::Display for Statement {
                 restrict,
                 purge,
                 temporary,
-            } => write!(
-                f,
-                "DROP {}{}{} {}{}{}{}",
-                if *temporary { "TEMPORARY " } else { "" },
-                object_type,
-                if *if_exists { " IF EXISTS" } else { "" },
-                display_comma_separated(names),
-                if *cascade { " CASCADE" } else { "" },
-                if *restrict { " RESTRICT" } else { "" },
-                if *purge { " PURGE" } else { "" }
-            ),
+                table,
+            } => {
+                write!(
+                    f,
+                    "DROP {}{}{} {}{}{}{}",
+                    if *temporary { "TEMPORARY " } else { "" },
+                    object_type,
+                    if *if_exists { " IF EXISTS" } else { "" },
+                    display_comma_separated(names),
+                    if *cascade { " CASCADE" } else { "" },
+                    if *restrict { " RESTRICT" } else { "" },
+                    if *purge { " PURGE" } else { "" },
+                )?;
+                if let Some(table_name) = table.as_ref() {
+                    write!(f, " ON {table_name}")?;
+                };
+                Ok(())
+            }
             Statement::DropFunction {
                 if_exists,
                 func_desc,
-                option,
+                drop_behavior,
             } => {
                 write!(
                     f,
@@ -4312,7 +5559,22 @@ impl fmt::Display for Statement {
                     if *if_exists { " IF EXISTS" } else { "" },
                     display_comma_separated(func_desc),
                 )?;
-                if let Some(op) = option {
+                if let Some(op) = drop_behavior {
+                    write!(f, " {op}")?;
+                }
+                Ok(())
+            }
+            Statement::DropDomain(DropDomain {
+                if_exists,
+                name,
+                drop_behavior,
+            }) => {
+                write!(
+                    f,
+                    "DROP DOMAIN{} {name}",
+                    if *if_exists { " IF EXISTS" } else { "" },
+                )?;
+                if let Some(op) = drop_behavior {
                     write!(f, " {op}")?;
                 }
                 Ok(())
@@ -4320,7 +5582,7 @@ impl fmt::Display for Statement {
             Statement::DropProcedure {
                 if_exists,
                 proc_desc,
-                option,
+                drop_behavior,
             } => {
                 write!(
                     f,
@@ -4328,7 +5590,7 @@ impl fmt::Display for Statement {
                     if *if_exists { " IF EXISTS" } else { "" },
                     display_comma_separated(proc_desc),
                 )?;
-                if let Some(op) = option {
+                if let Some(op) = drop_behavior {
                     write!(f, " {op}")?;
                 }
                 Ok(())
@@ -4357,76 +5619,31 @@ impl fmt::Display for Statement {
                 if_exists,
                 name,
                 table_name,
-                option,
+                drop_behavior,
             } => {
                 write!(f, "DROP POLICY")?;
                 if *if_exists {
                     write!(f, " IF EXISTS")?;
                 }
                 write!(f, " {name} ON {table_name}")?;
-                if let Some(option) = option {
-                    write!(f, " {option}")?;
+                if let Some(drop_behavior) = drop_behavior {
+                    write!(f, " {drop_behavior}")?;
                 }
                 Ok(())
             }
-            Statement::Discard { object_type } => {
-                write!(f, "DISCARD {object_type}")?;
-                Ok(())
-            }
-            Self::SetRole {
-                context_modifier,
-                role_name,
-            } => {
-                let role_name = role_name.clone().unwrap_or_else(|| Ident::new("NONE"));
-                write!(f, "SET{context_modifier} ROLE {role_name}")
-            }
-            Statement::SetVariable {
-                local,
-                variables,
-                hivevar,
-                value,
-            } => {
-                f.write_str("SET ")?;
-                if *local {
-                    f.write_str("LOCAL ")?;
-                }
-                let parenthesized = matches!(variables, OneOrManyWithParens::Many(_));
+            Statement::DropConnector { if_exists, name } => {
                 write!(
                     f,
-                    "{hivevar}{name} = {l_paren}{value}{r_paren}",
-                    hivevar = if *hivevar { "HIVEVAR:" } else { "" },
-                    name = variables,
-                    l_paren = parenthesized.then_some("(").unwrap_or_default(),
-                    value = display_comma_separated(value),
-                    r_paren = parenthesized.then_some(")").unwrap_or_default(),
-                )
-            }
-            Statement::SetTimeZone { local, value } => {
-                f.write_str("SET ")?;
-                if *local {
-                    f.write_str("LOCAL ")?;
-                }
-                write!(f, "TIME ZONE {value}")
-            }
-            Statement::SetNames {
-                charset_name,
-                collation_name,
-            } => {
-                f.write_str("SET NAMES ")?;
-                f.write_str(charset_name)?;
-
-                if let Some(collation) = collation_name {
-                    f.write_str(" COLLATE ")?;
-                    f.write_str(collation)?;
-                };
-
+                    "DROP CONNECTOR {if_exists}{name}",
+                    if_exists = if *if_exists { "IF EXISTS " } else { "" }
+                )?;
                 Ok(())
             }
-            Statement::SetNamesDefault {} => {
-                f.write_str("SET NAMES DEFAULT")?;
-
+            Statement::Discard { object_type } => {
+                write!(f, "DISCARD {object_type}")?;
                 Ok(())
             }
+            Self::Set(set) => write!(f, "{set}"),
             Statement::ShowVariable { variable } => {
                 write!(f, "SHOW")?;
                 if !variable.is_empty() {
@@ -4513,6 +5730,17 @@ impl fmt::Display for Statement {
                 )?;
                 Ok(())
             }
+            Statement::ShowObjects(ShowObjects {
+                terse,
+                show_options,
+            }) => {
+                write!(
+                    f,
+                    "SHOW {terse}OBJECTS{show_options}",
+                    terse = if *terse { "TERSE " } else { "" },
+                )?;
+                Ok(())
+            }
             Statement::ShowTables {
                 terse,
                 history,
@@ -4560,46 +5788,64 @@ impl fmt::Display for Statement {
                 }
                 Ok(())
             }
+            Statement::ShowCharset(show_stm) => show_stm.fmt(f),
             Statement::StartTransaction {
                 modes,
                 begin: syntax_begin,
+                transaction,
                 modifier,
+                statements,
+                exception,
+                has_end_keyword,
             } => {
                 if *syntax_begin {
                     if let Some(modifier) = *modifier {
-                        write!(f, "BEGIN {} TRANSACTION", modifier)?;
+                        write!(f, "BEGIN {modifier}")?;
                     } else {
-                        write!(f, "BEGIN TRANSACTION")?;
+                        write!(f, "BEGIN")?;
                     }
                 } else {
-                    write!(f, "START TRANSACTION")?;
+                    write!(f, "START")?;
+                }
+                if let Some(transaction) = transaction {
+                    write!(f, " {transaction}")?;
                 }
                 if !modes.is_empty() {
                     write!(f, " {}", display_comma_separated(modes))?;
                 }
+                if !statements.is_empty() {
+                    write!(f, " ")?;
+                    format_statement_list(f, statements)?;
+                }
+                if let Some(exception_when) = exception {
+                    write!(f, " EXCEPTION")?;
+                    for when in exception_when {
+                        write!(f, " {when}")?;
+                    }
+                }
+                if *has_end_keyword {
+                    write!(f, " END")?;
+                }
                 Ok(())
             }
-            Statement::SetTransaction {
-                modes,
-                snapshot,
-                session,
+            Statement::Commit {
+                chain,
+                end: end_syntax,
+                modifier,
             } => {
-                if *session {
-                    write!(f, "SET SESSION CHARACTERISTICS AS TRANSACTION")?;
+                if *end_syntax {
+                    write!(f, "END")?;
+                    if let Some(modifier) = *modifier {
+                        write!(f, " {modifier}")?;
+                    }
+                    if *chain {
+                        write!(f, " AND CHAIN")?;
+                    }
                 } else {
-                    write!(f, "SET TRANSACTION")?;
-                }
-                if !modes.is_empty() {
-                    write!(f, " {}", display_comma_separated(modes))?;
-                }
-                if let Some(snapshot_id) = snapshot {
-                    write!(f, " SNAPSHOT {snapshot_id}")?;
+                    write!(f, "COMMIT{}", if *chain { " AND CHAIN" } else { "" })?;
                 }
                 Ok(())
             }
-            Statement::Commit { chain } => {
-                write!(f, "COMMIT{}", if *chain { " AND CHAIN" } else { "" },)
-            }
             Statement::Rollback { chain, savepoint } => {
                 write!(f, "ROLLBACK")?;
 
@@ -4616,12 +5862,35 @@ impl fmt::Display for Statement {
             Statement::CreateSchema {
                 schema_name,
                 if_not_exists,
-            } => write!(
-                f,
-                "CREATE SCHEMA {if_not_exists}{name}",
-                if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
-                name = schema_name
-            ),
+                with,
+                options,
+                default_collate_spec,
+                clone,
+            } => {
+                write!(
+                    f,
+                    "CREATE SCHEMA {if_not_exists}{name}",
+                    if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
+                    name = schema_name
+                )?;
+
+                if let Some(collate) = default_collate_spec {
+                    write!(f, " DEFAULT COLLATE {collate}")?;
+                }
+
+                if let Some(with) = with {
+                    write!(f, " WITH ({})", display_comma_separated(with))?;
+                }
+
+                if let Some(options) = options {
+                    write!(f, " OPTIONS({})", display_comma_separated(options))?;
+                }
+
+                if let Some(clone) = clone {
+                    write!(f, " CLONE {clone}")?;
+                }
+                Ok(())
+            }
             Statement::Assert { condition, message } => {
                 write!(f, "ASSERT {condition}")?;
                 if let Some(m) = message {
@@ -4634,19 +5903,30 @@ impl fmt::Display for Statement {
                 objects,
                 grantees,
                 with_grant_option,
+                as_grantor,
                 granted_by,
+                current_grants,
             } => {
                 write!(f, "GRANT {privileges} ")?;
-                write!(f, "ON {objects} ")?;
+                if let Some(objects) = objects {
+                    write!(f, "ON {objects} ")?;
+                }
                 write!(f, "TO {}", display_comma_separated(grantees))?;
                 if *with_grant_option {
                     write!(f, " WITH GRANT OPTION")?;
                 }
+                if let Some(current_grants) = current_grants {
+                    write!(f, " {current_grants}")?;
+                }
+                if let Some(grantor) = as_grantor {
+                    write!(f, " AS {grantor}")?;
+                }
                 if let Some(grantor) = granted_by {
                     write!(f, " GRANTED BY {grantor}")?;
                 }
                 Ok(())
             }
+            Statement::Deny(s) => write!(f, "{s}"),
             Statement::Revoke {
                 privileges,
                 objects,
@@ -4655,12 +5935,16 @@ impl fmt::Display for Statement {
                 cascade,
             } => {
                 write!(f, "REVOKE {privileges} ")?;
-                write!(f, "ON {objects} ")?;
+                if let Some(objects) = objects {
+                    write!(f, "ON {objects} ")?;
+                }
                 write!(f, "FROM {}", display_comma_separated(grantees))?;
                 if let Some(grantor) = granted_by {
                     write!(f, " GRANTED BY {grantor}")?;
                 }
-                write!(f, " {}", if *cascade { "CASCADE" } else { "RESTRICT" })?;
+                if let Some(cascade) = cascade {
+                    write!(f, " {cascade}")?;
+                }
                 Ok(())
             }
             Statement::Deallocate { name, prepare } => write!(
@@ -4673,21 +5957,37 @@ impl fmt::Display for Statement {
                 name,
                 parameters,
                 has_parentheses,
+                immediate,
+                into,
                 using,
+                output,
+                default,
             } => {
                 let (open, close) = if *has_parentheses {
                     ("(", ")")
                 } else {
                     (if parameters.is_empty() { "" } else { " " }, "")
                 };
-                write!(
-                    f,
-                    "EXECUTE {name}{open}{}{close}",
-                    display_comma_separated(parameters),
-                )?;
+                write!(f, "EXECUTE")?;
+                if *immediate {
+                    write!(f, " IMMEDIATE")?;
+                }
+                if let Some(name) = name {
+                    write!(f, " {name}")?;
+                }
+                write!(f, "{open}{}{close}", display_comma_separated(parameters),)?;
+                if !into.is_empty() {
+                    write!(f, " INTO {}", display_comma_separated(into))?;
+                }
                 if !using.is_empty() {
                     write!(f, " USING {}", display_comma_separated(using))?;
                 };
+                if *output {
+                    write!(f, " OUTPUT")?;
+                }
+                if *default {
+                    write!(f, " DEFAULT")?;
+                }
                 Ok(())
             }
             Statement::Prepare {
@@ -4731,6 +6031,7 @@ impl fmt::Display for Statement {
                 source,
                 on,
                 clauses,
+                output,
             } => {
                 write!(
                     f,
@@ -4738,7 +6039,11 @@ impl fmt::Display for Statement {
                     int = if *into { " INTO" } else { "" }
                 )?;
                 write!(f, "ON {on} ")?;
-                write!(f, "{}", display_separated(clauses, " "))
+                write!(f, "{}", display_separated(clauses, " "))?;
+                if let Some(output) = output {
+                    write!(f, " {output}")?;
+                }
+                Ok(())
             }
             Statement::Cache {
                 table_name,
@@ -4825,13 +6130,13 @@ impl fmt::Display for Statement {
                     if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
                 )?;
                 if !directory_table_params.options.is_empty() {
-                    write!(f, " DIRECTORY=({})", directory_table_params)?;
+                    write!(f, " DIRECTORY=({directory_table_params})")?;
                 }
                 if !file_format.options.is_empty() {
-                    write!(f, " FILE_FORMAT=({})", file_format)?;
+                    write!(f, " FILE_FORMAT=({file_format})")?;
                 }
                 if !copy_options.options.is_empty() {
-                    write!(f, " COPY_OPTIONS=({})", copy_options)?;
+                    write!(f, " COPY_OPTIONS=({copy_options})")?;
                 }
                 if comment.is_some() {
                     write!(f, " COMMENT='{}'", comment.as_ref().unwrap())?;
@@ -4839,60 +6144,73 @@ impl fmt::Display for Statement {
                 Ok(())
             }
             Statement::CopyIntoSnowflake {
+                kind,
                 into,
-                from_stage,
-                from_stage_alias,
+                into_columns,
+                from_obj,
+                from_obj_alias,
                 stage_params,
                 from_transformations,
+                from_query,
                 files,
                 pattern,
                 file_format,
                 copy_options,
                 validation_mode,
+                partition,
             } => {
-                write!(f, "COPY INTO {}", into)?;
-                if from_transformations.is_none() {
-                    // Standard data load
-                    write!(f, " FROM {}{}", from_stage, stage_params)?;
-                    if from_stage_alias.as_ref().is_some() {
-                        write!(f, " AS {}", from_stage_alias.as_ref().unwrap())?;
-                    }
-                } else {
+                write!(f, "COPY INTO {into}")?;
+                if let Some(into_columns) = into_columns {
+                    write!(f, " ({})", display_comma_separated(into_columns))?;
+                }
+                if let Some(from_transformations) = from_transformations {
                     // Data load with transformation
-                    write!(
-                        f,
-                        " FROM (SELECT {} FROM {}{}",
-                        display_separated(from_transformations.as_ref().unwrap(), ", "),
-                        from_stage,
-                        stage_params,
-                    )?;
-                    if from_stage_alias.as_ref().is_some() {
-                        write!(f, " AS {}", from_stage_alias.as_ref().unwrap())?;
+                    if let Some(from_stage) = from_obj {
+                        write!(
+                            f,
+                            " FROM (SELECT {} FROM {}{}",
+                            display_separated(from_transformations, ", "),
+                            from_stage,
+                            stage_params
+                        )?;
+                    }
+                    if let Some(from_obj_alias) = from_obj_alias {
+                        write!(f, " AS {from_obj_alias}")?;
                     }
                     write!(f, ")")?;
+                } else if let Some(from_obj) = from_obj {
+                    // Standard data load
+                    write!(f, " FROM {from_obj}{stage_params}")?;
+                    if let Some(from_obj_alias) = from_obj_alias {
+                        write!(f, " AS {from_obj_alias}")?;
+                    }
+                } else if let Some(from_query) = from_query {
+                    // Data unload from query
+                    write!(f, " FROM ({from_query})")?;
                 }
-                if files.is_some() {
-                    write!(
-                        f,
-                        " FILES = ('{}')",
-                        display_separated(files.as_ref().unwrap(), "', '")
-                    )?;
+
+                if let Some(files) = files {
+                    write!(f, " FILES = ('{}')", display_separated(files, "', '"))?;
+                }
+                if let Some(pattern) = pattern {
+                    write!(f, " PATTERN = '{pattern}'")?;
                 }
-                if pattern.is_some() {
-                    write!(f, " PATTERN = '{}'", pattern.as_ref().unwrap())?;
+                if let Some(partition) = partition {
+                    write!(f, " PARTITION BY {partition}")?;
                 }
                 if !file_format.options.is_empty() {
-                    write!(f, " FILE_FORMAT=({})", file_format)?;
+                    write!(f, " FILE_FORMAT=({file_format})")?;
                 }
                 if !copy_options.options.is_empty() {
-                    write!(f, " COPY_OPTIONS=({})", copy_options)?;
+                    match kind {
+                        CopyIntoSnowflakeKind::Table => {
+                            write!(f, " COPY_OPTIONS=({copy_options})")?
+                        }
+                        CopyIntoSnowflakeKind::Location => write!(f, " {copy_options}")?,
+                    }
                 }
-                if validation_mode.is_some() {
-                    write!(
-                        f,
-                        " VALIDATION_MODE = {}",
-                        validation_mode.as_ref().unwrap()
-                    )?;
+                if let Some(validation_mode) = validation_mode {
+                    write!(f, " VALIDATION_MODE = {validation_mode}")?;
                 }
                 Ok(())
             }
@@ -4938,10 +6256,10 @@ impl fmt::Display for Statement {
             } => {
                 write!(f, "OPTIMIZE TABLE {name}")?;
                 if let Some(on_cluster) = on_cluster {
-                    write!(f, " ON CLUSTER {on_cluster}", on_cluster = on_cluster)?;
+                    write!(f, " ON CLUSTER {on_cluster}")?;
                 }
                 if let Some(partition) = partition {
-                    write!(f, " {partition}", partition = partition)?;
+                    write!(f, " {partition}")?;
                 }
                 if *include_final {
                     write!(f, " FINAL")?;
@@ -4966,6 +6284,32 @@ impl fmt::Display for Statement {
                 }
                 Ok(())
             }
+            Statement::RenameTable(rename_tables) => {
+                write!(f, "RENAME TABLE {}", display_comma_separated(rename_tables))
+            }
+            Statement::RaisError {
+                message,
+                severity,
+                state,
+                arguments,
+                options,
+            } => {
+                write!(f, "RAISERROR({message}, {severity}, {state}")?;
+                if !arguments.is_empty() {
+                    write!(f, ", {}", display_comma_separated(arguments))?;
+                }
+                write!(f, ")")?;
+                if !options.is_empty() {
+                    write!(f, " WITH {}", display_comma_separated(options))?;
+                }
+                Ok(())
+            }
+            Statement::Print(s) => write!(f, "{s}"),
+            Statement::Return(r) => write!(f, "{r}"),
+            Statement::List(command) => write!(f, "LIST {command}"),
+            Statement::Remove(command) => write!(f, "REMOVE {command}"),
+            Statement::ExportData(e) => write!(f, "{e}"),
+            Statement::CreateUser(s) => write!(f, "{s}"),
         }
     }
 }
@@ -5029,6 +6373,28 @@ impl fmt::Display for SequenceOptions {
     }
 }
 
+/// Assignment for a `SET` statement (name [=|TO] value)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct SetAssignment {
+    pub scope: Option<ContextModifier>,
+    pub name: ObjectName,
+    pub value: Expr,
+}
+
+impl fmt::Display for SetAssignment {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "{}{} = {}",
+            self.scope.map(|s| format!("{s}")).unwrap_or_default(),
+            self.name,
+            self.value
+        )
+    }
+}
+
 /// Target of a `TRUNCATE TABLE` command
 ///
 /// Note this is its own struct because `visit_relation` requires an `ObjectName` (not a `Vec<ObjectName>`)
@@ -5039,10 +6405,17 @@ pub struct TruncateTableTarget {
     /// name of the table being truncated
     #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
     pub name: ObjectName,
+    /// Postgres-specific option
+    /// [ TRUNCATE TABLE ONLY ]
+    /// <https://www.postgresql.org/docs/current/sql-truncate.html>
+    pub only: bool,
 }
 
 impl fmt::Display for TruncateTableTarget {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.only {
+            write!(f, "ONLY ")?;
+        };
         write!(f, "{}", self.name)
     }
 }
@@ -5057,16 +6430,43 @@ pub enum TruncateIdentityOption {
     Continue,
 }
 
-/// PostgreSQL cascade option for TRUNCATE table
+/// Cascade/restrict option for Postgres TRUNCATE table, MySQL GRANT/REVOKE, etc.
 /// [ CASCADE | RESTRICT ]
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub enum TruncateCascadeOption {
+pub enum CascadeOption {
     Cascade,
     Restrict,
 }
 
+impl Display for CascadeOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            CascadeOption::Cascade => write!(f, "CASCADE"),
+            CascadeOption::Restrict => write!(f, "RESTRICT"),
+        }
+    }
+}
+
+/// Transaction started with [ TRANSACTION | WORK ]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum BeginTransactionKind {
+    Transaction,
+    Work,
+}
+
+impl Display for BeginTransactionKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            BeginTransactionKind::Transaction => write!(f, "TRANSACTION"),
+            BeginTransactionKind::Work => write!(f, "WORK"),
+        }
+    }
+}
+
 /// Can use to describe options in  create sequence or table column type identity
 /// [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -5284,34 +6684,163 @@ impl fmt::Display for FetchDirection {
     }
 }
 
+/// The "position" for a FETCH statement.
+///
+/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/fetch-transact-sql)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum FetchPosition {
+    From,
+    In,
+}
+
+impl fmt::Display for FetchPosition {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            FetchPosition::From => f.write_str("FROM")?,
+            FetchPosition::In => f.write_str("IN")?,
+        };
+
+        Ok(())
+    }
+}
+
 /// A privilege on a database object (table, sequence, etc.).
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum Action {
+    AddSearchOptimization,
+    Apply {
+        apply_type: ActionApplyType,
+    },
+    ApplyBudget,
+    AttachListing,
+    AttachPolicy,
+    Audit,
+    BindServiceEndpoint,
     Connect,
-    Create,
+    Create {
+        obj_type: Option<ActionCreateObjectType>,
+    },
+    DatabaseRole {
+        role: ObjectName,
+    },
     Delete,
-    Execute,
-    Insert { columns: Option<Vec<Ident>> },
-    References { columns: Option<Vec<Ident>> },
-    Select { columns: Option<Vec<Ident>> },
+    Drop,
+    EvolveSchema,
+    Exec {
+        obj_type: Option<ActionExecuteObjectType>,
+    },
+    Execute {
+        obj_type: Option<ActionExecuteObjectType>,
+    },
+    Failover,
+    ImportedPrivileges,
+    ImportShare,
+    Insert {
+        columns: Option<Vec<Ident>>,
+    },
+    Manage {
+        manage_type: ActionManageType,
+    },
+    ManageReleases,
+    ManageVersions,
+    Modify {
+        modify_type: Option<ActionModifyType>,
+    },
+    Monitor {
+        monitor_type: Option<ActionMonitorType>,
+    },
+    Operate,
+    OverrideShareRestrictions,
+    Ownership,
+    PurchaseDataExchangeListing,
+    Read,
+    ReadSession,
+    References {
+        columns: Option<Vec<Ident>>,
+    },
+    Replicate,
+    ResolveAll,
+    Role {
+        role: ObjectName,
+    },
+    Select {
+        columns: Option<Vec<Ident>>,
+    },
     Temporary,
     Trigger,
     Truncate,
-    Update { columns: Option<Vec<Ident>> },
+    Update {
+        columns: Option<Vec<Ident>>,
+    },
     Usage,
 }
 
 impl fmt::Display for Action {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
+            Action::AddSearchOptimization => f.write_str("ADD SEARCH OPTIMIZATION")?,
+            Action::Apply { apply_type } => write!(f, "APPLY {apply_type}")?,
+            Action::ApplyBudget => f.write_str("APPLYBUDGET")?,
+            Action::AttachListing => f.write_str("ATTACH LISTING")?,
+            Action::AttachPolicy => f.write_str("ATTACH POLICY")?,
+            Action::Audit => f.write_str("AUDIT")?,
+            Action::BindServiceEndpoint => f.write_str("BIND SERVICE ENDPOINT")?,
             Action::Connect => f.write_str("CONNECT")?,
-            Action::Create => f.write_str("CREATE")?,
+            Action::Create { obj_type } => {
+                f.write_str("CREATE")?;
+                if let Some(obj_type) = obj_type {
+                    write!(f, " {obj_type}")?
+                }
+            }
+            Action::DatabaseRole { role } => write!(f, "DATABASE ROLE {role}")?,
             Action::Delete => f.write_str("DELETE")?,
-            Action::Execute => f.write_str("EXECUTE")?,
+            Action::Drop => f.write_str("DROP")?,
+            Action::EvolveSchema => f.write_str("EVOLVE SCHEMA")?,
+            Action::Exec { obj_type } => {
+                f.write_str("EXEC")?;
+                if let Some(obj_type) = obj_type {
+                    write!(f, " {obj_type}")?
+                }
+            }
+            Action::Execute { obj_type } => {
+                f.write_str("EXECUTE")?;
+                if let Some(obj_type) = obj_type {
+                    write!(f, " {obj_type}")?
+                }
+            }
+            Action::Failover => f.write_str("FAILOVER")?,
+            Action::ImportedPrivileges => f.write_str("IMPORTED PRIVILEGES")?,
+            Action::ImportShare => f.write_str("IMPORT SHARE")?,
             Action::Insert { .. } => f.write_str("INSERT")?,
+            Action::Manage { manage_type } => write!(f, "MANAGE {manage_type}")?,
+            Action::ManageReleases => f.write_str("MANAGE RELEASES")?,
+            Action::ManageVersions => f.write_str("MANAGE VERSIONS")?,
+            Action::Modify { modify_type } => {
+                write!(f, "MODIFY")?;
+                if let Some(modify_type) = modify_type {
+                    write!(f, " {modify_type}")?;
+                }
+            }
+            Action::Monitor { monitor_type } => {
+                write!(f, "MONITOR")?;
+                if let Some(monitor_type) = monitor_type {
+                    write!(f, " {monitor_type}")?
+                }
+            }
+            Action::Operate => f.write_str("OPERATE")?,
+            Action::OverrideShareRestrictions => f.write_str("OVERRIDE SHARE RESTRICTIONS")?,
+            Action::Ownership => f.write_str("OWNERSHIP")?,
+            Action::PurchaseDataExchangeListing => f.write_str("PURCHASE DATA EXCHANGE LISTING")?,
+            Action::Read => f.write_str("READ")?,
+            Action::ReadSession => f.write_str("READ SESSION")?,
             Action::References { .. } => f.write_str("REFERENCES")?,
+            Action::Replicate => f.write_str("REPLICATE")?,
+            Action::ResolveAll => f.write_str("RESOLVE ALL")?,
+            Action::Role { role } => write!(f, "ROLE {role}")?,
             Action::Select { .. } => f.write_str("SELECT")?,
             Action::Temporary => f.write_str("TEMPORARY")?,
             Action::Trigger => f.write_str("TRIGGER")?,
@@ -5334,6 +6863,270 @@ impl fmt::Display for Action {
     }
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `CREATE` privilege.
+pub enum ActionCreateObjectType {
+    Account,
+    Application,
+    ApplicationPackage,
+    ComputePool,
+    DataExchangeListing,
+    Database,
+    ExternalVolume,
+    FailoverGroup,
+    Integration,
+    NetworkPolicy,
+    OrganiationListing,
+    ReplicationGroup,
+    Role,
+    Schema,
+    Share,
+    User,
+    Warehouse,
+}
+
+impl fmt::Display for ActionCreateObjectType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionCreateObjectType::Account => write!(f, "ACCOUNT"),
+            ActionCreateObjectType::Application => write!(f, "APPLICATION"),
+            ActionCreateObjectType::ApplicationPackage => write!(f, "APPLICATION PACKAGE"),
+            ActionCreateObjectType::ComputePool => write!(f, "COMPUTE POOL"),
+            ActionCreateObjectType::DataExchangeListing => write!(f, "DATA EXCHANGE LISTING"),
+            ActionCreateObjectType::Database => write!(f, "DATABASE"),
+            ActionCreateObjectType::ExternalVolume => write!(f, "EXTERNAL VOLUME"),
+            ActionCreateObjectType::FailoverGroup => write!(f, "FAILOVER GROUP"),
+            ActionCreateObjectType::Integration => write!(f, "INTEGRATION"),
+            ActionCreateObjectType::NetworkPolicy => write!(f, "NETWORK POLICY"),
+            ActionCreateObjectType::OrganiationListing => write!(f, "ORGANIZATION LISTING"),
+            ActionCreateObjectType::ReplicationGroup => write!(f, "REPLICATION GROUP"),
+            ActionCreateObjectType::Role => write!(f, "ROLE"),
+            ActionCreateObjectType::Schema => write!(f, "SCHEMA"),
+            ActionCreateObjectType::Share => write!(f, "SHARE"),
+            ActionCreateObjectType::User => write!(f, "USER"),
+            ActionCreateObjectType::Warehouse => write!(f, "WAREHOUSE"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `APPLY` privilege.
+pub enum ActionApplyType {
+    AggregationPolicy,
+    AuthenticationPolicy,
+    JoinPolicy,
+    MaskingPolicy,
+    PackagesPolicy,
+    PasswordPolicy,
+    ProjectionPolicy,
+    RowAccessPolicy,
+    SessionPolicy,
+    Tag,
+}
+
+impl fmt::Display for ActionApplyType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionApplyType::AggregationPolicy => write!(f, "AGGREGATION POLICY"),
+            ActionApplyType::AuthenticationPolicy => write!(f, "AUTHENTICATION POLICY"),
+            ActionApplyType::JoinPolicy => write!(f, "JOIN POLICY"),
+            ActionApplyType::MaskingPolicy => write!(f, "MASKING POLICY"),
+            ActionApplyType::PackagesPolicy => write!(f, "PACKAGES POLICY"),
+            ActionApplyType::PasswordPolicy => write!(f, "PASSWORD POLICY"),
+            ActionApplyType::ProjectionPolicy => write!(f, "PROJECTION POLICY"),
+            ActionApplyType::RowAccessPolicy => write!(f, "ROW ACCESS POLICY"),
+            ActionApplyType::SessionPolicy => write!(f, "SESSION POLICY"),
+            ActionApplyType::Tag => write!(f, "TAG"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `EXECUTE` privilege.
+pub enum ActionExecuteObjectType {
+    Alert,
+    DataMetricFunction,
+    ManagedAlert,
+    ManagedTask,
+    Task,
+}
+
+impl fmt::Display for ActionExecuteObjectType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionExecuteObjectType::Alert => write!(f, "ALERT"),
+            ActionExecuteObjectType::DataMetricFunction => write!(f, "DATA METRIC FUNCTION"),
+            ActionExecuteObjectType::ManagedAlert => write!(f, "MANAGED ALERT"),
+            ActionExecuteObjectType::ManagedTask => write!(f, "MANAGED TASK"),
+            ActionExecuteObjectType::Task => write!(f, "TASK"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `MANAGE` privilege.
+pub enum ActionManageType {
+    AccountSupportCases,
+    EventSharing,
+    Grants,
+    ListingAutoFulfillment,
+    OrganizationSupportCases,
+    UserSupportCases,
+    Warehouses,
+}
+
+impl fmt::Display for ActionManageType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionManageType::AccountSupportCases => write!(f, "ACCOUNT SUPPORT CASES"),
+            ActionManageType::EventSharing => write!(f, "EVENT SHARING"),
+            ActionManageType::Grants => write!(f, "GRANTS"),
+            ActionManageType::ListingAutoFulfillment => write!(f, "LISTING AUTO FULFILLMENT"),
+            ActionManageType::OrganizationSupportCases => write!(f, "ORGANIZATION SUPPORT CASES"),
+            ActionManageType::UserSupportCases => write!(f, "USER SUPPORT CASES"),
+            ActionManageType::Warehouses => write!(f, "WAREHOUSES"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `MODIFY` privilege.
+pub enum ActionModifyType {
+    LogLevel,
+    TraceLevel,
+    SessionLogLevel,
+    SessionTraceLevel,
+}
+
+impl fmt::Display for ActionModifyType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionModifyType::LogLevel => write!(f, "LOG LEVEL"),
+            ActionModifyType::TraceLevel => write!(f, "TRACE LEVEL"),
+            ActionModifyType::SessionLogLevel => write!(f, "SESSION LOG LEVEL"),
+            ActionModifyType::SessionTraceLevel => write!(f, "SESSION TRACE LEVEL"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// See <https://docs.snowflake.com/en/sql-reference/sql/grant-privilege>
+/// under `globalPrivileges` in the `MONITOR` privilege.
+pub enum ActionMonitorType {
+    Execution,
+    Security,
+    Usage,
+}
+
+impl fmt::Display for ActionMonitorType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            ActionMonitorType::Execution => write!(f, "EXECUTION"),
+            ActionMonitorType::Security => write!(f, "SECURITY"),
+            ActionMonitorType::Usage => write!(f, "USAGE"),
+        }
+    }
+}
+
+/// The principal that receives the privileges
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct Grantee {
+    pub grantee_type: GranteesType,
+    pub name: Option<GranteeName>,
+}
+
+impl fmt::Display for Grantee {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.grantee_type {
+            GranteesType::Role => {
+                write!(f, "ROLE ")?;
+            }
+            GranteesType::Share => {
+                write!(f, "SHARE ")?;
+            }
+            GranteesType::User => {
+                write!(f, "USER ")?;
+            }
+            GranteesType::Group => {
+                write!(f, "GROUP ")?;
+            }
+            GranteesType::Public => {
+                write!(f, "PUBLIC ")?;
+            }
+            GranteesType::DatabaseRole => {
+                write!(f, "DATABASE ROLE ")?;
+            }
+            GranteesType::Application => {
+                write!(f, "APPLICATION ")?;
+            }
+            GranteesType::ApplicationRole => {
+                write!(f, "APPLICATION ROLE ")?;
+            }
+            GranteesType::None => (),
+        }
+        if let Some(ref name) = self.name {
+            name.fmt(f)?;
+        }
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum GranteesType {
+    Role,
+    Share,
+    User,
+    Group,
+    Public,
+    DatabaseRole,
+    Application,
+    ApplicationRole,
+    None,
+}
+
+/// Users/roles designated in a GRANT/REVOKE
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum GranteeName {
+    /// A bare identifier
+    ObjectName(ObjectName),
+    /// A MySQL user/host pair such as 'root'@'%'
+    UserHost { user: Ident, host: Ident },
+}
+
+impl fmt::Display for GranteeName {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            GranteeName::ObjectName(name) => name.fmt(f),
+            GranteeName::UserHost { user, host } => {
+                write!(f, "{user}@{host}")
+            }
+        }
+    }
+}
+
 /// Objects on which privileges are granted in a GRANT statement.
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -5343,12 +7136,73 @@ pub enum GrantObjects {
     AllSequencesInSchema { schemas: Vec<ObjectName> },
     /// Grant privileges on `ALL TABLES IN SCHEMA <schema_name> [, ...]`
     AllTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `ALL VIEWS IN SCHEMA <schema_name> [, ...]`
+    AllViewsInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `ALL MATERIALIZED VIEWS IN SCHEMA <schema_name> [, ...]`
+    AllMaterializedViewsInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `ALL EXTERNAL TABLES IN SCHEMA <schema_name> [, ...]`
+    AllExternalTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `ALL FUNCTIONS IN SCHEMA <schema_name> [, ...]`
+    AllFunctionsInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE SCHEMAS IN DATABASE <database_name> [, ...]`
+    FutureSchemasInDatabase { databases: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE TABLES IN SCHEMA <schema_name> [, ...]`
+    FutureTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE VIEWS IN SCHEMA <schema_name> [, ...]`
+    FutureViewsInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE EXTERNAL TABLES IN SCHEMA <schema_name> [, ...]`
+    FutureExternalTablesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE MATERIALIZED VIEWS IN SCHEMA <schema_name> [, ...]`
+    FutureMaterializedViewsInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on `FUTURE SEQUENCES IN SCHEMA <schema_name> [, ...]`
+    FutureSequencesInSchema { schemas: Vec<ObjectName> },
+    /// Grant privileges on specific databases
+    Databases(Vec<ObjectName>),
     /// Grant privileges on specific schemas
     Schemas(Vec<ObjectName>),
     /// Grant privileges on specific sequences
     Sequences(Vec<ObjectName>),
     /// Grant privileges on specific tables
     Tables(Vec<ObjectName>),
+    /// Grant privileges on specific views
+    Views(Vec<ObjectName>),
+    /// Grant privileges on specific warehouses
+    Warehouses(Vec<ObjectName>),
+    /// Grant privileges on specific integrations
+    Integrations(Vec<ObjectName>),
+    /// Grant privileges on resource monitors
+    ResourceMonitors(Vec<ObjectName>),
+    /// Grant privileges on users
+    Users(Vec<ObjectName>),
+    /// Grant privileges on compute pools
+    ComputePools(Vec<ObjectName>),
+    /// Grant privileges on connections
+    Connections(Vec<ObjectName>),
+    /// Grant privileges on failover groups
+    FailoverGroup(Vec<ObjectName>),
+    /// Grant privileges on replication group
+    ReplicationGroup(Vec<ObjectName>),
+    /// Grant privileges on external volumes
+    ExternalVolumes(Vec<ObjectName>),
+    /// Grant privileges on a procedure. In dialects that
+    /// support overloading, the argument types must be specified.
+    ///
+    /// For example:
+    /// `GRANT USAGE ON PROCEDURE foo(varchar) TO ROLE role1`
+    Procedure {
+        name: ObjectName,
+        arg_types: Vec<DataType>,
+    },
+
+    /// Grant privileges on a function. In dialects that
+    /// support overloading, the argument types must be specified.
+    ///
+    /// For example:
+    /// `GRANT USAGE ON FUNCTION foo(varchar) TO ROLE role1`
+    Function {
+        name: ObjectName,
+        arg_types: Vec<DataType>,
+    },
 }
 
 impl fmt::Display for GrantObjects {
@@ -5357,27 +7211,175 @@ impl fmt::Display for GrantObjects {
             GrantObjects::Sequences(sequences) => {
                 write!(f, "SEQUENCE {}", display_comma_separated(sequences))
             }
-            GrantObjects::Schemas(schemas) => {
-                write!(f, "SCHEMA {}", display_comma_separated(schemas))
+            GrantObjects::Databases(databases) => {
+                write!(f, "DATABASE {}", display_comma_separated(databases))
+            }
+            GrantObjects::Schemas(schemas) => {
+                write!(f, "SCHEMA {}", display_comma_separated(schemas))
+            }
+            GrantObjects::Tables(tables) => {
+                write!(f, "{}", display_comma_separated(tables))
+            }
+            GrantObjects::Views(views) => {
+                write!(f, "VIEW {}", display_comma_separated(views))
+            }
+            GrantObjects::Warehouses(warehouses) => {
+                write!(f, "WAREHOUSE {}", display_comma_separated(warehouses))
+            }
+            GrantObjects::Integrations(integrations) => {
+                write!(f, "INTEGRATION {}", display_comma_separated(integrations))
+            }
+            GrantObjects::AllSequencesInSchema { schemas } => {
+                write!(
+                    f,
+                    "ALL SEQUENCES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::AllTablesInSchema { schemas } => {
+                write!(
+                    f,
+                    "ALL TABLES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::AllExternalTablesInSchema { schemas } => {
+                write!(
+                    f,
+                    "ALL EXTERNAL TABLES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::AllViewsInSchema { schemas } => {
+                write!(
+                    f,
+                    "ALL VIEWS IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
             }
-            GrantObjects::Tables(tables) => {
-                write!(f, "{}", display_comma_separated(tables))
+            GrantObjects::AllMaterializedViewsInSchema { schemas } => {
+                write!(
+                    f,
+                    "ALL MATERIALIZED VIEWS IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
             }
-            GrantObjects::AllSequencesInSchema { schemas } => {
+            GrantObjects::AllFunctionsInSchema { schemas } => {
                 write!(
                     f,
-                    "ALL SEQUENCES IN SCHEMA {}",
+                    "ALL FUNCTIONS IN SCHEMA {}",
                     display_comma_separated(schemas)
                 )
             }
-            GrantObjects::AllTablesInSchema { schemas } => {
+            GrantObjects::FutureSchemasInDatabase { databases } => {
                 write!(
                     f,
-                    "ALL TABLES IN SCHEMA {}",
+                    "FUTURE SCHEMAS IN DATABASE {}",
+                    display_comma_separated(databases)
+                )
+            }
+            GrantObjects::FutureTablesInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE TABLES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::FutureExternalTablesInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE EXTERNAL TABLES IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::FutureViewsInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE VIEWS IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::FutureMaterializedViewsInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE MATERIALIZED VIEWS IN SCHEMA {}",
+                    display_comma_separated(schemas)
+                )
+            }
+            GrantObjects::FutureSequencesInSchema { schemas } => {
+                write!(
+                    f,
+                    "FUTURE SEQUENCES IN SCHEMA {}",
                     display_comma_separated(schemas)
                 )
             }
+            GrantObjects::ResourceMonitors(objects) => {
+                write!(f, "RESOURCE MONITOR {}", display_comma_separated(objects))
+            }
+            GrantObjects::Users(objects) => {
+                write!(f, "USER {}", display_comma_separated(objects))
+            }
+            GrantObjects::ComputePools(objects) => {
+                write!(f, "COMPUTE POOL {}", display_comma_separated(objects))
+            }
+            GrantObjects::Connections(objects) => {
+                write!(f, "CONNECTION {}", display_comma_separated(objects))
+            }
+            GrantObjects::FailoverGroup(objects) => {
+                write!(f, "FAILOVER GROUP {}", display_comma_separated(objects))
+            }
+            GrantObjects::ReplicationGroup(objects) => {
+                write!(f, "REPLICATION GROUP {}", display_comma_separated(objects))
+            }
+            GrantObjects::ExternalVolumes(objects) => {
+                write!(f, "EXTERNAL VOLUME {}", display_comma_separated(objects))
+            }
+            GrantObjects::Procedure { name, arg_types } => {
+                write!(f, "PROCEDURE {name}")?;
+                if !arg_types.is_empty() {
+                    write!(f, "({})", display_comma_separated(arg_types))?;
+                }
+                Ok(())
+            }
+            GrantObjects::Function { name, arg_types } => {
+                write!(f, "FUNCTION {name}")?;
+                if !arg_types.is_empty() {
+                    write!(f, "({})", display_comma_separated(arg_types))?;
+                }
+                Ok(())
+            }
+        }
+    }
+}
+
+/// A `DENY` statement
+///
+/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/deny-transact-sql)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct DenyStatement {
+    pub privileges: Privileges,
+    pub objects: GrantObjects,
+    pub grantees: Vec<Grantee>,
+    pub granted_by: Option<Ident>,
+    pub cascade: Option<CascadeOption>,
+}
+
+impl fmt::Display for DenyStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "DENY {}", self.privileges)?;
+        write!(f, " ON {}", self.objects)?;
+        if !self.grantees.is_empty() {
+            write!(f, " TO {}", display_comma_separated(&self.grantees))?;
+        }
+        if let Some(cascade) = &self.cascade {
+            write!(f, " {cascade}")?;
         }
+        if let Some(granted_by) = &self.granted_by {
+            write!(f, " AS {granted_by}")?;
+        }
+        Ok(())
     }
 }
 
@@ -5412,7 +7414,7 @@ pub enum AssignmentTarget {
 impl fmt::Display for AssignmentTarget {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            AssignmentTarget::ColumnName(column) => write!(f, "{}", column),
+            AssignmentTarget::ColumnName(column) => write!(f, "{column}"),
             AssignmentTarget::Tuple(columns) => write!(f, "({})", display_comma_separated(columns)),
         }
     }
@@ -5432,8 +7434,8 @@ pub enum FunctionArgExpr {
 impl From<Expr> for FunctionArgExpr {
     fn from(wildcard_expr: Expr) -> Self {
         match wildcard_expr {
-            Expr::QualifiedWildcard(prefix) => Self::QualifiedWildcard(prefix),
-            Expr::Wildcard => Self::Wildcard,
+            Expr::QualifiedWildcard(prefix, _) => Self::QualifiedWildcard(prefix),
+            Expr::Wildcard(_) => Self::Wildcard,
             expr => Self::Expr(expr),
         }
     }
@@ -5462,6 +7464,8 @@ pub enum FunctionArgOperator {
     Assignment,
     /// function(arg1 : value1)
     Colon,
+    /// function(arg1 VALUE value1)
+    Value,
 }
 
 impl fmt::Display for FunctionArgOperator {
@@ -5471,6 +7475,7 @@ impl fmt::Display for FunctionArgOperator {
             FunctionArgOperator::RightArrow => f.write_str("=>"),
             FunctionArgOperator::Assignment => f.write_str(":="),
             FunctionArgOperator::Colon => f.write_str(":"),
+            FunctionArgOperator::Value => f.write_str("VALUE"),
         }
     }
 }
@@ -5533,12 +7538,80 @@ impl fmt::Display for CloseCursor {
     }
 }
 
+/// A Drop Domain statement
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct DropDomain {
+    /// Whether to drop the domain if it exists
+    pub if_exists: bool,
+    /// The name of the domain to drop
+    pub name: ObjectName,
+    /// The behavior to apply when dropping the domain
+    pub drop_behavior: Option<DropBehavior>,
+}
+
+/// A constant of form `<data_type> 'value'`.
+/// This can represent ANSI SQL `DATE`, `TIME`, and `TIMESTAMP` literals (such as `DATE '2020-01-01'`),
+/// as well as constants of other types (a non-standard PostgreSQL extension).
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TypedString {
+    pub data_type: DataType,
+    /// The value of the constant.
+    /// Hint: you can unwrap the string value using `value.into_string()`.
+    pub value: ValueWithSpan,
+    /// Flags whether this TypedString uses the [ODBC syntax].
+    ///
+    /// Example:
+    /// ```sql
+    /// -- An ODBC date literal:
+    /// SELECT {d '2025-07-16'}
+    /// -- This is equivalent to the standard ANSI SQL literal:
+    /// SELECT DATE '2025-07-16'
+    ///
+    /// [ODBC syntax]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/date-time-and-timestamp-literals?view=sql-server-2017
+    pub uses_odbc_syntax: bool,
+}
+
+impl fmt::Display for TypedString {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let data_type = &self.data_type;
+        let value = &self.value;
+        match self.uses_odbc_syntax {
+            false => {
+                write!(f, "{data_type}")?;
+                write!(f, " {value}")
+            }
+            true => {
+                let prefix = match data_type {
+                    DataType::Date => "d",
+                    DataType::Time(..) => "t",
+                    DataType::Timestamp(..) => "ts",
+                    _ => "?",
+                };
+                write!(f, "{{{prefix} {value}}}")
+            }
+        }
+    }
+}
+
 /// A function call
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Function {
     pub name: ObjectName,
+    /// Flags whether this function call uses the [ODBC syntax].
+    ///
+    /// Example:
+    /// ```sql
+    /// SELECT {fn CONCAT('foo', 'bar')}
+    /// ```
+    ///
+    /// [ODBC syntax]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/scalar-function-calls?view=sql-server-2017
+    pub uses_odbc_syntax: bool,
     /// The parameters to the function, including any options specified within the
     /// delimiting parentheses.
     ///
@@ -5577,6 +7650,10 @@ pub struct Function {
 
 impl fmt::Display for Function {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if self.uses_odbc_syntax {
+            write!(f, "{{fn ")?;
+        }
+
         write!(f, "{}{}{}", self.name, self.parameters, self.args)?;
 
         if !self.within_group.is_empty() {
@@ -5596,7 +7673,12 @@ impl fmt::Display for Function {
         }
 
         if let Some(o) = &self.over {
-            write!(f, " OVER {o}")?;
+            f.write_str(" OVER ")?;
+            o.fmt(f)?;
+        }
+
+        if self.uses_odbc_syntax {
+            write!(f, "}}")?;
         }
 
         Ok(())
@@ -5623,8 +7705,8 @@ impl fmt::Display for FunctionArguments {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
             FunctionArguments::None => Ok(()),
-            FunctionArguments::Subquery(query) => write!(f, "({})", query),
-            FunctionArguments::List(args) => write!(f, "({})", args),
+            FunctionArguments::Subquery(query) => write!(f, "({query})"),
+            FunctionArguments::List(args) => write!(f, "({args})"),
         }
     }
 }
@@ -5645,7 +7727,7 @@ pub struct FunctionArgumentList {
 impl fmt::Display for FunctionArgumentList {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if let Some(duplicate_treatment) = self.duplicate_treatment {
-            write!(f, "{} ", duplicate_treatment)?;
+            write!(f, "{duplicate_treatment} ")?;
         }
         write!(f, "{}", display_comma_separated(&self.args))?;
         if !self.clauses.is_empty() {
@@ -5705,7 +7787,7 @@ impl fmt::Display for FunctionArgumentClause {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
             FunctionArgumentClause::IgnoreOrRespectNulls(null_treatment) => {
-                write!(f, "{}", null_treatment)
+                write!(f, "{null_treatment}")
             }
             FunctionArgumentClause::OrderBy(order_by) => {
                 write!(f, "ORDER BY {}", display_comma_separated(order_by))
@@ -5759,6 +7841,25 @@ impl fmt::Display for DuplicateTreatment {
     }
 }
 
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum AnalyzeFormatKind {
+    /// e.g. `EXPLAIN ANALYZE FORMAT JSON SELECT * FROM tbl`
+    Keyword(AnalyzeFormat),
+    /// e.g. `EXPLAIN ANALYZE FORMAT=JSON SELECT * FROM tbl`
+    Assignment(AnalyzeFormat),
+}
+
+impl fmt::Display for AnalyzeFormatKind {
+    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
+        match self {
+            AnalyzeFormatKind::Keyword(format) => write!(f, "FORMAT {format}"),
+            AnalyzeFormatKind::Assignment(format) => write!(f, "FORMAT={format}"),
+        }
+    }
+}
+
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -5766,6 +7867,8 @@ pub enum AnalyzeFormat {
     TEXT,
     GRAPHVIZ,
     JSON,
+    TRADITIONAL,
+    TREE,
 }
 
 impl fmt::Display for AnalyzeFormat {
@@ -5774,6 +7877,8 @@ impl fmt::Display for AnalyzeFormat {
             AnalyzeFormat::TEXT => "TEXT",
             AnalyzeFormat::GRAPHVIZ => "GRAPHVIZ",
             AnalyzeFormat::JSON => "JSON",
+            AnalyzeFormat::TRADITIONAL => "TRADITIONAL",
+            AnalyzeFormat::TREE => "TREE",
         })
     }
 }
@@ -5878,6 +7983,7 @@ impl fmt::Display for HavingBoundKind {
 pub enum ObjectType {
     Table,
     View,
+    MaterializedView,
     Index,
     Schema,
     Database,
@@ -5885,6 +7991,8 @@ pub enum ObjectType {
     Sequence,
     Stage,
     Type,
+    User,
+    Stream,
 }
 
 impl fmt::Display for ObjectType {
@@ -5892,6 +8000,7 @@ impl fmt::Display for ObjectType {
         f.write_str(match self {
             ObjectType::Table => "TABLE",
             ObjectType::View => "VIEW",
+            ObjectType::MaterializedView => "MATERIALIZED VIEW",
             ObjectType::Index => "INDEX",
             ObjectType::Schema => "SCHEMA",
             ObjectType::Database => "DATABASE",
@@ -5899,6 +8008,8 @@ impl fmt::Display for ObjectType {
             ObjectType::Sequence => "SEQUENCE",
             ObjectType::Stage => "STAGE",
             ObjectType::Type => "TYPE",
+            ObjectType::User => "USER",
+            ObjectType::Stream => "STREAM",
         })
     }
 }
@@ -6142,17 +8253,29 @@ pub enum SqlOption {
         range_direction: Option<PartitionRangeDirection>,
         for_values: Vec<Expr>,
     },
+    /// Comment parameter (supports `=` and no `=` syntax)
+    Comment(CommentDef),
+    /// MySQL TableSpace option
+    /// <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+    TableSpace(TablespaceOption),
+    /// An option representing a key value pair, where the value is a parenthesized list and with an optional name
+    /// e.g.
+    ///
+    ///   UNION  = (tbl_name\[,tbl_name\]...) <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+    ///   ENGINE = ReplicatedMergeTree('/table_name','{replica}', ver) <https://clickhouse.com/docs/engines/table-engines/mergetree-family/replication>
+    ///   ENGINE = SummingMergeTree(\[columns\]) <https://clickhouse.com/docs/engines/table-engines/mergetree-family/summingmergetree>
+    NamedParenthesizedList(NamedParenthesizedList),
 }
 
 impl fmt::Display for SqlOption {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            SqlOption::Clustered(c) => write!(f, "{}", c),
+            SqlOption::Clustered(c) => write!(f, "{c}"),
             SqlOption::Ident(ident) => {
-                write!(f, "{}", ident)
+                write!(f, "{ident}")
             }
             SqlOption::KeyValue { key: name, value } => {
-                write!(f, "{} = {}", name, value)
+                write!(f, "{name} = {value}")
             }
             SqlOption::Partition {
                 column_name,
@@ -6173,10 +8296,54 @@ impl fmt::Display for SqlOption {
                     display_comma_separated(for_values)
                 )
             }
+            SqlOption::TableSpace(tablespace_option) => {
+                write!(f, "TABLESPACE {}", tablespace_option.name)?;
+                match tablespace_option.storage {
+                    Some(StorageType::Disk) => write!(f, " STORAGE DISK"),
+                    Some(StorageType::Memory) => write!(f, " STORAGE MEMORY"),
+                    None => Ok(()),
+                }
+            }
+            SqlOption::Comment(comment) => match comment {
+                CommentDef::WithEq(comment) => {
+                    write!(f, "COMMENT = '{comment}'")
+                }
+                CommentDef::WithoutEq(comment) => {
+                    write!(f, "COMMENT '{comment}'")
+                }
+            },
+            SqlOption::NamedParenthesizedList(value) => {
+                write!(f, "{} = ", value.key)?;
+                if let Some(key) = &value.name {
+                    write!(f, "{key}")?;
+                }
+                if !value.values.is_empty() {
+                    write!(f, "({})", display_comma_separated(&value.values))?
+                }
+                Ok(())
+            }
         }
     }
 }
 
+#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum StorageType {
+    Disk,
+    Memory,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// MySql TableSpace option
+/// <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+pub struct TablespaceOption {
+    pub name: String,
+    pub storage: Option<StorageType>,
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -6191,6 +8358,70 @@ impl fmt::Display for SecretOption {
     }
 }
 
+/// A `CREATE SERVER` statement.
+///
+/// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createserver.html)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateServerStatement {
+    pub name: ObjectName,
+    pub if_not_exists: bool,
+    pub server_type: Option<Ident>,
+    pub version: Option<Ident>,
+    pub foreign_data_wrapper: ObjectName,
+    pub options: Option<Vec<CreateServerOption>>,
+}
+
+impl fmt::Display for CreateServerStatement {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let CreateServerStatement {
+            name,
+            if_not_exists,
+            server_type,
+            version,
+            foreign_data_wrapper,
+            options,
+        } = self;
+
+        write!(
+            f,
+            "CREATE SERVER {if_not_exists}{name} ",
+            if_not_exists = if *if_not_exists { "IF NOT EXISTS " } else { "" },
+        )?;
+
+        if let Some(st) = server_type {
+            write!(f, "TYPE {st} ")?;
+        }
+
+        if let Some(v) = version {
+            write!(f, "VERSION {v} ")?;
+        }
+
+        write!(f, "FOREIGN DATA WRAPPER {foreign_data_wrapper}")?;
+
+        if let Some(o) = options {
+            write!(f, " OPTIONS ({o})", o = display_comma_separated(o))?;
+        }
+
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateServerOption {
+    pub key: Ident,
+    pub value: Ident,
+}
+
+impl fmt::Display for CreateServerOption {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {}", self.key, self.value)
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -6205,7 +8436,7 @@ impl fmt::Display for AttachDuckDBDatabaseOption {
             AttachDuckDBDatabaseOption::ReadOnly(Some(true)) => write!(f, "READ_ONLY true"),
             AttachDuckDBDatabaseOption::ReadOnly(Some(false)) => write!(f, "READ_ONLY false"),
             AttachDuckDBDatabaseOption::ReadOnly(None) => write!(f, "READ_ONLY"),
-            AttachDuckDBDatabaseOption::Type(t) => write!(f, "TYPE {}", t),
+            AttachDuckDBDatabaseOption::Type(t) => write!(f, "TYPE {t}"),
         }
     }
 }
@@ -6254,6 +8485,7 @@ pub enum TransactionIsolationLevel {
     ReadCommitted,
     RepeatableRead,
     Serializable,
+    Snapshot,
 }
 
 impl fmt::Display for TransactionIsolationLevel {
@@ -6264,13 +8496,15 @@ impl fmt::Display for TransactionIsolationLevel {
             ReadCommitted => "READ COMMITTED",
             RepeatableRead => "REPEATABLE READ",
             Serializable => "SERIALIZABLE",
+            Snapshot => "SNAPSHOT",
         })
     }
 }
 
-/// SQLite specific syntax
+/// Modifier for the transaction in the `BEGIN` syntax
 ///
-/// <https://sqlite.org/lang_transaction.html>
+/// SQLite: <https://sqlite.org/lang_transaction.html>
+/// MS-SQL: <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/try-catch-transact-sql>
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -6278,6 +8512,8 @@ pub enum TransactionModifier {
     Deferred,
     Immediate,
     Exclusive,
+    Try,
+    Catch,
 }
 
 impl fmt::Display for TransactionModifier {
@@ -6287,6 +8523,8 @@ impl fmt::Display for TransactionModifier {
             Deferred => "DEFERRED",
             Immediate => "IMMEDIATE",
             Exclusive => "EXCLUSIVE",
+            Try => "TRY",
+            Catch => "CATCH",
         })
     }
 }
@@ -6418,7 +8656,7 @@ impl fmt::Display for CopyTarget {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         use CopyTarget::*;
         match self {
-            Stdin { .. } => write!(f, "STDIN"),
+            Stdin => write!(f, "STDIN"),
             Stdout => write!(f, "STDOUT"),
             File { filename } => write!(f, "'{}'", value::escape_single_quote_string(filename)),
             Program { command } => write!(
@@ -6746,6 +8984,35 @@ impl Display for MergeClause {
     }
 }
 
+/// A Output Clause in the end of a 'MERGE' Statement
+///
+/// Example:
+/// OUTPUT $action, deleted.* INTO dbo.temp_products;
+/// [mssql](https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct OutputClause {
+    pub select_items: Vec<SelectItem>,
+    pub into_table: SelectInto,
+}
+
+impl fmt::Display for OutputClause {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let OutputClause {
+            select_items,
+            into_table,
+        } = self;
+
+        write!(
+            f,
+            "OUTPUT {} {}",
+            display_comma_separated(select_items),
+            into_table
+        )
+    }
+}
+
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -6823,30 +9090,30 @@ impl fmt::Display for FlushLocation {
     }
 }
 
-/// Optional context modifier for statements that can be or `LOCAL`, or `SESSION`.
+/// Optional context modifier for statements that can be or `LOCAL`, `GLOBAL`, or `SESSION`.
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum ContextModifier {
-    /// No context defined. Each dialect defines the default in this scenario.
-    None,
     /// `LOCAL` identifier, usually related to transactional states.
     Local,
     /// `SESSION` identifier
     Session,
+    /// `GLOBAL` identifier
+    Global,
 }
 
 impl fmt::Display for ContextModifier {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            Self::None => {
-                write!(f, "")
-            }
             Self::Local => {
-                write!(f, " LOCAL")
+                write!(f, "LOCAL ")
             }
             Self::Session => {
-                write!(f, " SESSION")
+                write!(f, "SESSION ")
+            }
+            Self::Global => {
+                write!(f, "GLOBAL ")
             }
         }
     }
@@ -7045,7 +9312,8 @@ impl fmt::Display for FunctionDeterminismSpecifier {
 /// where within the statement, the body shows up.
 ///
 /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11
-/// [Postgres]: https://www.postgresql.org/docs/15/sql-createfunction.html
+/// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
+/// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -7074,6 +9342,22 @@ pub enum CreateFunctionBody {
     ///
     /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_11
     AsAfterOptions(Expr),
+    /// Function body with statements before the `RETURN` keyword.
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE FUNCTION my_scalar_udf(a INT, b INT)
+    /// RETURNS INT
+    /// AS
+    /// BEGIN
+    ///     DECLARE c INT;
+    ///     SET c = a + b;
+    ///     RETURN c;
+    /// END
+    /// ```
+    ///
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
+    AsBeginEnd(BeginEndStatements),
     /// Function body expression using the 'RETURN' keyword.
     ///
     /// Example:
@@ -7083,8 +9367,32 @@ pub enum CreateFunctionBody {
     /// RETURN a + b;
     /// ```
     ///
-    /// [Postgres]: https://www.postgresql.org/docs/current/sql-createfunction.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/current/sql-createfunction.html
     Return(Expr),
+
+    /// Function body expression using the 'AS RETURN' keywords
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE FUNCTION myfunc(a INT, b INT)
+    /// RETURNS TABLE
+    /// AS RETURN (SELECT a + b AS sum);
+    /// ```
+    ///
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
+    AsReturnExpr(Expr),
+
+    /// Function body expression using the 'AS RETURN' keywords, with an un-parenthesized SELECT query
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE FUNCTION myfunc(a INT, b INT)
+    /// RETURNS TABLE
+    /// AS RETURN SELECT a + b AS sum;
+    /// ```
+    ///
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql?view=sql-server-ver16#select_stmt
+    AsReturnSelect(Select),
 }
 
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -7311,38 +9619,100 @@ pub enum MySQLColumnPosition {
 impl Display for MySQLColumnPosition {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            MySQLColumnPosition::First => Ok(write!(f, "FIRST")?),
+            MySQLColumnPosition::First => write!(f, "FIRST"),
             MySQLColumnPosition::After(ident) => {
                 let column_name = &ident.value;
-                Ok(write!(f, "AFTER {column_name}")?)
+                write!(f, "AFTER {column_name}")
             }
         }
     }
 }
 
-/// Engine of DB. Some warehouse has parameters of engine, e.g. [clickhouse]
-///
-/// [clickhouse]: https://clickhouse.com/docs/en/engines/table-engines
+/// MySQL `CREATE VIEW` algorithm parameter: [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
-pub struct TableEngine {
-    pub name: String,
-    pub parameters: Option<Vec<Ident>>,
+pub enum CreateViewAlgorithm {
+    Undefined,
+    Merge,
+    TempTable,
 }
 
-impl Display for TableEngine {
+impl Display for CreateViewAlgorithm {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.name)?;
+        match self {
+            CreateViewAlgorithm::Undefined => write!(f, "UNDEFINED"),
+            CreateViewAlgorithm::Merge => write!(f, "MERGE"),
+            CreateViewAlgorithm::TempTable => write!(f, "TEMPTABLE"),
+        }
+    }
+}
+/// MySQL `CREATE VIEW` security parameter: [SQL SECURITY { DEFINER | INVOKER }]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum CreateViewSecurity {
+    Definer,
+    Invoker,
+}
 
-        if let Some(parameters) = self.parameters.as_ref() {
-            write!(f, "({})", display_comma_separated(parameters))?;
+impl Display for CreateViewSecurity {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            CreateViewSecurity::Definer => write!(f, "DEFINER"),
+            CreateViewSecurity::Invoker => write!(f, "INVOKER"),
         }
+    }
+}
+
+/// [MySQL] `CREATE VIEW` additional parameters
+///
+/// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateViewParams {
+    pub algorithm: Option<CreateViewAlgorithm>,
+    pub definer: Option<GranteeName>,
+    pub security: Option<CreateViewSecurity>,
+}
 
+impl Display for CreateViewParams {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let CreateViewParams {
+            algorithm,
+            definer,
+            security,
+        } = self;
+        if let Some(algorithm) = algorithm {
+            write!(f, "ALGORITHM = {algorithm} ")?;
+        }
+        if let Some(definers) = definer {
+            write!(f, "DEFINER = {definers} ")?;
+        }
+        if let Some(security) = security {
+            write!(f, "SQL SECURITY {security} ")?;
+        }
         Ok(())
     }
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// Key/Value, where the value is a (optionally named) list of identifiers
+///
+/// ```sql
+/// UNION = (tbl_name[,tbl_name]...)
+/// ENGINE = ReplicatedMergeTree('/table_name','{replica}', ver)
+/// ENGINE = SummingMergeTree([columns])
+/// ```
+pub struct NamedParenthesizedList {
+    pub key: Ident,
+    pub name: Option<Ident>,
+    pub values: Vec<Ident>,
+}
+
 /// Snowflake `WITH ROW ACCESS POLICY policy_name ON (identifier, ...)`
 ///
 /// <https://docs.snowflake.com/en/sql-reference/sql/create-table>
@@ -7379,19 +9749,36 @@ impl Display for RowAccessPolicy {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Tag {
-    pub key: Ident,
+    pub key: ObjectName,
     pub value: String,
 }
 
 impl Tag {
-    pub fn new(key: Ident, value: String) -> Self {
+    pub fn new(key: ObjectName, value: String) -> Self {
         Self { key, value }
     }
 }
 
-impl Display for Tag {
+impl Display for Tag {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}='{}'", self.key, self.value)
+    }
+}
+
+/// Snowflake `WITH CONTACT ( purpose = contact [ , purpose = contact ...] )`
+///
+/// <https://docs.snowflake.com/en/sql-reference/sql/create-database>
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ContactEntry {
+    pub purpose: String,
+    pub contact: String,
+}
+
+impl Display for ContactEntry {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "{}='{}'", self.key, self.value)
+        write!(f, "{} = {}", self.purpose, self.contact)
     }
 }
 
@@ -7404,18 +9791,12 @@ pub enum CommentDef {
     /// Does not include `=` when printing the comment, as `COMMENT 'comment'`
     WithEq(String),
     WithoutEq(String),
-    // For Hive dialect, the table comment is after the column definitions without `=`,
-    // so we need to add an extra variant to allow to identify this case when displaying.
-    // [Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable)
-    AfterColumnDefsWithoutEq(String),
 }
 
 impl Display for CommentDef {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match self {
-            CommentDef::WithEq(comment)
-            | CommentDef::WithoutEq(comment)
-            | CommentDef::AfterColumnDefsWithoutEq(comment) => write!(f, "{comment}"),
+            CommentDef::WithEq(comment) | CommentDef::WithoutEq(comment) => write!(f, "{comment}"),
         }
     }
 }
@@ -7481,7 +9862,7 @@ where
 /// ```sql
 /// EXPLAIN (ANALYZE, VERBOSE TRUE, FORMAT TEXT) SELECT * FROM my_table;
 ///
-/// VACCUM (VERBOSE, ANALYZE ON, PARALLEL 10) my_table;
+/// VACUUM (VERBOSE, ANALYZE ON, PARALLEL 10) my_table;
 /// ```
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -7587,6 +9968,7 @@ impl fmt::Display for ShowStatementInParentType {
 pub struct ShowStatementIn {
     pub clause: ShowStatementInClause,
     pub parent_type: Option<ShowStatementInParentType>,
+    #[cfg_attr(feature = "visitor", visit(with = "visit_relation"))]
     pub parent_name: Option<ObjectName>,
 }
 
@@ -7594,15 +9976,49 @@ impl fmt::Display for ShowStatementIn {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "{}", self.clause)?;
         if let Some(parent_type) = &self.parent_type {
-            write!(f, " {}", parent_type)?;
+            write!(f, " {parent_type}")?;
         }
         if let Some(parent_name) = &self.parent_name {
-            write!(f, " {}", parent_name)?;
+            write!(f, " {parent_name}")?;
+        }
+        Ok(())
+    }
+}
+
+/// A Show Charset statement
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ShowCharset {
+    /// The statement can be written as `SHOW CHARSET` or `SHOW CHARACTER SET`
+    /// true means CHARSET was used and false means CHARACTER SET was used
+    pub is_shorthand: bool,
+    pub filter: Option<ShowStatementFilter>,
+}
+
+impl fmt::Display for ShowCharset {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "SHOW")?;
+        if self.is_shorthand {
+            write!(f, " CHARSET")?;
+        } else {
+            write!(f, " CHARACTER SET")?;
+        }
+        if self.filter.is_some() {
+            write!(f, " {}", self.filter.as_ref().unwrap())?;
         }
         Ok(())
     }
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ShowObjects {
+    pub terse: bool,
+    pub show_options: ShowStatementOptions,
+}
+
 /// MSSQL's json null clause
 ///
 /// ```plaintext
@@ -7629,8 +10045,404 @@ impl Display for JsonNullClause {
     }
 }
 
+/// rename object definition
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct RenameTable {
+    pub old_name: ObjectName,
+    pub new_name: ObjectName,
+}
+
+impl fmt::Display for RenameTable {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} TO {}", self.old_name, self.new_name)?;
+        Ok(())
+    }
+}
+
+/// Represents the referenced table in an `INSERT INTO` statement
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableObject {
+    /// Table specified by name.
+    /// Example:
+    /// ```sql
+    /// INSERT INTO my_table
+    /// ```
+    TableName(#[cfg_attr(feature = "visitor", visit(with = "visit_relation"))] ObjectName),
+
+    /// Table specified as a function.
+    /// Example:
+    /// ```sql
+    /// INSERT INTO TABLE FUNCTION remote('localhost', default.simple_table)
+    /// ```
+    /// [Clickhouse](https://clickhouse.com/docs/en/sql-reference/table-functions)
+    TableFunction(Function),
+}
+
+impl fmt::Display for TableObject {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            Self::TableName(table_name) => write!(f, "{table_name}"),
+            Self::TableFunction(func) => write!(f, "FUNCTION {func}"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SetSessionParamKind {
+    Generic(SetSessionParamGeneric),
+    IdentityInsert(SetSessionParamIdentityInsert),
+    Offsets(SetSessionParamOffsets),
+    Statistics(SetSessionParamStatistics),
+}
+
+impl fmt::Display for SetSessionParamKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            SetSessionParamKind::Generic(x) => write!(f, "{x}"),
+            SetSessionParamKind::IdentityInsert(x) => write!(f, "{x}"),
+            SetSessionParamKind::Offsets(x) => write!(f, "{x}"),
+            SetSessionParamKind::Statistics(x) => write!(f, "{x}"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct SetSessionParamGeneric {
+    pub names: Vec<String>,
+    pub value: String,
+}
+
+impl fmt::Display for SetSessionParamGeneric {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {}", display_comma_separated(&self.names), self.value)
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct SetSessionParamIdentityInsert {
+    pub obj: ObjectName,
+    pub value: SessionParamValue,
+}
+
+impl fmt::Display for SetSessionParamIdentityInsert {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "IDENTITY_INSERT {} {}", self.obj, self.value)
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct SetSessionParamOffsets {
+    pub keywords: Vec<String>,
+    pub value: SessionParamValue,
+}
+
+impl fmt::Display for SetSessionParamOffsets {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(
+            f,
+            "OFFSETS {} {}",
+            display_comma_separated(&self.keywords),
+            self.value
+        )
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct SetSessionParamStatistics {
+    pub topic: SessionParamStatsTopic,
+    pub value: SessionParamValue,
+}
+
+impl fmt::Display for SetSessionParamStatistics {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "STATISTICS {} {}", self.topic, self.value)
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SessionParamStatsTopic {
+    IO,
+    Profile,
+    Time,
+    Xml,
+}
+
+impl fmt::Display for SessionParamStatsTopic {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            SessionParamStatsTopic::IO => write!(f, "IO"),
+            SessionParamStatsTopic::Profile => write!(f, "PROFILE"),
+            SessionParamStatsTopic::Time => write!(f, "TIME"),
+            SessionParamStatsTopic::Xml => write!(f, "XML"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SessionParamValue {
+    On,
+    Off,
+}
+
+impl fmt::Display for SessionParamValue {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            SessionParamValue::On => write!(f, "ON"),
+            SessionParamValue::Off => write!(f, "OFF"),
+        }
+    }
+}
+
+/// Snowflake StorageSerializationPolicy for Iceberg Tables
+/// ```sql
+/// [ STORAGE_SERIALIZATION_POLICY = { COMPATIBLE | OPTIMIZED } ]
+/// ```
+///
+/// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum StorageSerializationPolicy {
+    Compatible,
+    Optimized,
+}
+
+impl Display for StorageSerializationPolicy {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            StorageSerializationPolicy::Compatible => write!(f, "COMPATIBLE"),
+            StorageSerializationPolicy::Optimized => write!(f, "OPTIMIZED"),
+        }
+    }
+}
+
+/// Snowflake CatalogSyncNamespaceMode
+/// ```sql
+/// [ CATALOG_SYNC_NAMESPACE_MODE = { NEST | FLATTEN } ]
+/// ```
+///
+/// <https://docs.snowflake.com/en/sql-reference/sql/create-database>
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum CatalogSyncNamespaceMode {
+    Nest,
+    Flatten,
+}
+
+impl Display for CatalogSyncNamespaceMode {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            CatalogSyncNamespaceMode::Nest => write!(f, "NEST"),
+            CatalogSyncNamespaceMode::Flatten => write!(f, "FLATTEN"),
+        }
+    }
+}
+
+/// Variants of the Snowflake `COPY INTO` statement
+#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum CopyIntoSnowflakeKind {
+    /// Loads data from files to a table
+    /// See: <https://docs.snowflake.com/en/sql-reference/sql/copy-into-table>
+    Table,
+    /// Unloads data from a table or query to external files
+    /// See: <https://docs.snowflake.com/en/sql-reference/sql/copy-into-location>
+    Location,
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct PrintStatement {
+    pub message: Box<Expr>,
+}
+
+impl fmt::Display for PrintStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "PRINT {}", self.message)
+    }
+}
+
+/// Represents a `Return` statement.
+///
+/// [MsSql triggers](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql)
+/// [MsSql functions](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ReturnStatement {
+    pub value: Option<ReturnStatementValue>,
+}
+
+impl fmt::Display for ReturnStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match &self.value {
+            Some(ReturnStatementValue::Expr(expr)) => write!(f, "RETURN {expr}"),
+            None => write!(f, "RETURN"),
+        }
+    }
+}
+
+/// Variants of a `RETURN` statement
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum ReturnStatementValue {
+    Expr(Expr),
+}
+
+/// Represents an `OPEN` statement.
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct OpenStatement {
+    /// Cursor name
+    pub cursor_name: Ident,
+}
+
+impl fmt::Display for OpenStatement {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "OPEN {}", self.cursor_name)
+    }
+}
+
+/// Specifies Include / Exclude NULL within UNPIVOT command.
+/// For example
+/// `UNPIVOT (column1 FOR new_column IN (col3, col4, col5, col6))`
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum NullInclusion {
+    IncludeNulls,
+    ExcludeNulls,
+}
+
+impl fmt::Display for NullInclusion {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            NullInclusion::IncludeNulls => write!(f, "INCLUDE NULLS"),
+            NullInclusion::ExcludeNulls => write!(f, "EXCLUDE NULLS"),
+        }
+    }
+}
+
+/// Checks membership of a value in a JSON array
+///
+/// Syntax:
+/// ```sql
+/// <value> MEMBER OF(<array>)
+/// ```
+/// [MySQL](https://dev.mysql.com/doc/refman/8.4/en/json-search-functions.html#operator_member-of)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct MemberOf {
+    pub value: Box<Expr>,
+    pub array: Box<Expr>,
+}
+
+impl fmt::Display for MemberOf {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} MEMBER OF({})", self.value, self.array)
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ExportData {
+    pub options: Vec<SqlOption>,
+    pub query: Box<Query>,
+    pub connection: Option<ObjectName>,
+}
+
+impl fmt::Display for ExportData {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        if let Some(connection) = &self.connection {
+            write!(
+                f,
+                "EXPORT DATA WITH CONNECTION {connection} OPTIONS({}) AS {}",
+                display_comma_separated(&self.options),
+                self.query
+            )
+        } else {
+            write!(
+                f,
+                "EXPORT DATA OPTIONS({}) AS {}",
+                display_comma_separated(&self.options),
+                self.query
+            )
+        }
+    }
+}
+/// Creates a user
+///
+/// Syntax:
+/// ```sql
+/// CREATE [OR REPLACE] USER [IF NOT EXISTS] <name> [OPTIONS]
+/// ```
+///
+/// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/create-user)
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct CreateUser {
+    pub or_replace: bool,
+    pub if_not_exists: bool,
+    pub name: Ident,
+    pub options: KeyValueOptions,
+    pub with_tags: bool,
+    pub tags: KeyValueOptions,
+}
+
+impl fmt::Display for CreateUser {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "CREATE")?;
+        if self.or_replace {
+            write!(f, " OR REPLACE")?;
+        }
+        write!(f, " USER")?;
+        if self.if_not_exists {
+            write!(f, " IF NOT EXISTS")?;
+        }
+        write!(f, " {}", self.name)?;
+        if !self.options.options.is_empty() {
+            write!(f, " {}", self.options)?;
+        }
+        if !self.tags.options.is_empty() {
+            if self.with_tags {
+                write!(f, " WITH")?;
+            }
+            write!(f, " TAG ({})", self.tags)?;
+        }
+        Ok(())
+    }
+}
+
 #[cfg(test)]
 mod tests {
+    use crate::tokenizer::Location;
+
     use super::*;
 
     #[test]
@@ -7728,9 +10540,9 @@ mod tests {
     #[test]
     fn test_interval_display() {
         let interval = Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                "123:45.67",
-            )))),
+            value: Box::new(Expr::Value(
+                Value::SingleQuotedString(String::from("123:45.67")).with_empty_span(),
+            )),
             leading_field: Some(DateTimeField::Minute),
             leading_precision: Some(10),
             last_field: Some(DateTimeField::Second),
@@ -7742,7 +10554,9 @@ mod tests {
         );
 
         let interval = Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from("5")))),
+            value: Box::new(Expr::Value(
+                Value::SingleQuotedString(String::from("5")).with_empty_span(),
+            )),
             leading_field: Some(DateTimeField::Second),
             leading_precision: Some(1),
             last_field: None,
@@ -7924,4 +10738,16 @@ mod tests {
         test_steps(OneOrManyWithParens::Many(vec![2]), vec![2], 3);
         test_steps(OneOrManyWithParens::Many(vec![3, 4]), vec![3, 4], 4);
     }
+
+    // Tests that the position in the code of an `Ident` does not affect its
+    // ordering.
+    #[test]
+    fn test_ident_ord() {
+        let mut a = Ident::with_span(Span::new(Location::new(1, 1), Location::new(1, 1)), "a");
+        let mut b = Ident::with_span(Span::new(Location::new(2, 2), Location::new(2, 2)), "b");
+
+        assert!(a < b);
+        std::mem::swap(&mut a.span, &mut b.span);
+        assert!(a < b);
+    }
 }
diff --git a/src/ast/operator.rs b/src/ast/operator.rs
index e44ea2bf4..d0bb05e3c 100644
--- a/src/ast/operator.rs
+++ b/src/ast/operator.rs
@@ -53,6 +53,21 @@ pub enum UnaryOperator {
     PGAbs,
     /// Unary logical not operator: e.g. `! false` (Hive-specific)
     BangNot,
+    /// `#` Number of points in path or polygon (PostgreSQL/Redshift geometric operator)
+    /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    Hash,
+    /// `@-@` Length or circumference (PostgreSQL/Redshift geometric operator)
+    /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    AtDashAt,
+    /// `@@` Center (PostgreSQL/Redshift geometric operator)
+    /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    DoubleAt,
+    /// `?-` Is horizontal? (PostgreSQL/Redshift geometric operator)
+    /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionDash,
+    /// `?|` Is vertical? (PostgreSQL/Redshift geometric operator)
+    /// see <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionPipe,
 }
 
 impl fmt::Display for UnaryOperator {
@@ -68,6 +83,11 @@ impl fmt::Display for UnaryOperator {
             UnaryOperator::PGPrefixFactorial => "!!",
             UnaryOperator::PGAbs => "@",
             UnaryOperator::BangNot => "!",
+            UnaryOperator::Hash => "#",
+            UnaryOperator::AtDashAt => "@-@",
+            UnaryOperator::DoubleAt => "@@",
+            UnaryOperator::QuestionDash => "?-",
+            UnaryOperator::QuestionPipe => "?|",
         })
     }
 }
@@ -119,6 +139,11 @@ pub enum BinaryOperator {
     DuckIntegerDivide,
     /// MySQL [`DIV`](https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html) integer division
     MyIntegerDivide,
+    /// MATCH operator, e.g. `a MATCH b` (SQLite-specific)
+    /// See <https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_match_and_extract_operators>
+    Match,
+    /// REGEXP operator, e.g. `a REGEXP b` (SQLite-specific)
+    Regexp,
     /// Support for custom operators (such as Postgres custom operators)
     Custom(String),
     /// Bitwise XOR, e.g. `a # b` (PostgreSQL-specific)
@@ -248,6 +273,62 @@ pub enum BinaryOperator {
     /// See [CREATE OPERATOR](https://www.postgresql.org/docs/current/sql-createoperator.html)
     /// for more information.
     PGCustomBinaryOperator(Vec<String>),
+    /// The `OVERLAPS` operator
+    ///
+    /// Specifies a test for an overlap between two datetime periods:
+    /// <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#overlaps-predicate>
+    Overlaps,
+    /// `##` Point of closest proximity (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    DoubleHash,
+    /// `<->` Distance between (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    LtDashGt,
+    /// `&<` Overlaps to left? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    AndLt,
+    /// `&>` Overlaps to right? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    AndGt,
+    /// `<<|` Is strictly below? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    LtLtPipe,
+    /// `|>>` Is strictly above? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    PipeGtGt,
+    /// `&<|` Does not extend above? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    AndLtPipe,
+    /// `|&>` Does not extend below? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    PipeAndGt,
+    /// `<^` Is below? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    LtCaret,
+    /// `>^` Is above? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    GtCaret,
+    /// `?#` Intersects? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionHash,
+    /// `?-` Is horizontal? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionDash,
+    /// `?-|` Is perpendicular? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionDashPipe,
+    /// `?||` Are Parallel? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    QuestionDoublePipe,
+    /// `@` Contained or on? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    At,
+    /// `~=` Same as? (PostgreSQL/Redshift geometric operator)
+    /// See <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    TildeEq,
+    /// ':=' Assignment Operator
+    /// See <https://dev.mysql.com/doc/refman/8.4/en/assignment-operators.html#operator_assign-value>
+    Assignment,
 }
 
 impl fmt::Display for BinaryOperator {
@@ -274,6 +355,8 @@ impl fmt::Display for BinaryOperator {
             BinaryOperator::BitwiseXor => f.write_str("^"),
             BinaryOperator::DuckIntegerDivide => f.write_str("//"),
             BinaryOperator::MyIntegerDivide => f.write_str("DIV"),
+            BinaryOperator::Match => f.write_str("MATCH"),
+            BinaryOperator::Regexp => f.write_str("REGEXP"),
             BinaryOperator::Custom(s) => f.write_str(s),
             BinaryOperator::PGBitwiseXor => f.write_str("#"),
             BinaryOperator::PGBitwiseShiftLeft => f.write_str("<<"),
@@ -304,6 +387,24 @@ impl fmt::Display for BinaryOperator {
             BinaryOperator::PGCustomBinaryOperator(idents) => {
                 write!(f, "OPERATOR({})", display_separated(idents, "."))
             }
+            BinaryOperator::Overlaps => f.write_str("OVERLAPS"),
+            BinaryOperator::DoubleHash => f.write_str("##"),
+            BinaryOperator::LtDashGt => f.write_str("<->"),
+            BinaryOperator::AndLt => f.write_str("&<"),
+            BinaryOperator::AndGt => f.write_str("&>"),
+            BinaryOperator::LtLtPipe => f.write_str("<<|"),
+            BinaryOperator::PipeGtGt => f.write_str("|>>"),
+            BinaryOperator::AndLtPipe => f.write_str("&<|"),
+            BinaryOperator::PipeAndGt => f.write_str("|&>"),
+            BinaryOperator::LtCaret => f.write_str("<^"),
+            BinaryOperator::GtCaret => f.write_str(">^"),
+            BinaryOperator::QuestionHash => f.write_str("?#"),
+            BinaryOperator::QuestionDash => f.write_str("?-"),
+            BinaryOperator::QuestionDashPipe => f.write_str("?-|"),
+            BinaryOperator::QuestionDoublePipe => f.write_str("?||"),
+            BinaryOperator::At => f.write_str("@"),
+            BinaryOperator::TildeEq => f.write_str("~="),
+            BinaryOperator::Assignment => f.write_str(":="),
         }
     }
 }
diff --git a/src/ast/query.rs b/src/ast/query.rs
index 078bbc841..ea641deba 100644
--- a/src/ast/query.rs
+++ b/src/ast/query.rs
@@ -18,13 +18,18 @@
 #[cfg(not(feature = "std"))]
 use alloc::{boxed::Box, vec::Vec};
 
+use helpers::attached_token::AttachedToken;
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
 
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
-use crate::ast::*;
+use crate::{
+    ast::*,
+    display_utils::{indented_list, SpaceOrNewline},
+    tokenizer::{Token, TokenWithSpan},
+};
 
 /// The most complete variant of a `SELECT` query expression, optionally
 /// including `WITH`, `UNION` / other set operations, and `ORDER BY`.
@@ -39,14 +44,8 @@ pub struct Query {
     pub body: Box<SetExpr>,
     /// ORDER BY
     pub order_by: Option<OrderBy>,
-    /// `LIMIT { <N> | ALL }`
-    pub limit: Option<Expr>,
-
-    /// `LIMIT { <N> } BY { <expr>,<expr>,... } }`
-    pub limit_by: Vec<Expr>,
-
-    /// `OFFSET <N> [ { ROW | ROWS } ]`
-    pub offset: Option<Offset>,
+    /// `LIMIT ... OFFSET ... | LIMIT <offset>, <limit>`
+    pub limit_clause: Option<LimitClause>,
     /// `FETCH { FIRST | NEXT } <N> [ PERCENT ] { ROW | ROWS } | { ONLY | WITH TIES }`
     pub fetch: Option<Fetch>,
     /// `FOR { UPDATE | SHARE } [ OF table_name ] [ SKIP LOCKED | NOWAIT ]`
@@ -64,40 +63,49 @@ pub struct Query {
     /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/select/format)
     /// (ClickHouse-specific)
     pub format_clause: Option<FormatClause>,
+
+    /// Pipe operator
+    pub pipe_operators: Vec<PipeOperator>,
 }
 
 impl fmt::Display for Query {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if let Some(ref with) = self.with {
-            write!(f, "{with} ")?;
+            with.fmt(f)?;
+            SpaceOrNewline.fmt(f)?;
         }
-        write!(f, "{}", self.body)?;
+        self.body.fmt(f)?;
         if let Some(ref order_by) = self.order_by {
-            write!(f, " {order_by}")?;
+            f.write_str(" ")?;
+            order_by.fmt(f)?;
         }
-        if let Some(ref limit) = self.limit {
-            write!(f, " LIMIT {limit}")?;
-        }
-        if let Some(ref offset) = self.offset {
-            write!(f, " {offset}")?;
-        }
-        if !self.limit_by.is_empty() {
-            write!(f, " BY {}", display_separated(&self.limit_by, ", "))?;
+
+        if let Some(ref limit_clause) = self.limit_clause {
+            limit_clause.fmt(f)?;
         }
         if let Some(ref settings) = self.settings {
-            write!(f, " SETTINGS {}", display_comma_separated(settings))?;
+            f.write_str(" SETTINGS ")?;
+            display_comma_separated(settings).fmt(f)?;
         }
         if let Some(ref fetch) = self.fetch {
-            write!(f, " {fetch}")?;
+            f.write_str(" ")?;
+            fetch.fmt(f)?;
         }
         if !self.locks.is_empty() {
-            write!(f, " {}", display_separated(&self.locks, " "))?;
+            f.write_str(" ")?;
+            display_separated(&self.locks, " ").fmt(f)?;
         }
         if let Some(ref for_clause) = self.for_clause {
-            write!(f, " {}", for_clause)?;
+            f.write_str(" ")?;
+            for_clause.fmt(f)?;
         }
         if let Some(ref format) = self.format_clause {
-            write!(f, " {}", format)?;
+            f.write_str(" ")?;
+            format.fmt(f)?;
+        }
+        for pipe_operator in &self.pipe_operators {
+            f.write_str(" |> ")?;
+            pipe_operator.fmt(f)?;
         }
         Ok(())
     }
@@ -152,6 +160,7 @@ pub enum SetExpr {
     Values(Values),
     Insert(Statement),
     Update(Statement),
+    Delete(Statement),
     Table(Box<Table>),
 }
 
@@ -169,28 +178,39 @@ impl SetExpr {
 impl fmt::Display for SetExpr {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            SetExpr::Select(s) => write!(f, "{s}"),
-            SetExpr::Query(q) => write!(f, "({q})"),
-            SetExpr::Values(v) => write!(f, "{v}"),
-            SetExpr::Insert(v) => write!(f, "{v}"),
-            SetExpr::Update(v) => write!(f, "{v}"),
-            SetExpr::Table(t) => write!(f, "{t}"),
+            SetExpr::Select(s) => s.fmt(f),
+            SetExpr::Query(q) => {
+                f.write_str("(")?;
+                q.fmt(f)?;
+                f.write_str(")")
+            }
+            SetExpr::Values(v) => v.fmt(f),
+            SetExpr::Insert(v) => v.fmt(f),
+            SetExpr::Update(v) => v.fmt(f),
+            SetExpr::Delete(v) => v.fmt(f),
+            SetExpr::Table(t) => t.fmt(f),
             SetExpr::SetOperation {
                 left,
                 right,
                 op,
                 set_quantifier,
             } => {
-                write!(f, "{left} {op}")?;
+                left.fmt(f)?;
+                SpaceOrNewline.fmt(f)?;
+                op.fmt(f)?;
                 match set_quantifier {
                     SetQuantifier::All
                     | SetQuantifier::Distinct
                     | SetQuantifier::ByName
                     | SetQuantifier::AllByName
-                    | SetQuantifier::DistinctByName => write!(f, " {set_quantifier}")?,
-                    SetQuantifier::None => write!(f, "{set_quantifier}")?,
+                    | SetQuantifier::DistinctByName => {
+                        f.write_str(" ")?;
+                        set_quantifier.fmt(f)?;
+                    }
+                    SetQuantifier::None => {}
                 }
-                write!(f, " {right}")?;
+                SpaceOrNewline.fmt(f)?;
+                right.fmt(f)?;
                 Ok(())
             }
         }
@@ -204,6 +224,7 @@ pub enum SetOperator {
     Union,
     Except,
     Intersect,
+    Minus,
 }
 
 impl fmt::Display for SetOperator {
@@ -212,6 +233,7 @@ impl fmt::Display for SetOperator {
             SetOperator::Union => "UNION",
             SetOperator::Except => "EXCEPT",
             SetOperator::Intersect => "INTERSECT",
+            SetOperator::Minus => "MINUS",
         })
     }
 }
@@ -239,7 +261,7 @@ impl fmt::Display for SetQuantifier {
             SetQuantifier::ByName => write!(f, "BY NAME"),
             SetQuantifier::AllByName => write!(f, "ALL BY NAME"),
             SetQuantifier::DistinctByName => write!(f, "DISTINCT BY NAME"),
-            SetQuantifier::None => write!(f, ""),
+            SetQuantifier::None => Ok(()),
         }
     }
 }
@@ -269,6 +291,19 @@ impl fmt::Display for Table {
     }
 }
 
+/// What did this select look like?
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SelectFlavor {
+    /// `SELECT *`
+    Standard,
+    /// `FROM ... SELECT *`
+    FromFirst,
+    /// `FROM *`
+    FromFirstNoSelect,
+}
+
 /// A restricted variant of `SELECT` (without CTEs/`ORDER BY`), which may
 /// appear either as the only body item of a `Query`, or as an operand
 /// to a set operation like `UNION`.
@@ -276,6 +311,9 @@ impl fmt::Display for Table {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Select {
+    /// Token for the `SELECT` keyword
+    pub select_token: AttachedToken,
+    /// `SELECT [DISTINCT] ...`
     pub distinct: Option<Distinct>,
     /// MSSQL syntax: `TOP (<N>) [ PERCENT ] [ WITH TIES ]`
     pub top: Option<Top>,
@@ -283,6 +321,11 @@ pub struct Select {
     pub top_before_distinct: bool,
     /// projection expressions
     pub projection: Vec<SelectItem>,
+    /// Excluded columns from the projection expression which are not specified
+    /// directly after a wildcard.
+    ///
+    /// [Redshift](https://docs.aws.amazon.com/redshift/latest/dg/r_EXCLUDE_list.html)
+    pub exclude: Option<ExcludeSelectItem>,
     /// INTO
     pub into: Option<SelectInto>,
     /// FROM
@@ -303,7 +346,7 @@ pub struct Select {
     /// DISTRIBUTE BY (Hive)
     pub distribute_by: Vec<Expr>,
     /// SORT BY (Hive)
-    pub sort_by: Vec<Expr>,
+    pub sort_by: Vec<OrderByExpr>,
     /// HAVING
     pub having: Option<Expr>,
     /// WINDOW AS
@@ -319,95 +362,145 @@ pub struct Select {
     pub value_table_mode: Option<ValueTableMode>,
     /// STARTING WITH .. CONNECT BY
     pub connect_by: Option<ConnectBy>,
+    /// Was this a FROM-first query?
+    pub flavor: SelectFlavor,
 }
 
 impl fmt::Display for Select {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "SELECT")?;
+        match self.flavor {
+            SelectFlavor::Standard => {
+                write!(f, "SELECT")?;
+            }
+            SelectFlavor::FromFirst => {
+                write!(f, "FROM {} SELECT", display_comma_separated(&self.from))?;
+            }
+            SelectFlavor::FromFirstNoSelect => {
+                write!(f, "FROM {}", display_comma_separated(&self.from))?;
+            }
+        }
 
         if let Some(value_table_mode) = self.value_table_mode {
-            write!(f, " {value_table_mode}")?;
+            f.write_str(" ")?;
+            value_table_mode.fmt(f)?;
         }
 
         if let Some(ref top) = self.top {
             if self.top_before_distinct {
-                write!(f, " {top}")?;
+                f.write_str(" ")?;
+                top.fmt(f)?;
             }
         }
         if let Some(ref distinct) = self.distinct {
-            write!(f, " {distinct}")?;
+            f.write_str(" ")?;
+            distinct.fmt(f)?;
         }
         if let Some(ref top) = self.top {
             if !self.top_before_distinct {
-                write!(f, " {top}")?;
+                f.write_str(" ")?;
+                top.fmt(f)?;
             }
         }
 
-        write!(f, " {}", display_comma_separated(&self.projection))?;
+        if !self.projection.is_empty() {
+            indented_list(f, &self.projection)?;
+        }
+
+        if let Some(exclude) = &self.exclude {
+            write!(f, " {exclude}")?;
+        }
 
         if let Some(ref into) = self.into {
-            write!(f, " {into}")?;
+            f.write_str(" ")?;
+            into.fmt(f)?;
         }
 
-        if !self.from.is_empty() {
-            write!(f, " FROM {}", display_comma_separated(&self.from))?;
+        if self.flavor == SelectFlavor::Standard && !self.from.is_empty() {
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("FROM")?;
+            indented_list(f, &self.from)?;
         }
         if !self.lateral_views.is_empty() {
             for lv in &self.lateral_views {
-                write!(f, "{lv}")?;
+                lv.fmt(f)?;
             }
         }
         if let Some(ref prewhere) = self.prewhere {
-            write!(f, " PREWHERE {prewhere}")?;
+            f.write_str(" PREWHERE ")?;
+            prewhere.fmt(f)?;
         }
         if let Some(ref selection) = self.selection {
-            write!(f, " WHERE {selection}")?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("WHERE")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(selection).fmt(f)?;
         }
         match &self.group_by {
-            GroupByExpr::All(_) => write!(f, " {}", self.group_by)?,
+            GroupByExpr::All(_) => {
+                SpaceOrNewline.fmt(f)?;
+                self.group_by.fmt(f)?;
+            }
             GroupByExpr::Expressions(exprs, _) => {
                 if !exprs.is_empty() {
-                    write!(f, " {}", self.group_by)?
+                    SpaceOrNewline.fmt(f)?;
+                    self.group_by.fmt(f)?;
                 }
             }
         }
         if !self.cluster_by.is_empty() {
-            write!(
-                f,
-                " CLUSTER BY {}",
-                display_comma_separated(&self.cluster_by)
-            )?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("CLUSTER BY")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(display_comma_separated(&self.cluster_by)).fmt(f)?;
         }
         if !self.distribute_by.is_empty() {
-            write!(
-                f,
-                " DISTRIBUTE BY {}",
-                display_comma_separated(&self.distribute_by)
-            )?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("DISTRIBUTE BY")?;
+            SpaceOrNewline.fmt(f)?;
+            display_comma_separated(&self.distribute_by).fmt(f)?;
         }
         if !self.sort_by.is_empty() {
-            write!(f, " SORT BY {}", display_comma_separated(&self.sort_by))?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("SORT BY")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(display_comma_separated(&self.sort_by)).fmt(f)?;
         }
         if let Some(ref having) = self.having {
-            write!(f, " HAVING {having}")?;
+            SpaceOrNewline.fmt(f)?;
+            f.write_str("HAVING")?;
+            SpaceOrNewline.fmt(f)?;
+            Indent(having).fmt(f)?;
         }
         if self.window_before_qualify {
             if !self.named_window.is_empty() {
-                write!(f, " WINDOW {}", display_comma_separated(&self.named_window))?;
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("WINDOW")?;
+                SpaceOrNewline.fmt(f)?;
+                display_comma_separated(&self.named_window).fmt(f)?;
             }
             if let Some(ref qualify) = self.qualify {
-                write!(f, " QUALIFY {qualify}")?;
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("QUALIFY")?;
+                SpaceOrNewline.fmt(f)?;
+                qualify.fmt(f)?;
             }
         } else {
             if let Some(ref qualify) = self.qualify {
-                write!(f, " QUALIFY {qualify}")?;
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("QUALIFY")?;
+                SpaceOrNewline.fmt(f)?;
+                qualify.fmt(f)?;
             }
             if !self.named_window.is_empty() {
-                write!(f, " WINDOW {}", display_comma_separated(&self.named_window))?;
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("WINDOW")?;
+                SpaceOrNewline.fmt(f)?;
+                display_comma_separated(&self.named_window).fmt(f)?;
             }
         }
         if let Some(ref connect_by) = self.connect_by {
-            write!(f, " {connect_by}")?;
+            SpaceOrNewline.fmt(f)?;
+            connect_by.fmt(f)?;
         }
         Ok(())
     }
@@ -505,18 +598,20 @@ impl fmt::Display for NamedWindowDefinition {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct With {
+    /// Token for the "WITH" keyword
+    pub with_token: AttachedToken,
     pub recursive: bool,
     pub cte_tables: Vec<Cte>,
 }
 
 impl fmt::Display for With {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(
-            f,
-            "WITH {}{}",
-            if self.recursive { "RECURSIVE " } else { "" },
-            display_comma_separated(&self.cte_tables)
-        )
+        f.write_str("WITH ")?;
+        if self.recursive {
+            f.write_str("RECURSIVE ")?;
+        }
+        display_comma_separated(&self.cte_tables).fmt(f)?;
+        Ok(())
     }
 }
 
@@ -556,13 +651,31 @@ pub struct Cte {
     pub query: Box<Query>,
     pub from: Option<Ident>,
     pub materialized: Option<CteAsMaterialized>,
+    /// Token for the closing parenthesis
+    pub closing_paren_token: AttachedToken,
 }
 
 impl fmt::Display for Cte {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self.materialized.as_ref() {
-            None => write!(f, "{} AS ({})", self.alias, self.query)?,
-            Some(materialized) => write!(f, "{} AS {materialized} ({})", self.alias, self.query)?,
+            None => {
+                self.alias.fmt(f)?;
+                f.write_str(" AS (")?;
+                NewLine.fmt(f)?;
+                Indent(&self.query).fmt(f)?;
+                NewLine.fmt(f)?;
+                f.write_str(")")?;
+            }
+            Some(materialized) => {
+                self.alias.fmt(f)?;
+                f.write_str(" AS ")?;
+                materialized.fmt(f)?;
+                f.write_str(" (")?;
+                NewLine.fmt(f)?;
+                Indent(&self.query).fmt(f)?;
+                NewLine.fmt(f)?;
+                f.write_str(")")?;
+            }
         };
         if let Some(ref fr) = self.from {
             write!(f, " FROM {fr}")?;
@@ -571,6 +684,20 @@ impl fmt::Display for Cte {
     }
 }
 
+/// Represents an expression behind a wildcard expansion in a projection.
+/// `SELECT T.* FROM T;
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum SelectItemQualifiedWildcardKind {
+    /// Expression is an object name.
+    /// e.g. `alias.*` or even `schema.table.*`
+    ObjectName(ObjectName),
+    /// Select star on an arbitrary expression.
+    /// e.g. `STRUCT<STRING>('foo').*`
+    Expr(Expr),
+}
+
 /// One item of the comma-separated list following `SELECT`
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -580,12 +707,24 @@ pub enum SelectItem {
     UnnamedExpr(Expr),
     /// An expression, followed by `[ AS ] alias`
     ExprWithAlias { expr: Expr, alias: Ident },
-    /// `alias.*` or even `schema.table.*`
-    QualifiedWildcard(ObjectName, WildcardAdditionalOptions),
+    /// An expression, followed by a wildcard expansion.
+    /// e.g. `alias.*`, `STRUCT<STRING>('foo').*`
+    QualifiedWildcard(SelectItemQualifiedWildcardKind, WildcardAdditionalOptions),
     /// An unqualified `*`
     Wildcard(WildcardAdditionalOptions),
 }
 
+impl fmt::Display for SelectItemQualifiedWildcardKind {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match &self {
+            SelectItemQualifiedWildcardKind::ObjectName(object_name) => {
+                write!(f, "{object_name}.*")
+            }
+            SelectItemQualifiedWildcardKind::Expr(expr) => write!(f, "{expr}.*"),
+        }
+    }
+}
+
 /// Single aliased identifier
 ///
 /// # Syntax
@@ -607,10 +746,12 @@ impl fmt::Display for IdentWithAlias {
 }
 
 /// Additional options for wildcards, e.g. Snowflake `EXCLUDE`/`RENAME` and Bigquery `EXCEPT`.
-#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Default)]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct WildcardAdditionalOptions {
+    /// The wildcard token `*`
+    pub wildcard_token: AttachedToken,
     /// `[ILIKE...]`.
     ///  Snowflake syntax: <https://docs.snowflake.com/en/sql-reference/sql/select#parameters>
     pub opt_ilike: Option<IlikeSelectItem>,
@@ -628,6 +769,19 @@ pub struct WildcardAdditionalOptions {
     pub opt_rename: Option<RenameSelectItem>,
 }
 
+impl Default for WildcardAdditionalOptions {
+    fn default() -> Self {
+        Self {
+            wildcard_token: TokenWithSpan::wrap(Token::Mul).into(),
+            opt_ilike: None,
+            opt_exclude: None,
+            opt_except: None,
+            opt_replace: None,
+            opt_rename: None,
+        }
+    }
+}
+
 impl fmt::Display for WildcardAdditionalOptions {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if let Some(ilike) = &self.opt_ilike {
@@ -834,18 +988,21 @@ impl fmt::Display for ReplaceSelectElement {
 
 impl fmt::Display for SelectItem {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use core::fmt::Write;
         match &self {
-            SelectItem::UnnamedExpr(expr) => write!(f, "{expr}"),
-            SelectItem::ExprWithAlias { expr, alias } => write!(f, "{expr} AS {alias}"),
-            SelectItem::QualifiedWildcard(prefix, additional_options) => {
-                write!(f, "{prefix}.*")?;
-                write!(f, "{additional_options}")?;
-                Ok(())
+            SelectItem::UnnamedExpr(expr) => expr.fmt(f),
+            SelectItem::ExprWithAlias { expr, alias } => {
+                expr.fmt(f)?;
+                f.write_str(" AS ")?;
+                alias.fmt(f)
+            }
+            SelectItem::QualifiedWildcard(kind, additional_options) => {
+                kind.fmt(f)?;
+                additional_options.fmt(f)
             }
             SelectItem::Wildcard(additional_options) => {
-                write!(f, "*")?;
-                write!(f, "{additional_options}")?;
-                Ok(())
+                f.write_char('*')?;
+                additional_options.fmt(f)
             }
         }
     }
@@ -861,9 +1018,10 @@ pub struct TableWithJoins {
 
 impl fmt::Display for TableWithJoins {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.relation)?;
+        self.relation.fmt(f)?;
         for join in &self.joins {
-            write!(f, "{join}")?;
+            SpaceOrNewline.fmt(f)?;
+            join.fmt(f)?;
         }
         Ok(())
     }
@@ -898,7 +1056,7 @@ impl fmt::Display for ConnectBy {
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Setting {
     pub key: Ident,
-    pub value: Value,
+    pub value: Expr,
 }
 
 impl fmt::Display for Setting {
@@ -932,6 +1090,26 @@ impl fmt::Display for ExprWithAlias {
     }
 }
 
+/// An expression optionally followed by an alias and order by options.
+///
+/// Example:
+/// ```sql
+/// 42 AS myint ASC
+/// ```
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ExprWithAliasAndOrderBy {
+    pub expr: ExprWithAlias,
+    pub order_by: OrderByOptions,
+}
+
+impl fmt::Display for ExprWithAliasAndOrderBy {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}{}", self.expr, self.order_by)
+    }
+}
+
 /// Arguments to a table-valued function
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -945,6 +1123,81 @@ pub struct TableFunctionArgs {
     pub settings: Option<Vec<Setting>>,
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableIndexHintType {
+    Use,
+    Ignore,
+    Force,
+}
+
+impl fmt::Display for TableIndexHintType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            TableIndexHintType::Use => "USE",
+            TableIndexHintType::Ignore => "IGNORE",
+            TableIndexHintType::Force => "FORCE",
+        })
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableIndexType {
+    Index,
+    Key,
+}
+
+impl fmt::Display for TableIndexType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            TableIndexType::Index => "INDEX",
+            TableIndexType::Key => "KEY",
+        })
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableIndexHintForClause {
+    Join,
+    OrderBy,
+    GroupBy,
+}
+
+impl fmt::Display for TableIndexHintForClause {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        f.write_str(match self {
+            TableIndexHintForClause::Join => "JOIN",
+            TableIndexHintForClause::OrderBy => "ORDER BY",
+            TableIndexHintForClause::GroupBy => "GROUP BY",
+        })
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TableIndexHints {
+    pub hint_type: TableIndexHintType,
+    pub index_type: TableIndexType,
+    pub for_clause: Option<TableIndexHintForClause>,
+    pub index_names: Vec<Ident>,
+}
+
+impl fmt::Display for TableIndexHints {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} {} ", self.hint_type, self.index_type)?;
+        if let Some(for_clause) = &self.for_clause {
+            write!(f, "FOR {for_clause} ")?;
+        }
+        write!(f, "({})", display_comma_separated(&self.index_names))
+    }
+}
+
 /// A table name or a parenthesized subquery with an optional alias
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -974,6 +1227,14 @@ pub enum TableFactor {
         with_ordinality: bool,
         /// [Partition selection](https://dev.mysql.com/doc/refman/8.0/en/partitioning-selection.html), supported by MySQL.
         partitions: Vec<Ident>,
+        /// Optional PartiQL JsonPath: <https://partiql.org/dql/from.html>
+        json_path: Option<JsonPath>,
+        /// Optional table sample modifier
+        /// See: <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#sample-clause>
+        sample: Option<TableSampleKind>,
+        /// Optional index hints(mysql)
+        /// See: <https://dev.mysql.com/doc/refman/8.4/en/index-hints.html>
+        index_hints: Vec<TableIndexHints>,
     },
     Derived {
         lateral: bool,
@@ -1084,15 +1345,17 @@ pub enum TableFactor {
     ///
     /// Syntax:
     /// ```sql
-    /// table UNPIVOT(value FOR name IN (column1, [ column2, ... ])) [ alias ]
+    /// table UNPIVOT [ { INCLUDE | EXCLUDE } NULLS ] (value FOR name IN (column1, [ column2, ... ])) [ alias ]
     /// ```
     ///
     /// See <https://docs.snowflake.com/en/sql-reference/constructs/unpivot>.
+    /// See <https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-syntax-qry-select-unpivot>.
     Unpivot {
         table: Box<TableFactor>,
-        value: Ident,
+        value: Expr,
         name: Ident,
-        columns: Vec<Ident>,
+        columns: Vec<ExprWithAlias>,
+        null_inclusion: Option<NullInclusion>,
         alias: Option<TableAlias>,
     },
     /// A `MATCH_RECOGNIZE` operation on a table.
@@ -1116,6 +1379,214 @@ pub enum TableFactor {
         symbols: Vec<SymbolDefinition>,
         alias: Option<TableAlias>,
     },
+    /// The `XMLTABLE` table-valued function.
+    /// Part of the SQL standard, supported by PostgreSQL, Oracle, and DB2.
+    ///
+    /// <https://www.postgresql.org/docs/15/functions-xml.html#FUNCTIONS-XML-PROCESSING>
+    ///
+    /// ```sql
+    /// SELECT xmltable.*
+    /// FROM xmldata,
+    /// XMLTABLE('//ROWS/ROW'
+    ///     PASSING data
+    ///     COLUMNS id int PATH '@id',
+    ///     ordinality FOR ORDINALITY,
+    ///     "COUNTRY_NAME" text,
+    ///     country_id text PATH 'COUNTRY_ID',
+    ///     size_sq_km float PATH 'SIZE[@unit = "sq_km"]',
+    ///     size_other text PATH 'concat(SIZE[@unit!="sq_km"], " ", SIZE[@unit!="sq_km"]/@unit)',
+    ///     premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'
+    /// );
+    /// ````
+    XmlTable {
+        /// Optional XMLNAMESPACES clause (empty if not present)
+        namespaces: Vec<XmlNamespaceDefinition>,
+        /// The row-generating XPath expression.
+        row_expression: Expr,
+        /// The PASSING clause specifying the document expression.
+        passing: XmlPassingClause,
+        /// The columns to be extracted from each generated row.
+        columns: Vec<XmlTableColumn>,
+        /// The alias for the table.
+        alias: Option<TableAlias>,
+    },
+}
+
+/// The table sample modifier options
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableSampleKind {
+    /// Table sample located before the table alias option
+    BeforeTableAlias(Box<TableSample>),
+    /// Table sample located after the table alias option
+    AfterTableAlias(Box<TableSample>),
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TableSample {
+    pub modifier: TableSampleModifier,
+    pub name: Option<TableSampleMethod>,
+    pub quantity: Option<TableSampleQuantity>,
+    pub seed: Option<TableSampleSeed>,
+    pub bucket: Option<TableSampleBucket>,
+    pub offset: Option<Expr>,
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableSampleModifier {
+    Sample,
+    TableSample,
+}
+
+impl fmt::Display for TableSampleModifier {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            TableSampleModifier::Sample => write!(f, "SAMPLE")?,
+            TableSampleModifier::TableSample => write!(f, "TABLESAMPLE")?,
+        }
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TableSampleQuantity {
+    pub parenthesized: bool,
+    pub value: Expr,
+    pub unit: Option<TableSampleUnit>,
+}
+
+impl fmt::Display for TableSampleQuantity {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if self.parenthesized {
+            write!(f, "(")?;
+        }
+        write!(f, "{}", self.value)?;
+        if let Some(unit) = &self.unit {
+            write!(f, " {unit}")?;
+        }
+        if self.parenthesized {
+            write!(f, ")")?;
+        }
+        Ok(())
+    }
+}
+
+/// The table sample method names
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableSampleMethod {
+    Row,
+    Bernoulli,
+    System,
+    Block,
+}
+
+impl fmt::Display for TableSampleMethod {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            TableSampleMethod::Bernoulli => write!(f, "BERNOULLI"),
+            TableSampleMethod::Row => write!(f, "ROW"),
+            TableSampleMethod::System => write!(f, "SYSTEM"),
+            TableSampleMethod::Block => write!(f, "BLOCK"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TableSampleSeed {
+    pub modifier: TableSampleSeedModifier,
+    pub value: Value,
+}
+
+impl fmt::Display for TableSampleSeed {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{} ({})", self.modifier, self.value)?;
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableSampleSeedModifier {
+    Repeatable,
+    Seed,
+}
+
+impl fmt::Display for TableSampleSeedModifier {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            TableSampleSeedModifier::Repeatable => write!(f, "REPEATABLE"),
+            TableSampleSeedModifier::Seed => write!(f, "SEED"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum TableSampleUnit {
+    Rows,
+    Percent,
+}
+
+impl fmt::Display for TableSampleUnit {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            TableSampleUnit::Percent => write!(f, "PERCENT"),
+            TableSampleUnit::Rows => write!(f, "ROWS"),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TableSampleBucket {
+    pub bucket: Value,
+    pub total: Value,
+    pub on: Option<Expr>,
+}
+
+impl fmt::Display for TableSampleBucket {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "BUCKET {} OUT OF {}", self.bucket, self.total)?;
+        if let Some(on) = &self.on {
+            write!(f, " ON {on}")?;
+        }
+        Ok(())
+    }
+}
+impl fmt::Display for TableSample {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}", self.modifier)?;
+        if let Some(name) = &self.name {
+            write!(f, " {name}")?;
+        }
+        if let Some(quantity) = &self.quantity {
+            write!(f, " {quantity}")?;
+        }
+        if let Some(seed) = &self.seed {
+            write!(f, " {seed}")?;
+        }
+        if let Some(bucket) = &self.bucket {
+            write!(f, " ({bucket})")?;
+        }
+        if let Some(offset) = &self.offset {
+            write!(f, " OFFSET {offset}")?;
+        }
+        Ok(())
+    }
 }
 
 /// The source of values in a `PIVOT` operation.
@@ -1190,7 +1661,7 @@ impl fmt::Display for RowsPerMatch {
             RowsPerMatch::AllRows(mode) => {
                 write!(f, "ALL ROWS PER MATCH")?;
                 if let Some(mode) = mode {
-                    write!(f, " {}", mode)?;
+                    write!(f, " {mode}")?;
                 }
                 Ok(())
             }
@@ -1316,7 +1787,7 @@ impl fmt::Display for MatchRecognizePattern {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         use MatchRecognizePattern::*;
         match self {
-            Symbol(symbol) => write!(f, "{}", symbol),
+            Symbol(symbol) => write!(f, "{symbol}"),
             Exclude(symbol) => write!(f, "{{- {symbol} -}}"),
             Permute(symbols) => write!(f, "PERMUTE({})", display_comma_separated(symbols)),
             Concat(patterns) => write!(f, "{}", display_separated(patterns, " ")),
@@ -1375,8 +1846,14 @@ impl fmt::Display for TableFactor {
                 version,
                 partitions,
                 with_ordinality,
+                json_path,
+                sample,
+                index_hints,
             } => {
-                write!(f, "{name}")?;
+                name.fmt(f)?;
+                if let Some(json_path) = json_path {
+                    json_path.fmt(f)?;
+                }
                 if !partitions.is_empty() {
                     write!(f, "PARTITION ({})", display_comma_separated(partitions))?;
                 }
@@ -1394,15 +1871,24 @@ impl fmt::Display for TableFactor {
                 if *with_ordinality {
                     write!(f, " WITH ORDINALITY")?;
                 }
+                if let Some(TableSampleKind::BeforeTableAlias(sample)) = sample {
+                    write!(f, " {sample}")?;
+                }
                 if let Some(alias) = alias {
                     write!(f, " AS {alias}")?;
                 }
+                if !index_hints.is_empty() {
+                    write!(f, " {}", display_separated(index_hints, " "))?;
+                }
                 if !with_hints.is_empty() {
                     write!(f, " WITH ({})", display_comma_separated(with_hints))?;
                 }
                 if let Some(version) = version {
                     write!(f, "{version}")?;
                 }
+                if let Some(TableSampleKind::AfterTableAlias(sample)) = sample {
+                    write!(f, " {sample}")?;
+                }
                 Ok(())
             }
             TableFactor::Derived {
@@ -1413,7 +1899,11 @@ impl fmt::Display for TableFactor {
                 if *lateral {
                     write!(f, "LATERAL ")?;
                 }
-                write!(f, "({subquery})")?;
+                f.write_str("(")?;
+                NewLine.fmt(f)?;
+                Indent(subquery).fmt(f)?;
+                NewLine.fmt(f)?;
+                f.write_str(")")?;
                 if let Some(alias) = alias {
                     write!(f, " AS {alias}")?;
                 }
@@ -1536,15 +2026,19 @@ impl fmt::Display for TableFactor {
             }
             TableFactor::Unpivot {
                 table,
+                null_inclusion,
                 value,
                 name,
                 columns,
                 alias,
             } => {
+                write!(f, "{table} UNPIVOT")?;
+                if let Some(null_inclusion) = null_inclusion {
+                    write!(f, " {null_inclusion} ")?;
+                }
                 write!(
                     f,
-                    "{} UNPIVOT({} FOR {} IN ({}))",
-                    table,
+                    "({} FOR {} IN ({}))",
                     value,
                     name,
                     display_comma_separated(columns)
@@ -1588,6 +2082,31 @@ impl fmt::Display for TableFactor {
                 }
                 Ok(())
             }
+            TableFactor::XmlTable {
+                row_expression,
+                passing,
+                columns,
+                alias,
+                namespaces,
+            } => {
+                write!(f, "XMLTABLE(")?;
+                if !namespaces.is_empty() {
+                    write!(
+                        f,
+                        "XMLNAMESPACES({}), ",
+                        display_comma_separated(namespaces)
+                    )?;
+                }
+                write!(
+                    f,
+                    "{row_expression}{passing} COLUMNS {columns})",
+                    columns = display_comma_separated(columns)
+                )?;
+                if let Some(alias) = alias {
+                    write!(f, " AS {alias}")?;
+                }
+                Ok(())
+            }
         }
     }
 }
@@ -1639,7 +2158,7 @@ impl fmt::Display for TableAliasColumnDef {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "{}", self.name)?;
         if let Some(ref data_type) = self.data_type {
-            write!(f, " {}", data_type)?;
+            write!(f, " {data_type}")?;
         }
         Ok(())
     }
@@ -1649,13 +2168,19 @@ impl fmt::Display for TableAliasColumnDef {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum TableVersion {
+    /// When the table version is defined using `FOR SYSTEM_TIME AS OF`.
+    /// For example: `SELECT * FROM tbl FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)`
     ForSystemTimeAsOf(Expr),
+    /// When the table version is defined using a function.
+    /// For example: `SELECT * FROM tbl AT(TIMESTAMP => '2020-08-14 09:30:00')`
+    Function(Expr),
 }
 
 impl Display for TableVersion {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
             TableVersion::ForSystemTimeAsOf(e) => write!(f, " FOR SYSTEM_TIME AS OF {e}")?,
+            TableVersion::Function(func) => write!(f, " {func}")?,
         }
         Ok(())
     }
@@ -1682,7 +2207,7 @@ impl fmt::Display for Join {
         }
         fn suffix(constraint: &'_ JoinConstraint) -> impl fmt::Display + '_ {
             struct Suffix<'a>(&'a JoinConstraint);
-            impl<'a> fmt::Display for Suffix<'a> {
+            impl fmt::Display for Suffix<'_> {
                 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
                     match self.0 {
                         JoinConstraint::On(expr) => write!(f, " ON {expr}"),
@@ -1696,92 +2221,104 @@ impl fmt::Display for Join {
             Suffix(constraint)
         }
         if self.global {
-            write!(f, " GLOBAL")?;
+            write!(f, "GLOBAL ")?;
         }
 
         match &self.join_operator {
-            JoinOperator::Inner(constraint) => write!(
-                f,
-                " {}JOIN {}{}",
+            JoinOperator::Join(constraint) => f.write_fmt(format_args!(
+                "{}JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::LeftOuter(constraint) => write!(
-                f,
-                " {}LEFT JOIN {}{}",
+            )),
+            JoinOperator::Inner(constraint) => f.write_fmt(format_args!(
+                "{}INNER JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::RightOuter(constraint) => write!(
-                f,
-                " {}RIGHT JOIN {}{}",
+            )),
+            JoinOperator::Left(constraint) => f.write_fmt(format_args!(
+                "{}LEFT JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::FullOuter(constraint) => write!(
-                f,
-                " {}FULL JOIN {}{}",
+            )),
+            JoinOperator::LeftOuter(constraint) => f.write_fmt(format_args!(
+                "{}LEFT OUTER JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::CrossJoin => write!(f, " CROSS JOIN {}", self.relation),
-            JoinOperator::Semi(constraint) => write!(
-                f,
-                " {}SEMI JOIN {}{}",
+            )),
+            JoinOperator::Right(constraint) => f.write_fmt(format_args!(
+                "{}RIGHT JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::LeftSemi(constraint) => write!(
-                f,
-                " {}LEFT SEMI JOIN {}{}",
+            )),
+            JoinOperator::RightOuter(constraint) => f.write_fmt(format_args!(
+                "{}RIGHT OUTER JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::RightSemi(constraint) => write!(
-                f,
-                " {}RIGHT SEMI JOIN {}{}",
+            )),
+            JoinOperator::FullOuter(constraint) => f.write_fmt(format_args!(
+                "{}FULL JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::Anti(constraint) => write!(
-                f,
-                " {}ANTI JOIN {}{}",
+            )),
+            JoinOperator::CrossJoin => f.write_fmt(format_args!("CROSS JOIN {}", self.relation)),
+            JoinOperator::Semi(constraint) => f.write_fmt(format_args!(
+                "{}SEMI JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::LeftAnti(constraint) => write!(
-                f,
-                " {}LEFT ANTI JOIN {}{}",
+            )),
+            JoinOperator::LeftSemi(constraint) => f.write_fmt(format_args!(
+                "{}LEFT SEMI JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::RightAnti(constraint) => write!(
-                f,
-                " {}RIGHT ANTI JOIN {}{}",
+            )),
+            JoinOperator::RightSemi(constraint) => f.write_fmt(format_args!(
+                "{}RIGHT SEMI JOIN {}{}",
+                prefix(constraint),
+                self.relation,
+                suffix(constraint)
+            )),
+            JoinOperator::Anti(constraint) => f.write_fmt(format_args!(
+                "{}ANTI JOIN {}{}",
+                prefix(constraint),
+                self.relation,
+                suffix(constraint)
+            )),
+            JoinOperator::LeftAnti(constraint) => f.write_fmt(format_args!(
+                "{}LEFT ANTI JOIN {}{}",
+                prefix(constraint),
+                self.relation,
+                suffix(constraint)
+            )),
+            JoinOperator::RightAnti(constraint) => f.write_fmt(format_args!(
+                "{}RIGHT ANTI JOIN {}{}",
                 prefix(constraint),
                 self.relation,
                 suffix(constraint)
-            ),
-            JoinOperator::CrossApply => write!(f, " CROSS APPLY {}", self.relation),
-            JoinOperator::OuterApply => write!(f, " OUTER APPLY {}", self.relation),
+            )),
+            JoinOperator::CrossApply => f.write_fmt(format_args!("CROSS APPLY {}", self.relation)),
+            JoinOperator::OuterApply => f.write_fmt(format_args!("OUTER APPLY {}", self.relation)),
             JoinOperator::AsOf {
                 match_condition,
                 constraint,
-            } => write!(
-                f,
-                " ASOF JOIN {} MATCH_CONDITION ({match_condition}){}",
+            } => f.write_fmt(format_args!(
+                "ASOF JOIN {} MATCH_CONDITION ({match_condition}){}",
+                self.relation,
+                suffix(constraint)
+            )),
+            JoinOperator::StraightJoin(constraint) => f.write_fmt(format_args!(
+                "STRAIGHT_JOIN {}{}",
                 self.relation,
                 suffix(constraint)
-            ),
+            )),
         }
     }
 }
@@ -1790,8 +2327,11 @@ impl fmt::Display for Join {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum JoinOperator {
+    Join(JoinConstraint),
     Inner(JoinConstraint),
+    Left(JoinConstraint),
     LeftOuter(JoinConstraint),
+    Right(JoinConstraint),
     RightOuter(JoinConstraint),
     FullOuter(JoinConstraint),
     CrossJoin,
@@ -1819,6 +2359,10 @@ pub enum JoinOperator {
         match_condition: Expr,
         constraint: JoinConstraint,
     },
+    /// STRAIGHT_JOIN (non-standard)
+    ///
+    /// See <https://dev.mysql.com/doc/refman/8.4/en/join.html>.
+    StraightJoin(JoinConstraint),
 }
 
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -1826,35 +2370,55 @@ pub enum JoinOperator {
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum JoinConstraint {
     On(Expr),
-    Using(Vec<Ident>),
+    Using(Vec<ObjectName>),
     Natural,
     None,
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum OrderByKind {
+    /// ALL syntax of [DuckDB] and [ClickHouse].
+    ///
+    /// [DuckDB]:  <https://duckdb.org/docs/sql/query_syntax/orderby>
+    /// [ClickHouse]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by>
+    All(OrderByOptions),
+
+    /// Expressions
+    Expressions(Vec<OrderByExpr>),
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct OrderBy {
-    pub exprs: Vec<OrderByExpr>,
+    pub kind: OrderByKind,
+
     /// Optional: `INTERPOLATE`
     /// Supported by [ClickHouse syntax]
-    ///
-    /// [ClickHouse syntax]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by#order-by-expr-with-fill-modifier>
     pub interpolate: Option<Interpolate>,
 }
 
 impl fmt::Display for OrderBy {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "ORDER BY")?;
-        if !self.exprs.is_empty() {
-            write!(f, " {}", display_comma_separated(&self.exprs))?;
+        match &self.kind {
+            OrderByKind::Expressions(exprs) => {
+                write!(f, " {}", display_comma_separated(exprs))?;
+            }
+            OrderByKind::All(all) => {
+                write!(f, " ALL{all}")?;
+            }
         }
+
         if let Some(ref interpolate) = self.interpolate {
             match &interpolate.exprs {
                 Some(exprs) => write!(f, " INTERPOLATE ({})", display_comma_separated(exprs))?,
                 None => write!(f, " INTERPOLATE")?,
             }
         }
+
         Ok(())
     }
 }
@@ -1865,10 +2429,7 @@ impl fmt::Display for OrderBy {
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct OrderByExpr {
     pub expr: Expr,
-    /// Optional `ASC` or `DESC`
-    pub asc: Option<bool>,
-    /// Optional `NULLS FIRST` or `NULLS LAST`
-    pub nulls_first: Option<bool>,
+    pub options: OrderByOptions,
     /// Optional: `WITH FILL`
     /// Supported by [ClickHouse syntax]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by#order-by-expr-with-fill-modifier>
     pub with_fill: Option<WithFill>,
@@ -1876,19 +2437,9 @@ pub struct OrderByExpr {
 
 impl fmt::Display for OrderByExpr {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.expr)?;
-        match self.asc {
-            Some(true) => write!(f, " ASC")?,
-            Some(false) => write!(f, " DESC")?,
-            None => (),
-        }
-        match self.nulls_first {
-            Some(true) => write!(f, " NULLS FIRST")?,
-            Some(false) => write!(f, " NULLS LAST")?,
-            None => (),
-        }
+        write!(f, "{}{}", self.expr, self.options)?;
         if let Some(ref with_fill) = self.with_fill {
-            write!(f, " {}", with_fill)?
+            write!(f, " {with_fill}")?
         }
         Ok(())
     }
@@ -1911,13 +2462,13 @@ impl fmt::Display for WithFill {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "WITH FILL")?;
         if let Some(ref from) = self.from {
-            write!(f, " FROM {}", from)?;
+            write!(f, " FROM {from}")?;
         }
         if let Some(ref to) = self.to {
-            write!(f, " TO {}", to)?;
+            write!(f, " TO {to}")?;
         }
         if let Some(ref step) = self.step {
-            write!(f, " STEP {}", step)?;
+            write!(f, " STEP {step}")?;
         }
         Ok(())
     }
@@ -1946,12 +2497,90 @@ impl fmt::Display for InterpolateExpr {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "{}", self.column)?;
         if let Some(ref expr) = self.expr {
-            write!(f, " AS {}", expr)?;
+            write!(f, " AS {expr}")?;
+        }
+        Ok(())
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct OrderByOptions {
+    /// Optional `ASC` or `DESC`
+    pub asc: Option<bool>,
+    /// Optional `NULLS FIRST` or `NULLS LAST`
+    pub nulls_first: Option<bool>,
+}
+
+impl fmt::Display for OrderByOptions {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.asc {
+            Some(true) => write!(f, " ASC")?,
+            Some(false) => write!(f, " DESC")?,
+            None => (),
+        }
+        match self.nulls_first {
+            Some(true) => write!(f, " NULLS FIRST")?,
+            Some(false) => write!(f, " NULLS LAST")?,
+            None => (),
         }
         Ok(())
     }
 }
 
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum LimitClause {
+    /// Standard SQL syntax
+    ///
+    /// `LIMIT <limit> [BY <expr>,<expr>,...] [OFFSET <offset>]`
+    LimitOffset {
+        /// `LIMIT { <N> | ALL }`
+        limit: Option<Expr>,
+        /// `OFFSET <N> [ { ROW | ROWS } ]`
+        offset: Option<Offset>,
+        /// `BY { <expr>,<expr>,... } }`
+        ///
+        /// [ClickHouse](https://clickhouse.com/docs/sql-reference/statements/select/limit-by)
+        limit_by: Vec<Expr>,
+    },
+    /// [MySQL]-specific syntax; the order of expressions is reversed.
+    ///
+    /// `LIMIT <offset>, <limit>`
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/select.html
+    OffsetCommaLimit { offset: Expr, limit: Expr },
+}
+
+impl fmt::Display for LimitClause {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            LimitClause::LimitOffset {
+                limit,
+                limit_by,
+                offset,
+            } => {
+                if let Some(ref limit) = limit {
+                    write!(f, " LIMIT {limit}")?;
+                }
+                if let Some(ref offset) = offset {
+                    write!(f, " {offset}")?;
+                }
+                if !limit_by.is_empty() {
+                    debug_assert!(limit.is_some());
+                    write!(f, " BY {}", display_separated(limit_by, ", "))?;
+                }
+                Ok(())
+            }
+            LimitClause::OffsetCommaLimit { offset, limit } => {
+                write!(f, " LIMIT {offset}, {limit}")
+            }
+        }
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -1987,6 +2616,296 @@ impl fmt::Display for OffsetRows {
     }
 }
 
+/// Pipe syntax, first introduced in Google BigQuery.
+/// Example:
+///
+/// ```sql
+/// FROM Produce
+/// |> WHERE sales > 0
+/// |> AGGREGATE SUM(sales) AS total_sales, COUNT(*) AS num_sales
+///    GROUP BY item;
+/// ```
+///
+/// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#pipe_syntax>
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum PipeOperator {
+    /// Limits the number of rows to return in a query, with an optional OFFSET clause to skip over rows.
+    ///
+    /// Syntax: `|> LIMIT <n> [OFFSET <m>]`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#limit_pipe_operator>
+    Limit { expr: Expr, offset: Option<Expr> },
+    /// Filters the results of the input table.
+    ///
+    /// Syntax: `|> WHERE <condition>`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#where_pipe_operator>
+    Where { expr: Expr },
+    /// `ORDER BY <expr> [ASC|DESC], ...`
+    OrderBy { exprs: Vec<OrderByExpr> },
+    /// Produces a new table with the listed columns, similar to the outermost SELECT clause in a table subquery in standard syntax.
+    ///
+    /// Syntax `|> SELECT <expr> [[AS] alias], ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#select_pipe_operator>
+    Select { exprs: Vec<SelectItem> },
+    /// Propagates the existing table and adds computed columns, similar to SELECT *, new_column in standard syntax.
+    ///
+    /// Syntax: `|> EXTEND <expr> [[AS] alias], ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#extend_pipe_operator>
+    Extend { exprs: Vec<SelectItem> },
+    /// Replaces the value of a column in the current table, similar to SELECT * REPLACE (expression AS column) in standard syntax.
+    ///
+    /// Syntax: `|> SET <column> = <expression>, ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#set_pipe_operator>
+    Set { assignments: Vec<Assignment> },
+    /// Removes listed columns from the current table, similar to SELECT * EXCEPT (column) in standard syntax.
+    ///
+    /// Syntax: `|> DROP <column>, ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#drop_pipe_operator>
+    Drop { columns: Vec<Ident> },
+    /// Introduces a table alias for the input table, similar to applying the AS alias clause on a table subquery in standard syntax.
+    ///
+    /// Syntax: `|> AS <alias>`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#as_pipe_operator>
+    As { alias: Ident },
+    /// Performs aggregation on data across grouped rows or an entire table.
+    ///
+    /// Syntax: `|> AGGREGATE <agg_expr> [[AS] alias], ...`
+    ///
+    /// Syntax:
+    /// ```norust
+    /// |> AGGREGATE [<agg_expr> [[AS] alias], ...]
+    /// GROUP BY <grouping_expr> [AS alias], ...
+    /// ```
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#aggregate_pipe_operator>
+    Aggregate {
+        full_table_exprs: Vec<ExprWithAliasAndOrderBy>,
+        group_by_expr: Vec<ExprWithAliasAndOrderBy>,
+    },
+    /// Selects a random sample of rows from the input table.
+    /// Syntax: `|> TABLESAMPLE SYSTEM (10 PERCENT)
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#tablesample_pipe_operator>
+    TableSample { sample: Box<TableSample> },
+    /// Renames columns in the input table.
+    ///
+    /// Syntax: `|> RENAME old_name AS new_name, ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#rename_pipe_operator>
+    Rename { mappings: Vec<IdentWithAlias> },
+    /// Combines the input table with one or more tables using UNION.
+    ///
+    /// Syntax: `|> UNION [ALL|DISTINCT] (<query>), (<query>), ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#union_pipe_operator>
+    Union {
+        set_quantifier: SetQuantifier,
+        queries: Vec<Query>,
+    },
+    /// Returns only the rows that are present in both the input table and the specified tables.
+    ///
+    /// Syntax: `|> INTERSECT [DISTINCT] (<query>), (<query>), ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#intersect_pipe_operator>
+    Intersect {
+        set_quantifier: SetQuantifier,
+        queries: Vec<Query>,
+    },
+    /// Returns only the rows that are present in the input table but not in the specified tables.
+    ///
+    /// Syntax: `|> EXCEPT DISTINCT (<query>), (<query>), ...`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#except_pipe_operator>
+    Except {
+        set_quantifier: SetQuantifier,
+        queries: Vec<Query>,
+    },
+    /// Calls a table function or procedure that returns a table.
+    ///
+    /// Syntax: `|> CALL function_name(args) [AS alias]`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#call_pipe_operator>
+    Call {
+        function: Function,
+        alias: Option<Ident>,
+    },
+    /// Pivots data from rows to columns.
+    ///
+    /// Syntax: `|> PIVOT(aggregate_function(column) FOR pivot_column IN (value1, value2, ...)) [AS alias]`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#pivot_pipe_operator>
+    Pivot {
+        aggregate_functions: Vec<ExprWithAlias>,
+        value_column: Vec<Ident>,
+        value_source: PivotValueSource,
+        alias: Option<Ident>,
+    },
+    /// The `UNPIVOT` pipe operator transforms columns into rows.
+    ///
+    /// Syntax:
+    /// ```sql
+    /// |> UNPIVOT(value_column FOR name_column IN (column1, column2, ...)) [alias]
+    /// ```
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#unpivot_pipe_operator>
+    Unpivot {
+        value_column: Ident,
+        name_column: Ident,
+        unpivot_columns: Vec<Ident>,
+        alias: Option<Ident>,
+    },
+    /// Joins the input table with another table.
+    ///
+    /// Syntax: `|> [JOIN_TYPE] JOIN <table> [alias] ON <condition>` or `|> [JOIN_TYPE] JOIN <table> [alias] USING (<columns>)`
+    ///
+    /// See more at <https://cloud.google.com/bigquery/docs/reference/standard-sql/pipe-syntax#join_pipe_operator>
+    Join(Join),
+}
+
+impl fmt::Display for PipeOperator {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            PipeOperator::Select { exprs } => {
+                write!(f, "SELECT {}", display_comma_separated(exprs.as_slice()))
+            }
+            PipeOperator::Extend { exprs } => {
+                write!(f, "EXTEND {}", display_comma_separated(exprs.as_slice()))
+            }
+            PipeOperator::Set { assignments } => {
+                write!(f, "SET {}", display_comma_separated(assignments.as_slice()))
+            }
+            PipeOperator::Drop { columns } => {
+                write!(f, "DROP {}", display_comma_separated(columns.as_slice()))
+            }
+            PipeOperator::As { alias } => {
+                write!(f, "AS {alias}")
+            }
+            PipeOperator::Limit { expr, offset } => {
+                write!(f, "LIMIT {expr}")?;
+                if let Some(offset) = offset {
+                    write!(f, " OFFSET {offset}")?;
+                }
+                Ok(())
+            }
+            PipeOperator::Aggregate {
+                full_table_exprs,
+                group_by_expr,
+            } => {
+                write!(f, "AGGREGATE")?;
+                if !full_table_exprs.is_empty() {
+                    write!(
+                        f,
+                        " {}",
+                        display_comma_separated(full_table_exprs.as_slice())
+                    )?;
+                }
+                if !group_by_expr.is_empty() {
+                    write!(f, " GROUP BY {}", display_comma_separated(group_by_expr))?;
+                }
+                Ok(())
+            }
+
+            PipeOperator::Where { expr } => {
+                write!(f, "WHERE {expr}")
+            }
+            PipeOperator::OrderBy { exprs } => {
+                write!(f, "ORDER BY {}", display_comma_separated(exprs.as_slice()))
+            }
+
+            PipeOperator::TableSample { sample } => {
+                write!(f, "{sample}")
+            }
+            PipeOperator::Rename { mappings } => {
+                write!(f, "RENAME {}", display_comma_separated(mappings))
+            }
+            PipeOperator::Union {
+                set_quantifier,
+                queries,
+            } => Self::fmt_set_operation(f, "UNION", set_quantifier, queries),
+            PipeOperator::Intersect {
+                set_quantifier,
+                queries,
+            } => Self::fmt_set_operation(f, "INTERSECT", set_quantifier, queries),
+            PipeOperator::Except {
+                set_quantifier,
+                queries,
+            } => Self::fmt_set_operation(f, "EXCEPT", set_quantifier, queries),
+            PipeOperator::Call { function, alias } => {
+                write!(f, "CALL {function}")?;
+                Self::fmt_optional_alias(f, alias)
+            }
+            PipeOperator::Pivot {
+                aggregate_functions,
+                value_column,
+                value_source,
+                alias,
+            } => {
+                write!(
+                    f,
+                    "PIVOT({} FOR {} IN ({}))",
+                    display_comma_separated(aggregate_functions),
+                    Expr::CompoundIdentifier(value_column.to_vec()),
+                    value_source
+                )?;
+                Self::fmt_optional_alias(f, alias)
+            }
+            PipeOperator::Unpivot {
+                value_column,
+                name_column,
+                unpivot_columns,
+                alias,
+            } => {
+                write!(
+                    f,
+                    "UNPIVOT({} FOR {} IN ({}))",
+                    value_column,
+                    name_column,
+                    display_comma_separated(unpivot_columns)
+                )?;
+                Self::fmt_optional_alias(f, alias)
+            }
+            PipeOperator::Join(join) => write!(f, "{join}"),
+        }
+    }
+}
+
+impl PipeOperator {
+    /// Helper function to format optional alias for pipe operators
+    fn fmt_optional_alias(f: &mut fmt::Formatter<'_>, alias: &Option<Ident>) -> fmt::Result {
+        if let Some(alias) = alias {
+            write!(f, " AS {alias}")?;
+        }
+        Ok(())
+    }
+
+    /// Helper function to format set operations (UNION, INTERSECT, EXCEPT) with queries
+    fn fmt_set_operation(
+        f: &mut fmt::Formatter<'_>,
+        operation: &str,
+        set_quantifier: &SetQuantifier,
+        queries: &[Query],
+    ) -> fmt::Result {
+        write!(f, "{operation}")?;
+        match set_quantifier {
+            SetQuantifier::None => {}
+            _ => {
+                write!(f, " {set_quantifier}")?;
+            }
+        }
+        write!(f, " ")?;
+        let parenthesized_queries: Vec<String> =
+            queries.iter().map(|query| format!("({query})")).collect();
+        write!(f, "{}", display_comma_separated(&parenthesized_queries))
+    }
+}
+
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
@@ -2140,13 +3059,14 @@ pub struct Values {
 
 impl fmt::Display for Values {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "VALUES ")?;
+        f.write_str("VALUES")?;
         let prefix = if self.explicit_row { "ROW" } else { "" };
         let mut delim = "";
         for row in &self.rows {
-            write!(f, "{delim}")?;
-            delim = ", ";
-            write!(f, "{prefix}({})", display_comma_separated(row))?;
+            f.write_str(delim)?;
+            delim = ",";
+            SpaceOrNewline.fmt(f)?;
+            Indent(format_args!("{prefix}({})", display_comma_separated(row))).fmt(f)?;
         }
         Ok(())
     }
@@ -2176,13 +3096,18 @@ impl fmt::Display for SelectInto {
 /// e.g. GROUP BY year WITH ROLLUP WITH TOTALS
 ///
 /// [ClickHouse]: <https://clickhouse.com/docs/en/sql-reference/statements/select/group-by#rollup-modifier>
-#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum GroupByWithModifier {
     Rollup,
     Cube,
     Totals,
+    /// Hive supports GROUP BY GROUPING SETS syntax.
+    /// e.g. GROUP BY year , month GROUPING SETS((year,month),(year),(month))
+    ///
+    /// [Hive]: <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=30151323#EnhancedAggregation,Cube,GroupingandRollup-GROUPINGSETSclause>
+    GroupingSets(Expr),
 }
 
 impl fmt::Display for GroupByWithModifier {
@@ -2191,6 +3116,9 @@ impl fmt::Display for GroupByWithModifier {
             GroupByWithModifier::Rollup => write!(f, "WITH ROLLUP"),
             GroupByWithModifier::Cube => write!(f, "WITH CUBE"),
             GroupByWithModifier::Totals => write!(f, "WITH TOTALS"),
+            GroupByWithModifier::GroupingSets(expr) => {
+                write!(f, "{expr}")
+            }
         }
     }
 }
@@ -2225,8 +3153,9 @@ impl fmt::Display for GroupByExpr {
                 Ok(())
             }
             GroupByExpr::Expressions(col_names, modifiers) => {
-                let col_names = display_comma_separated(col_names);
-                write!(f, "GROUP BY {col_names}")?;
+                f.write_str("GROUP BY")?;
+                SpaceOrNewline.fmt(f)?;
+                Indent(display_comma_separated(col_names)).fmt(f)?;
                 if !modifiers.is_empty() {
                     write!(f, " {}", display_separated(modifiers, " "))?;
                 }
@@ -2250,12 +3179,35 @@ pub enum FormatClause {
 impl fmt::Display for FormatClause {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            FormatClause::Identifier(ident) => write!(f, "FORMAT {}", ident),
+            FormatClause::Identifier(ident) => write!(f, "FORMAT {ident}"),
             FormatClause::Null => write!(f, "FORMAT NULL"),
         }
     }
 }
 
+/// FORMAT identifier in input context, specific to ClickHouse.
+///
+/// [ClickHouse]: <https://clickhouse.com/docs/en/interfaces/formats>
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct InputFormatClause {
+    pub ident: Ident,
+    pub values: Vec<Expr>,
+}
+
+impl fmt::Display for InputFormatClause {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "FORMAT {}", self.ident)?;
+
+        if !self.values.is_empty() {
+            write!(f, " {}", display_comma_separated(self.values.as_slice()))?;
+        }
+
+        Ok(())
+    }
+}
+
 /// FOR XML or FOR JSON clause, specific to MSSQL
 /// (formats the output of a query as XML or JSON)
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -2289,9 +3241,9 @@ impl fmt::Display for ForClause {
                 without_array_wrapper,
             } => {
                 write!(f, "FOR JSON ")?;
-                write!(f, "{}", for_json)?;
+                write!(f, "{for_json}")?;
                 if let Some(root) = root {
-                    write!(f, ", ROOT('{}')", root)?;
+                    write!(f, ", ROOT('{root}')")?;
                 }
                 if *include_null_values {
                     write!(f, ", INCLUDE_NULL_VALUES")?;
@@ -2309,7 +3261,7 @@ impl fmt::Display for ForClause {
                 r#type,
             } => {
                 write!(f, "FOR XML ")?;
-                write!(f, "{}", for_xml)?;
+                write!(f, "{for_xml}")?;
                 if *binary_base64 {
                     write!(f, ", BINARY BASE64")?;
                 }
@@ -2317,7 +3269,7 @@ impl fmt::Display for ForClause {
                     write!(f, ", TYPE")?;
                 }
                 if let Some(root) = root {
-                    write!(f, ", ROOT('{}')", root)?;
+                    write!(f, ", ROOT('{root}')")?;
                 }
                 if *elements {
                     write!(f, ", ELEMENTS")?;
@@ -2344,7 +3296,7 @@ impl fmt::Display for ForXml {
             ForXml::Raw(root) => {
                 write!(f, "RAW")?;
                 if let Some(root) = root {
-                    write!(f, "('{}')", root)?;
+                    write!(f, "('{root}')")?;
                 }
                 Ok(())
             }
@@ -2353,7 +3305,7 @@ impl fmt::Display for ForXml {
             ForXml::Path(root) => {
                 write!(f, "PATH")?;
                 if let Some(root) = root {
-                    write!(f, "('{}')", root)?;
+                    write!(f, "('{root}')")?;
                 }
                 Ok(())
             }
@@ -2416,7 +3368,7 @@ impl fmt::Display for JsonTableColumn {
             JsonTableColumn::Named(json_table_named_column) => {
                 write!(f, "{json_table_named_column}")
             }
-            JsonTableColumn::ForOrdinality(ident) => write!(f, "{} FOR ORDINALITY", ident),
+            JsonTableColumn::ForOrdinality(ident) => write!(f, "{ident} FOR ORDINALITY"),
             JsonTableColumn::Nested(json_table_nested_column) => {
                 write!(f, "{json_table_nested_column}")
             }
@@ -2482,10 +3434,10 @@ impl fmt::Display for JsonTableNamedColumn {
             self.path
         )?;
         if let Some(on_empty) = &self.on_empty {
-            write!(f, " {} ON EMPTY", on_empty)?;
+            write!(f, " {on_empty} ON EMPTY")?;
         }
         if let Some(on_error) = &self.on_error {
-            write!(f, " {} ON ERROR", on_error)?;
+            write!(f, " {on_error} ON ERROR")?;
         }
         Ok(())
     }
@@ -2507,7 +3459,7 @@ impl fmt::Display for JsonTableColumnErrorHandling {
         match self {
             JsonTableColumnErrorHandling::Null => write!(f, "NULL"),
             JsonTableColumnErrorHandling::Default(json_string) => {
-                write!(f, "DEFAULT {}", json_string)
+                write!(f, "DEFAULT {json_string}")
             }
             JsonTableColumnErrorHandling::Error => write!(f, "ERROR"),
         }
@@ -2549,15 +3501,19 @@ impl fmt::Display for OpenJsonTableColumn {
 }
 
 /// BigQuery supports ValueTables which have 2 modes:
-/// `SELECT AS STRUCT`
-/// `SELECT AS VALUE`
+/// `SELECT [ALL | DISTINCT] AS STRUCT`
+/// `SELECT [ALL | DISTINCT] AS VALUE`
+///
 /// <https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#value_tables>
+/// <https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select_list>
 #[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum ValueTableMode {
     AsStruct,
     AsValue,
+    DistinctAsStruct,
+    DistinctAsValue,
 }
 
 impl fmt::Display for ValueTableMode {
@@ -2565,6 +3521,151 @@ impl fmt::Display for ValueTableMode {
         match self {
             ValueTableMode::AsStruct => write!(f, "AS STRUCT"),
             ValueTableMode::AsValue => write!(f, "AS VALUE"),
+            ValueTableMode::DistinctAsStruct => write!(f, "DISTINCT AS STRUCT"),
+            ValueTableMode::DistinctAsValue => write!(f, "DISTINCT AS VALUE"),
+        }
+    }
+}
+
+/// The `FROM` clause of an `UPDATE TABLE` statement
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub enum UpdateTableFromKind {
+    /// Update Statement where the 'FROM' clause is before the 'SET' keyword (Supported by Snowflake)
+    /// For Example: `UPDATE FROM t1 SET t1.name='aaa'`
+    BeforeSet(Vec<TableWithJoins>),
+    /// Update Statement where the 'FROM' clause is after the 'SET' keyword (Which is the standard way)
+    /// For Example: `UPDATE SET t1.name='aaa' FROM t1`
+    AfterSet(Vec<TableWithJoins>),
+}
+
+/// Defines the options for an XmlTable column: Named or ForOrdinality
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+pub enum XmlTableColumnOption {
+    /// A named column with a type, optional path, and default value.
+    NamedInfo {
+        /// The type of the column to be extracted.
+        r#type: DataType,
+        /// The path to the column to be extracted. If None, defaults to the column name.
+        path: Option<Expr>,
+        /// Default value if path does not match
+        default: Option<Expr>,
+        /// Whether the column is nullable (NULL=true, NOT NULL=false)
+        nullable: bool,
+    },
+    /// The FOR ORDINALITY marker
+    ForOrdinality,
+}
+
+/// A single column definition in XMLTABLE
+///
+/// ```sql
+/// COLUMNS
+///     id int PATH '@id',
+///     ordinality FOR ORDINALITY,
+///     "COUNTRY_NAME" text,
+///     country_id text PATH 'COUNTRY_ID',
+///     size_sq_km float PATH 'SIZE[@unit = "sq_km"]',
+///     size_other text PATH 'concat(SIZE[@unit!="sq_km"], " ", SIZE[@unit!="sq_km"]/@unit)',
+///     premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'
+/// ```
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+pub struct XmlTableColumn {
+    /// The name of the column.
+    pub name: Ident,
+    /// Column options: type/path/default or FOR ORDINALITY
+    pub option: XmlTableColumnOption,
+}
+
+impl fmt::Display for XmlTableColumn {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}", self.name)?;
+        match &self.option {
+            XmlTableColumnOption::NamedInfo {
+                r#type,
+                path,
+                default,
+                nullable,
+            } => {
+                write!(f, " {type}")?;
+                if let Some(p) = path {
+                    write!(f, " PATH {p}")?;
+                }
+                if let Some(d) = default {
+                    write!(f, " DEFAULT {d}")?;
+                }
+                if !*nullable {
+                    write!(f, " NOT NULL")?;
+                }
+                Ok(())
+            }
+            XmlTableColumnOption::ForOrdinality => {
+                write!(f, " FOR ORDINALITY")
+            }
         }
     }
 }
+
+/// Argument passed in the XMLTABLE PASSING clause
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+pub struct XmlPassingArgument {
+    pub expr: Expr,
+    pub alias: Option<Ident>,
+    pub by_value: bool, // True if BY VALUE is specified
+}
+
+impl fmt::Display for XmlPassingArgument {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if self.by_value {
+            write!(f, "BY VALUE ")?;
+        }
+        write!(f, "{}", self.expr)?;
+        if let Some(alias) = &self.alias {
+            write!(f, " AS {alias}")?;
+        }
+        Ok(())
+    }
+}
+
+/// The PASSING clause for XMLTABLE
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+pub struct XmlPassingClause {
+    pub arguments: Vec<XmlPassingArgument>,
+}
+
+impl fmt::Display for XmlPassingClause {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if !self.arguments.is_empty() {
+            write!(f, " PASSING {}", display_comma_separated(&self.arguments))?;
+        }
+        Ok(())
+    }
+}
+
+/// Represents a single XML namespace definition in the XMLNAMESPACES clause.
+///
+/// `namespace_uri AS namespace_name`
+#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+pub struct XmlNamespaceDefinition {
+    /// The namespace URI (a text expression).
+    pub uri: Expr,
+    /// The alias for the namespace (a simple identifier).
+    pub name: Ident,
+}
+
+impl fmt::Display for XmlNamespaceDefinition {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{} AS {}", self.uri, self.name)
+    }
+}
diff --git a/src/ast/spans.rs b/src/ast/spans.rs
new file mode 100644
index 000000000..dec26566c
--- /dev/null
+++ b/src/ast/spans.rs
@@ -0,0 +1,2551 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use crate::ast::{query::SelectItemQualifiedWildcardKind, ColumnOptions, ExportData, TypedString};
+use core::iter;
+
+use crate::tokenizer::Span;
+
+use super::{
+    dcl::SecondaryRoles, value::ValueWithSpan, AccessExpr, AlterColumnOperation,
+    AlterIndexOperation, AlterTableOperation, Array, Assignment, AssignmentTarget, AttachedToken,
+    BeginEndStatements, CaseStatement, CloseCursor, ClusteredIndex, ColumnDef, ColumnOption,
+    ColumnOptionDef, ConditionalStatementBlock, ConditionalStatements, ConflictTarget, ConnectBy,
+    ConstraintCharacteristics, CopySource, CreateIndex, CreateTable, CreateTableOptions, Cte,
+    Delete, DoUpdate, ExceptSelectItem, ExcludeSelectItem, Expr, ExprWithAlias, Fetch, FromTable,
+    Function, FunctionArg, FunctionArgExpr, FunctionArgumentClause, FunctionArgumentList,
+    FunctionArguments, GroupByExpr, HavingBound, IfStatement, IlikeSelectItem, IndexColumn, Insert,
+    Interpolate, InterpolateExpr, Join, JoinConstraint, JoinOperator, JsonPath, JsonPathElem,
+    LateralView, LimitClause, MatchRecognizePattern, Measure, NamedParenthesizedList,
+    NamedWindowDefinition, ObjectName, ObjectNamePart, Offset, OnConflict, OnConflictAction,
+    OnInsert, OpenStatement, OrderBy, OrderByExpr, OrderByKind, Partition, PivotValueSource,
+    ProjectionSelect, Query, RaiseStatement, RaiseStatementValue, ReferentialAction,
+    RenameSelectItem, ReplaceSelectElement, ReplaceSelectItem, Select, SelectInto, SelectItem,
+    SetExpr, SqlOption, Statement, Subscript, SymbolDefinition, TableAlias, TableAliasColumnDef,
+    TableConstraint, TableFactor, TableObject, TableOptionsClustered, TableWithJoins,
+    UpdateTableFromKind, Use, Value, Values, ViewColumnDef, WhileStatement,
+    WildcardAdditionalOptions, With, WithFill,
+};
+
+/// Given an iterator of spans, return the [Span::union] of all spans.
+fn union_spans<I: Iterator<Item = Span>>(iter: I) -> Span {
+    Span::union_iter(iter)
+}
+
+/// Trait for AST nodes that have a source location information.
+///
+/// # Notes:
+///
+/// Source [`Span`] are not yet complete. They may be missing:
+///
+/// 1. keywords or other tokens
+/// 2. span information entirely, in which case they return [`Span::empty()`].
+///
+/// Note Some impl blocks (rendered below) are annotated with which nodes are
+/// missing spans. See [this ticket] for additional information and status.
+///
+/// [this ticket]: https://github.com/apache/datafusion-sqlparser-rs/issues/1548
+///
+/// # Example
+/// ```
+/// # use sqlparser::parser::{Parser, ParserError};
+/// # use sqlparser::ast::Spanned;
+/// # use sqlparser::dialect::GenericDialect;
+/// # use sqlparser::tokenizer::Location;
+/// # fn main() -> Result<(), ParserError> {
+/// let dialect = GenericDialect {};
+/// let sql = r#"SELECT *
+///   FROM table_1"#;
+/// let statements = Parser::new(&dialect)
+///   .try_with_sql(sql)?
+///   .parse_statements()?;
+/// // Get the span of the first statement (SELECT)
+/// let span = statements[0].span();
+/// // statement starts at line 1, column 1 (1 based, not 0 based)
+/// assert_eq!(span.start, Location::new(1, 1));
+/// // statement ends on line 2, column 15
+/// assert_eq!(span.end, Location::new(2, 15));
+/// # Ok(())
+/// # }
+/// ```
+///
+pub trait Spanned {
+    /// Return the [`Span`] (the minimum and maximum [`Location`]) for this AST
+    /// node, by recursively combining the spans of its children.
+    ///
+    /// [`Location`]: crate::tokenizer::Location
+    fn span(&self) -> Span;
+}
+
+impl Spanned for Query {
+    fn span(&self) -> Span {
+        let Query {
+            with,
+            body,
+            order_by,
+            limit_clause,
+            fetch,
+            locks: _,          // todo
+            for_clause: _,     // todo, mssql specific
+            settings: _,       // todo, clickhouse specific
+            format_clause: _,  // todo, clickhouse specific
+            pipe_operators: _, // todo bigquery specific
+        } = self;
+
+        union_spans(
+            with.iter()
+                .map(|i| i.span())
+                .chain(core::iter::once(body.span()))
+                .chain(order_by.as_ref().map(|i| i.span()))
+                .chain(limit_clause.as_ref().map(|i| i.span()))
+                .chain(fetch.as_ref().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for LimitClause {
+    fn span(&self) -> Span {
+        match self {
+            LimitClause::LimitOffset {
+                limit,
+                offset,
+                limit_by,
+            } => union_spans(
+                limit
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(offset.as_ref().map(|i| i.span()))
+                    .chain(limit_by.iter().map(|i| i.span())),
+            ),
+            LimitClause::OffsetCommaLimit { offset, limit } => offset.span().union(&limit.span()),
+        }
+    }
+}
+
+impl Spanned for Offset {
+    fn span(&self) -> Span {
+        let Offset {
+            value,
+            rows: _, // enum
+        } = self;
+
+        value.span()
+    }
+}
+
+impl Spanned for Fetch {
+    fn span(&self) -> Span {
+        let Fetch {
+            with_ties: _, // bool
+            percent: _,   // bool
+            quantity,
+        } = self;
+
+        quantity.as_ref().map_or(Span::empty(), |i| i.span())
+    }
+}
+
+impl Spanned for With {
+    fn span(&self) -> Span {
+        let With {
+            with_token,
+            recursive: _, // bool
+            cte_tables,
+        } = self;
+
+        union_spans(
+            core::iter::once(with_token.0.span).chain(cte_tables.iter().map(|item| item.span())),
+        )
+    }
+}
+
+impl Spanned for Cte {
+    fn span(&self) -> Span {
+        let Cte {
+            alias,
+            query,
+            from,
+            materialized: _, // enum
+            closing_paren_token,
+        } = self;
+
+        union_spans(
+            core::iter::once(alias.span())
+                .chain(core::iter::once(query.span()))
+                .chain(from.iter().map(|item| item.span))
+                .chain(core::iter::once(closing_paren_token.0.span)),
+        )
+    }
+}
+
+/// # partial span
+///
+/// [SetExpr::Table] is not implemented.
+impl Spanned for SetExpr {
+    fn span(&self) -> Span {
+        match self {
+            SetExpr::Select(select) => select.span(),
+            SetExpr::Query(query) => query.span(),
+            SetExpr::SetOperation {
+                op: _,
+                set_quantifier: _,
+                left,
+                right,
+            } => left.span().union(&right.span()),
+            SetExpr::Values(values) => values.span(),
+            SetExpr::Insert(statement) => statement.span(),
+            SetExpr::Table(_) => Span::empty(),
+            SetExpr::Update(statement) => statement.span(),
+            SetExpr::Delete(statement) => statement.span(),
+        }
+    }
+}
+
+impl Spanned for Values {
+    fn span(&self) -> Span {
+        let Values {
+            explicit_row: _, // bool,
+            rows,
+        } = self;
+
+        union_spans(
+            rows.iter()
+                .map(|row| union_spans(row.iter().map(|expr| expr.span()))),
+        )
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [Statement::CopyIntoSnowflake]
+/// - [Statement::CreateSecret]
+/// - [Statement::CreateRole]
+/// - [Statement::AlterType]
+/// - [Statement::AlterRole]
+/// - [Statement::AttachDatabase]
+/// - [Statement::AttachDuckDBDatabase]
+/// - [Statement::DetachDuckDBDatabase]
+/// - [Statement::Drop]
+/// - [Statement::DropFunction]
+/// - [Statement::DropProcedure]
+/// - [Statement::DropSecret]
+/// - [Statement::Declare]
+/// - [Statement::CreateExtension]
+/// - [Statement::Fetch]
+/// - [Statement::Flush]
+/// - [Statement::Discard]
+/// - [Statement::Set]
+/// - [Statement::ShowFunctions]
+/// - [Statement::ShowVariable]
+/// - [Statement::ShowStatus]
+/// - [Statement::ShowVariables]
+/// - [Statement::ShowCreate]
+/// - [Statement::ShowColumns]
+/// - [Statement::ShowTables]
+/// - [Statement::ShowCollation]
+/// - [Statement::StartTransaction]
+/// - [Statement::Comment]
+/// - [Statement::Commit]
+/// - [Statement::Rollback]
+/// - [Statement::CreateSchema]
+/// - [Statement::CreateDatabase]
+/// - [Statement::CreateFunction]
+/// - [Statement::CreateTrigger]
+/// - [Statement::DropTrigger]
+/// - [Statement::CreateProcedure]
+/// - [Statement::CreateMacro]
+/// - [Statement::CreateStage]
+/// - [Statement::Assert]
+/// - [Statement::Grant]
+/// - [Statement::Revoke]
+/// - [Statement::Deallocate]
+/// - [Statement::Execute]
+/// - [Statement::Prepare]
+/// - [Statement::Kill]
+/// - [Statement::ExplainTable]
+/// - [Statement::Explain]
+/// - [Statement::Savepoint]
+/// - [Statement::ReleaseSavepoint]
+/// - [Statement::Merge]
+/// - [Statement::Cache]
+/// - [Statement::UNCache]
+/// - [Statement::CreateSequence]
+/// - [Statement::CreateType]
+/// - [Statement::Pragma]
+/// - [Statement::LockTables]
+/// - [Statement::UnlockTables]
+/// - [Statement::Unload]
+/// - [Statement::OptimizeTable]
+impl Spanned for Statement {
+    fn span(&self) -> Span {
+        match self {
+            Statement::Analyze {
+                table_name,
+                partitions,
+                for_columns: _,
+                columns,
+                cache_metadata: _,
+                noscan: _,
+                compute_statistics: _,
+                has_table_keyword: _,
+            } => union_spans(
+                core::iter::once(table_name.span())
+                    .chain(partitions.iter().flat_map(|i| i.iter().map(|k| k.span())))
+                    .chain(columns.iter().map(|i| i.span)),
+            ),
+            Statement::Truncate {
+                table_names,
+                partitions,
+                table: _,
+                identity: _,
+                cascade: _,
+                on_cluster: _,
+            } => union_spans(
+                table_names
+                    .iter()
+                    .map(|i| i.name.span())
+                    .chain(partitions.iter().flat_map(|i| i.iter().map(|k| k.span()))),
+            ),
+            Statement::Msck {
+                table_name,
+                repair: _,
+                partition_action: _,
+            } => table_name.span(),
+            Statement::Query(query) => query.span(),
+            Statement::Insert(insert) => insert.span(),
+            Statement::Install { extension_name } => extension_name.span,
+            Statement::Load { extension_name } => extension_name.span,
+            Statement::Directory {
+                overwrite: _,
+                local: _,
+                path: _,
+                file_format: _,
+                source,
+            } => source.span(),
+            Statement::Case(stmt) => stmt.span(),
+            Statement::If(stmt) => stmt.span(),
+            Statement::While(stmt) => stmt.span(),
+            Statement::Raise(stmt) => stmt.span(),
+            Statement::Call(function) => function.span(),
+            Statement::Copy {
+                source,
+                to: _,
+                target: _,
+                options: _,
+                legacy_options: _,
+                values: _,
+            } => source.span(),
+            Statement::CopyIntoSnowflake {
+                into: _,
+                into_columns: _,
+                from_obj: _,
+                from_obj_alias: _,
+                stage_params: _,
+                from_transformations: _,
+                files: _,
+                pattern: _,
+                file_format: _,
+                copy_options: _,
+                validation_mode: _,
+                kind: _,
+                from_query: _,
+                partition: _,
+            } => Span::empty(),
+            Statement::Open(open) => open.span(),
+            Statement::Close { cursor } => match cursor {
+                CloseCursor::All => Span::empty(),
+                CloseCursor::Specific { name } => name.span,
+            },
+            Statement::Update {
+                table,
+                assignments,
+                from,
+                selection,
+                returning,
+                or: _,
+            } => union_spans(
+                core::iter::once(table.span())
+                    .chain(assignments.iter().map(|i| i.span()))
+                    .chain(from.iter().map(|i| i.span()))
+                    .chain(selection.iter().map(|i| i.span()))
+                    .chain(returning.iter().flat_map(|i| i.iter().map(|k| k.span()))),
+            ),
+            Statement::Delete(delete) => delete.span(),
+            Statement::CreateView {
+                or_alter: _,
+                or_replace: _,
+                materialized: _,
+                name,
+                columns,
+                query,
+                options,
+                cluster_by,
+                comment: _,
+                with_no_schema_binding: _,
+                if_not_exists: _,
+                temporary: _,
+                to,
+                name_before_not_exists: _,
+                params: _,
+            } => union_spans(
+                core::iter::once(name.span())
+                    .chain(columns.iter().map(|i| i.span()))
+                    .chain(core::iter::once(query.span()))
+                    .chain(core::iter::once(options.span()))
+                    .chain(cluster_by.iter().map(|i| i.span))
+                    .chain(to.iter().map(|i| i.span())),
+            ),
+            Statement::CreateTable(create_table) => create_table.span(),
+            Statement::CreateVirtualTable {
+                name,
+                if_not_exists: _,
+                module_name,
+                module_args,
+            } => union_spans(
+                core::iter::once(name.span())
+                    .chain(core::iter::once(module_name.span))
+                    .chain(module_args.iter().map(|i| i.span)),
+            ),
+            Statement::CreateIndex(create_index) => create_index.span(),
+            Statement::CreateRole { .. } => Span::empty(),
+            Statement::CreateSecret { .. } => Span::empty(),
+            Statement::CreateServer { .. } => Span::empty(),
+            Statement::CreateConnector { .. } => Span::empty(),
+            Statement::AlterTable {
+                name,
+                if_exists: _,
+                only: _,
+                operations,
+                location: _,
+                on_cluster,
+                iceberg: _,
+            } => union_spans(
+                core::iter::once(name.span())
+                    .chain(operations.iter().map(|i| i.span()))
+                    .chain(on_cluster.iter().map(|i| i.span)),
+            ),
+            Statement::AlterIndex { name, operation } => name.span().union(&operation.span()),
+            Statement::AlterView {
+                name,
+                columns,
+                query,
+                with_options,
+            } => union_spans(
+                core::iter::once(name.span())
+                    .chain(columns.iter().map(|i| i.span))
+                    .chain(core::iter::once(query.span()))
+                    .chain(with_options.iter().map(|i| i.span())),
+            ),
+            // These statements need to be implemented
+            Statement::AlterType { .. } => Span::empty(),
+            Statement::AlterRole { .. } => Span::empty(),
+            Statement::AlterSession { .. } => Span::empty(),
+            Statement::AttachDatabase { .. } => Span::empty(),
+            Statement::AttachDuckDBDatabase { .. } => Span::empty(),
+            Statement::DetachDuckDBDatabase { .. } => Span::empty(),
+            Statement::Drop { .. } => Span::empty(),
+            Statement::DropFunction { .. } => Span::empty(),
+            Statement::DropDomain { .. } => Span::empty(),
+            Statement::DropProcedure { .. } => Span::empty(),
+            Statement::DropSecret { .. } => Span::empty(),
+            Statement::Declare { .. } => Span::empty(),
+            Statement::CreateExtension { .. } => Span::empty(),
+            Statement::DropExtension { .. } => Span::empty(),
+            Statement::Fetch { .. } => Span::empty(),
+            Statement::Flush { .. } => Span::empty(),
+            Statement::Discard { .. } => Span::empty(),
+            Statement::Set(_) => Span::empty(),
+            Statement::ShowFunctions { .. } => Span::empty(),
+            Statement::ShowVariable { .. } => Span::empty(),
+            Statement::ShowStatus { .. } => Span::empty(),
+            Statement::ShowVariables { .. } => Span::empty(),
+            Statement::ShowCreate { .. } => Span::empty(),
+            Statement::ShowColumns { .. } => Span::empty(),
+            Statement::ShowTables { .. } => Span::empty(),
+            Statement::ShowCollation { .. } => Span::empty(),
+            Statement::ShowCharset { .. } => Span::empty(),
+            Statement::Use(u) => u.span(),
+            Statement::StartTransaction { .. } => Span::empty(),
+            Statement::Comment { .. } => Span::empty(),
+            Statement::Commit { .. } => Span::empty(),
+            Statement::Rollback { .. } => Span::empty(),
+            Statement::CreateSchema { .. } => Span::empty(),
+            Statement::CreateDatabase { .. } => Span::empty(),
+            Statement::CreateFunction { .. } => Span::empty(),
+            Statement::CreateDomain { .. } => Span::empty(),
+            Statement::CreateTrigger { .. } => Span::empty(),
+            Statement::DropTrigger { .. } => Span::empty(),
+            Statement::CreateProcedure { .. } => Span::empty(),
+            Statement::CreateMacro { .. } => Span::empty(),
+            Statement::CreateStage { .. } => Span::empty(),
+            Statement::Assert { .. } => Span::empty(),
+            Statement::Grant { .. } => Span::empty(),
+            Statement::Deny { .. } => Span::empty(),
+            Statement::Revoke { .. } => Span::empty(),
+            Statement::Deallocate { .. } => Span::empty(),
+            Statement::Execute { .. } => Span::empty(),
+            Statement::Prepare { .. } => Span::empty(),
+            Statement::Kill { .. } => Span::empty(),
+            Statement::ExplainTable { .. } => Span::empty(),
+            Statement::Explain { .. } => Span::empty(),
+            Statement::Savepoint { .. } => Span::empty(),
+            Statement::ReleaseSavepoint { .. } => Span::empty(),
+            Statement::Merge { .. } => Span::empty(),
+            Statement::Cache { .. } => Span::empty(),
+            Statement::UNCache { .. } => Span::empty(),
+            Statement::CreateSequence { .. } => Span::empty(),
+            Statement::CreateType { .. } => Span::empty(),
+            Statement::Pragma { .. } => Span::empty(),
+            Statement::LockTables { .. } => Span::empty(),
+            Statement::UnlockTables => Span::empty(),
+            Statement::Unload { .. } => Span::empty(),
+            Statement::OptimizeTable { .. } => Span::empty(),
+            Statement::CreatePolicy { .. } => Span::empty(),
+            Statement::AlterPolicy { .. } => Span::empty(),
+            Statement::AlterConnector { .. } => Span::empty(),
+            Statement::DropPolicy { .. } => Span::empty(),
+            Statement::DropConnector { .. } => Span::empty(),
+            Statement::ShowDatabases { .. } => Span::empty(),
+            Statement::ShowSchemas { .. } => Span::empty(),
+            Statement::ShowObjects { .. } => Span::empty(),
+            Statement::ShowViews { .. } => Span::empty(),
+            Statement::LISTEN { .. } => Span::empty(),
+            Statement::NOTIFY { .. } => Span::empty(),
+            Statement::LoadData { .. } => Span::empty(),
+            Statement::UNLISTEN { .. } => Span::empty(),
+            Statement::RenameTable { .. } => Span::empty(),
+            Statement::RaisError { .. } => Span::empty(),
+            Statement::Print { .. } => Span::empty(),
+            Statement::Return { .. } => Span::empty(),
+            Statement::List(..) | Statement::Remove(..) => Span::empty(),
+            Statement::ExportData(ExportData {
+                options,
+                query,
+                connection,
+            }) => union_spans(
+                options
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(core::iter::once(query.span()))
+                    .chain(connection.iter().map(|i| i.span())),
+            ),
+            Statement::CreateUser(..) => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for Use {
+    fn span(&self) -> Span {
+        match self {
+            Use::Catalog(object_name) => object_name.span(),
+            Use::Schema(object_name) => object_name.span(),
+            Use::Database(object_name) => object_name.span(),
+            Use::Warehouse(object_name) => object_name.span(),
+            Use::Role(object_name) => object_name.span(),
+            Use::SecondaryRoles(secondary_roles) => {
+                if let SecondaryRoles::List(roles) = secondary_roles {
+                    return union_spans(roles.iter().map(|i| i.span));
+                }
+                Span::empty()
+            }
+            Use::Object(object_name) => object_name.span(),
+            Use::Default => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for CreateTable {
+    fn span(&self) -> Span {
+        let CreateTable {
+            or_replace: _,    // bool
+            temporary: _,     // bool
+            external: _,      // bool
+            global: _,        // bool
+            if_not_exists: _, // bool
+            transient: _,     // bool
+            volatile: _,      // bool
+            iceberg: _,       // bool, Snowflake specific
+            name,
+            columns,
+            constraints,
+            hive_distribution: _, // hive specific
+            hive_formats: _,      // hive specific
+            file_format: _,       // enum
+            location: _,          // string, no span
+            query,
+            without_rowid: _, // bool
+            like,
+            clone,
+            comment: _, // todo, no span
+            on_commit: _,
+            on_cluster: _,                      // todo, clickhouse specific
+            primary_key: _,                     // todo, clickhouse specific
+            order_by: _,                        // todo, clickhouse specific
+            partition_by: _,                    // todo, BigQuery specific
+            cluster_by: _,                      // todo, BigQuery specific
+            clustered_by: _,                    // todo, Hive specific
+            inherits: _,                        // todo, PostgreSQL specific
+            strict: _,                          // bool
+            copy_grants: _,                     // bool
+            enable_schema_evolution: _,         // bool
+            change_tracking: _,                 // bool
+            data_retention_time_in_days: _,     // u64, no span
+            max_data_extension_time_in_days: _, // u64, no span
+            default_ddl_collation: _,           // string, no span
+            with_aggregation_policy: _,         // todo, Snowflake specific
+            with_row_access_policy: _,          // todo, Snowflake specific
+            with_tags: _,                       // todo, Snowflake specific
+            external_volume: _,                 // todo, Snowflake specific
+            base_location: _,                   // todo, Snowflake specific
+            catalog: _,                         // todo, Snowflake specific
+            catalog_sync: _,                    // todo, Snowflake specific
+            storage_serialization_policy: _,
+            table_options,
+        } = self;
+
+        union_spans(
+            core::iter::once(name.span())
+                .chain(core::iter::once(table_options.span()))
+                .chain(columns.iter().map(|i| i.span()))
+                .chain(constraints.iter().map(|i| i.span()))
+                .chain(query.iter().map(|i| i.span()))
+                .chain(like.iter().map(|i| i.span()))
+                .chain(clone.iter().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for ColumnDef {
+    fn span(&self) -> Span {
+        let ColumnDef {
+            name,
+            data_type: _, // enum
+            options,
+        } = self;
+
+        union_spans(core::iter::once(name.span).chain(options.iter().map(|i| i.span())))
+    }
+}
+
+impl Spanned for ColumnOptionDef {
+    fn span(&self) -> Span {
+        let ColumnOptionDef { name, option } = self;
+
+        option.span().union_opt(&name.as_ref().map(|i| i.span))
+    }
+}
+
+impl Spanned for TableConstraint {
+    fn span(&self) -> Span {
+        match self {
+            TableConstraint::Unique {
+                name,
+                index_name,
+                index_type_display: _,
+                index_type: _,
+                columns,
+                index_options: _,
+                characteristics,
+                nulls_distinct: _,
+            } => union_spans(
+                name.iter()
+                    .map(|i| i.span)
+                    .chain(index_name.iter().map(|i| i.span))
+                    .chain(columns.iter().map(|i| i.span()))
+                    .chain(characteristics.iter().map(|i| i.span())),
+            ),
+            TableConstraint::PrimaryKey {
+                name,
+                index_name,
+                index_type: _,
+                columns,
+                index_options: _,
+                characteristics,
+            } => union_spans(
+                name.iter()
+                    .map(|i| i.span)
+                    .chain(index_name.iter().map(|i| i.span))
+                    .chain(columns.iter().map(|i| i.span()))
+                    .chain(characteristics.iter().map(|i| i.span())),
+            ),
+            TableConstraint::ForeignKey {
+                name,
+                columns,
+                index_name,
+                foreign_table,
+                referred_columns,
+                on_delete,
+                on_update,
+                characteristics,
+            } => union_spans(
+                name.iter()
+                    .map(|i| i.span)
+                    .chain(index_name.iter().map(|i| i.span))
+                    .chain(columns.iter().map(|i| i.span))
+                    .chain(core::iter::once(foreign_table.span()))
+                    .chain(referred_columns.iter().map(|i| i.span))
+                    .chain(on_delete.iter().map(|i| i.span()))
+                    .chain(on_update.iter().map(|i| i.span()))
+                    .chain(characteristics.iter().map(|i| i.span())),
+            ),
+            TableConstraint::Check {
+                name,
+                expr,
+                enforced: _,
+            } => expr.span().union_opt(&name.as_ref().map(|i| i.span)),
+            TableConstraint::Index {
+                display_as_key: _,
+                name,
+                index_type: _,
+                columns,
+            } => union_spans(
+                name.iter()
+                    .map(|i| i.span)
+                    .chain(columns.iter().map(|i| i.span())),
+            ),
+            TableConstraint::FulltextOrSpatial {
+                fulltext: _,
+                index_type_display: _,
+                opt_index_name,
+                columns,
+            } => union_spans(
+                opt_index_name
+                    .iter()
+                    .map(|i| i.span)
+                    .chain(columns.iter().map(|i| i.span())),
+            ),
+        }
+    }
+}
+
+impl Spanned for CreateIndex {
+    fn span(&self) -> Span {
+        let CreateIndex {
+            name,
+            table_name,
+            using: _,
+            columns,
+            unique: _,        // bool
+            concurrently: _,  // bool
+            if_not_exists: _, // bool
+            include,
+            nulls_distinct: _, // bool
+            with,
+            predicate,
+        } = self;
+
+        union_spans(
+            name.iter()
+                .map(|i| i.span())
+                .chain(core::iter::once(table_name.span()))
+                .chain(columns.iter().map(|i| i.column.span()))
+                .chain(include.iter().map(|i| i.span))
+                .chain(with.iter().map(|i| i.span()))
+                .chain(predicate.iter().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for IndexColumn {
+    fn span(&self) -> Span {
+        self.column.span()
+    }
+}
+
+impl Spanned for CaseStatement {
+    fn span(&self) -> Span {
+        let CaseStatement {
+            case_token: AttachedToken(start),
+            match_expr: _,
+            when_blocks: _,
+            else_block: _,
+            end_case_token: AttachedToken(end),
+        } = self;
+
+        union_spans([start.span, end.span].into_iter())
+    }
+}
+
+impl Spanned for IfStatement {
+    fn span(&self) -> Span {
+        let IfStatement {
+            if_block,
+            elseif_blocks,
+            else_block,
+            end_token,
+        } = self;
+
+        union_spans(
+            iter::once(if_block.span())
+                .chain(elseif_blocks.iter().map(|b| b.span()))
+                .chain(else_block.as_ref().map(|b| b.span()))
+                .chain(end_token.as_ref().map(|AttachedToken(t)| t.span)),
+        )
+    }
+}
+
+impl Spanned for WhileStatement {
+    fn span(&self) -> Span {
+        let WhileStatement { while_block } = self;
+
+        while_block.span()
+    }
+}
+
+impl Spanned for ConditionalStatements {
+    fn span(&self) -> Span {
+        match self {
+            ConditionalStatements::Sequence { statements } => {
+                union_spans(statements.iter().map(|s| s.span()))
+            }
+            ConditionalStatements::BeginEnd(bes) => bes.span(),
+        }
+    }
+}
+
+impl Spanned for ConditionalStatementBlock {
+    fn span(&self) -> Span {
+        let ConditionalStatementBlock {
+            start_token: AttachedToken(start_token),
+            condition,
+            then_token,
+            conditional_statements,
+        } = self;
+
+        union_spans(
+            iter::once(start_token.span)
+                .chain(condition.as_ref().map(|c| c.span()))
+                .chain(then_token.as_ref().map(|AttachedToken(t)| t.span))
+                .chain(iter::once(conditional_statements.span())),
+        )
+    }
+}
+
+impl Spanned for RaiseStatement {
+    fn span(&self) -> Span {
+        let RaiseStatement { value } = self;
+
+        union_spans(value.iter().map(|value| value.span()))
+    }
+}
+
+impl Spanned for RaiseStatementValue {
+    fn span(&self) -> Span {
+        match self {
+            RaiseStatementValue::UsingMessage(expr) => expr.span(),
+            RaiseStatementValue::Expr(expr) => expr.span(),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [ColumnOption::Null]
+/// - [ColumnOption::NotNull]
+/// - [ColumnOption::Comment]
+/// - [ColumnOption::Unique]¨
+/// - [ColumnOption::DialectSpecific]
+/// - [ColumnOption::Generated]
+impl Spanned for ColumnOption {
+    fn span(&self) -> Span {
+        match self {
+            ColumnOption::Null => Span::empty(),
+            ColumnOption::NotNull => Span::empty(),
+            ColumnOption::Default(expr) => expr.span(),
+            ColumnOption::Materialized(expr) => expr.span(),
+            ColumnOption::Ephemeral(expr) => expr.as_ref().map_or(Span::empty(), |e| e.span()),
+            ColumnOption::Alias(expr) => expr.span(),
+            ColumnOption::Unique { .. } => Span::empty(),
+            ColumnOption::ForeignKey {
+                foreign_table,
+                referred_columns,
+                on_delete,
+                on_update,
+                characteristics,
+            } => union_spans(
+                core::iter::once(foreign_table.span())
+                    .chain(referred_columns.iter().map(|i| i.span))
+                    .chain(on_delete.iter().map(|i| i.span()))
+                    .chain(on_update.iter().map(|i| i.span()))
+                    .chain(characteristics.iter().map(|i| i.span())),
+            ),
+            ColumnOption::Check(expr) => expr.span(),
+            ColumnOption::DialectSpecific(_) => Span::empty(),
+            ColumnOption::CharacterSet(object_name) => object_name.span(),
+            ColumnOption::Collation(object_name) => object_name.span(),
+            ColumnOption::Comment(_) => Span::empty(),
+            ColumnOption::OnUpdate(expr) => expr.span(),
+            ColumnOption::Generated { .. } => Span::empty(),
+            ColumnOption::Options(vec) => union_spans(vec.iter().map(|i| i.span())),
+            ColumnOption::Identity(..) => Span::empty(),
+            ColumnOption::OnConflict(..) => Span::empty(),
+            ColumnOption::Policy(..) => Span::empty(),
+            ColumnOption::Tags(..) => Span::empty(),
+            ColumnOption::Srid(..) => Span::empty(),
+        }
+    }
+}
+
+/// # missing span
+impl Spanned for ReferentialAction {
+    fn span(&self) -> Span {
+        Span::empty()
+    }
+}
+
+/// # missing span
+impl Spanned for ConstraintCharacteristics {
+    fn span(&self) -> Span {
+        let ConstraintCharacteristics {
+            deferrable: _, // bool
+            initially: _,  // enum
+            enforced: _,   // bool
+        } = self;
+
+        Span::empty()
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [AlterColumnOperation::SetNotNull]
+/// - [AlterColumnOperation::DropNotNull]
+/// - [AlterColumnOperation::DropDefault]
+/// - [AlterColumnOperation::AddGenerated]
+impl Spanned for AlterColumnOperation {
+    fn span(&self) -> Span {
+        match self {
+            AlterColumnOperation::SetNotNull => Span::empty(),
+            AlterColumnOperation::DropNotNull => Span::empty(),
+            AlterColumnOperation::SetDefault { value } => value.span(),
+            AlterColumnOperation::DropDefault => Span::empty(),
+            AlterColumnOperation::SetDataType {
+                data_type: _,
+                using,
+                had_set: _,
+            } => using.as_ref().map_or(Span::empty(), |u| u.span()),
+            AlterColumnOperation::AddGenerated { .. } => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for CopySource {
+    fn span(&self) -> Span {
+        match self {
+            CopySource::Table {
+                table_name,
+                columns,
+            } => union_spans(
+                core::iter::once(table_name.span()).chain(columns.iter().map(|i| i.span)),
+            ),
+            CopySource::Query(query) => query.span(),
+        }
+    }
+}
+
+impl Spanned for Delete {
+    fn span(&self) -> Span {
+        let Delete {
+            tables,
+            from,
+            using,
+            selection,
+            returning,
+            order_by,
+            limit,
+        } = self;
+
+        union_spans(
+            tables
+                .iter()
+                .map(|i| i.span())
+                .chain(core::iter::once(from.span()))
+                .chain(
+                    using
+                        .iter()
+                        .map(|u| union_spans(u.iter().map(|i| i.span()))),
+                )
+                .chain(selection.iter().map(|i| i.span()))
+                .chain(returning.iter().flat_map(|i| i.iter().map(|k| k.span())))
+                .chain(order_by.iter().map(|i| i.span()))
+                .chain(limit.iter().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for FromTable {
+    fn span(&self) -> Span {
+        match self {
+            FromTable::WithFromKeyword(vec) => union_spans(vec.iter().map(|i| i.span())),
+            FromTable::WithoutKeyword(vec) => union_spans(vec.iter().map(|i| i.span())),
+        }
+    }
+}
+
+impl Spanned for ViewColumnDef {
+    fn span(&self) -> Span {
+        let ViewColumnDef {
+            name,
+            data_type: _, // todo, DataType
+            options,
+        } = self;
+
+        name.span.union_opt(&options.as_ref().map(|o| o.span()))
+    }
+}
+
+impl Spanned for ColumnOptions {
+    fn span(&self) -> Span {
+        union_spans(self.as_slice().iter().map(|i| i.span()))
+    }
+}
+
+impl Spanned for SqlOption {
+    fn span(&self) -> Span {
+        match self {
+            SqlOption::Clustered(table_options_clustered) => table_options_clustered.span(),
+            SqlOption::Ident(ident) => ident.span,
+            SqlOption::KeyValue { key, value } => key.span.union(&value.span()),
+            SqlOption::Partition {
+                column_name,
+                range_direction: _,
+                for_values,
+            } => union_spans(
+                core::iter::once(column_name.span).chain(for_values.iter().map(|i| i.span())),
+            ),
+            SqlOption::TableSpace(_) => Span::empty(),
+            SqlOption::Comment(_) => Span::empty(),
+            SqlOption::NamedParenthesizedList(NamedParenthesizedList {
+                key: name,
+                name: value,
+                values,
+            }) => union_spans(core::iter::once(name.span).chain(values.iter().map(|i| i.span)))
+                .union_opt(&value.as_ref().map(|i| i.span)),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [TableOptionsClustered::ColumnstoreIndex]
+impl Spanned for TableOptionsClustered {
+    fn span(&self) -> Span {
+        match self {
+            TableOptionsClustered::ColumnstoreIndex => Span::empty(),
+            TableOptionsClustered::ColumnstoreIndexOrder(vec) => {
+                union_spans(vec.iter().map(|i| i.span))
+            }
+            TableOptionsClustered::Index(vec) => union_spans(vec.iter().map(|i| i.span())),
+        }
+    }
+}
+
+impl Spanned for ClusteredIndex {
+    fn span(&self) -> Span {
+        let ClusteredIndex {
+            name,
+            asc: _, // bool
+        } = self;
+
+        name.span
+    }
+}
+
+impl Spanned for CreateTableOptions {
+    fn span(&self) -> Span {
+        match self {
+            CreateTableOptions::None => Span::empty(),
+            CreateTableOptions::With(vec) => union_spans(vec.iter().map(|i| i.span())),
+            CreateTableOptions::Options(vec) => {
+                union_spans(vec.as_slice().iter().map(|i| i.span()))
+            }
+            CreateTableOptions::Plain(vec) => union_spans(vec.iter().map(|i| i.span())),
+            CreateTableOptions::TableProperties(vec) => union_spans(vec.iter().map(|i| i.span())),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [AlterTableOperation::OwnerTo]
+impl Spanned for AlterTableOperation {
+    fn span(&self) -> Span {
+        match self {
+            AlterTableOperation::AddConstraint {
+                constraint,
+                not_valid: _,
+            } => constraint.span(),
+            AlterTableOperation::AddColumn {
+                column_keyword: _,
+                if_not_exists: _,
+                column_def,
+                column_position: _,
+            } => column_def.span(),
+            AlterTableOperation::AddProjection {
+                if_not_exists: _,
+                name,
+                select,
+            } => name.span.union(&select.span()),
+            AlterTableOperation::DropProjection { if_exists: _, name } => name.span,
+            AlterTableOperation::MaterializeProjection {
+                if_exists: _,
+                name,
+                partition,
+            } => name.span.union_opt(&partition.as_ref().map(|i| i.span)),
+            AlterTableOperation::ClearProjection {
+                if_exists: _,
+                name,
+                partition,
+            } => name.span.union_opt(&partition.as_ref().map(|i| i.span)),
+            AlterTableOperation::DisableRowLevelSecurity => Span::empty(),
+            AlterTableOperation::DisableRule { name } => name.span,
+            AlterTableOperation::DisableTrigger { name } => name.span,
+            AlterTableOperation::DropConstraint {
+                if_exists: _,
+                name,
+                drop_behavior: _,
+            } => name.span,
+            AlterTableOperation::DropColumn {
+                has_column_keyword: _,
+                column_names,
+                if_exists: _,
+                drop_behavior: _,
+            } => union_spans(column_names.iter().map(|i| i.span)),
+            AlterTableOperation::AttachPartition { partition } => partition.span(),
+            AlterTableOperation::DetachPartition { partition } => partition.span(),
+            AlterTableOperation::FreezePartition {
+                partition,
+                with_name,
+            } => partition
+                .span()
+                .union_opt(&with_name.as_ref().map(|n| n.span)),
+            AlterTableOperation::UnfreezePartition {
+                partition,
+                with_name,
+            } => partition
+                .span()
+                .union_opt(&with_name.as_ref().map(|n| n.span)),
+            AlterTableOperation::DropPrimaryKey => Span::empty(),
+            AlterTableOperation::DropForeignKey { name } => name.span,
+            AlterTableOperation::DropIndex { name } => name.span,
+            AlterTableOperation::EnableAlwaysRule { name } => name.span,
+            AlterTableOperation::EnableAlwaysTrigger { name } => name.span,
+            AlterTableOperation::EnableReplicaRule { name } => name.span,
+            AlterTableOperation::EnableReplicaTrigger { name } => name.span,
+            AlterTableOperation::EnableRowLevelSecurity => Span::empty(),
+            AlterTableOperation::EnableRule { name } => name.span,
+            AlterTableOperation::EnableTrigger { name } => name.span,
+            AlterTableOperation::RenamePartitions {
+                old_partitions,
+                new_partitions,
+            } => union_spans(
+                old_partitions
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(new_partitions.iter().map(|i| i.span())),
+            ),
+            AlterTableOperation::AddPartitions {
+                if_not_exists: _,
+                new_partitions,
+            } => union_spans(new_partitions.iter().map(|i| i.span())),
+            AlterTableOperation::DropPartitions {
+                partitions,
+                if_exists: _,
+            } => union_spans(partitions.iter().map(|i| i.span())),
+            AlterTableOperation::RenameColumn {
+                old_column_name,
+                new_column_name,
+            } => old_column_name.span.union(&new_column_name.span),
+            AlterTableOperation::RenameTable { table_name } => table_name.span(),
+            AlterTableOperation::ChangeColumn {
+                old_name,
+                new_name,
+                data_type: _,
+                options,
+                column_position: _,
+            } => union_spans(
+                core::iter::once(old_name.span)
+                    .chain(core::iter::once(new_name.span))
+                    .chain(options.iter().map(|i| i.span())),
+            ),
+            AlterTableOperation::ModifyColumn {
+                col_name,
+                data_type: _,
+                options,
+                column_position: _,
+            } => {
+                union_spans(core::iter::once(col_name.span).chain(options.iter().map(|i| i.span())))
+            }
+            AlterTableOperation::RenameConstraint { old_name, new_name } => {
+                old_name.span.union(&new_name.span)
+            }
+            AlterTableOperation::AlterColumn { column_name, op } => {
+                column_name.span.union(&op.span())
+            }
+            AlterTableOperation::SwapWith { table_name } => table_name.span(),
+            AlterTableOperation::SetTblProperties { table_properties } => {
+                union_spans(table_properties.iter().map(|i| i.span()))
+            }
+            AlterTableOperation::OwnerTo { .. } => Span::empty(),
+            AlterTableOperation::ClusterBy { exprs } => union_spans(exprs.iter().map(|e| e.span())),
+            AlterTableOperation::DropClusteringKey => Span::empty(),
+            AlterTableOperation::SuspendRecluster => Span::empty(),
+            AlterTableOperation::ResumeRecluster => Span::empty(),
+            AlterTableOperation::Algorithm { .. } => Span::empty(),
+            AlterTableOperation::AutoIncrement { value, .. } => value.span(),
+            AlterTableOperation::Lock { .. } => Span::empty(),
+            AlterTableOperation::ReplicaIdentity { .. } => Span::empty(),
+            AlterTableOperation::ValidateConstraint { name } => name.span,
+            AlterTableOperation::SetOptionsParens { options } => {
+                union_spans(options.iter().map(|i| i.span()))
+            }
+        }
+    }
+}
+
+impl Spanned for Partition {
+    fn span(&self) -> Span {
+        match self {
+            Partition::Identifier(ident) => ident.span,
+            Partition::Expr(expr) => expr.span(),
+            Partition::Part(expr) => expr.span(),
+            Partition::Partitions(vec) => union_spans(vec.iter().map(|i| i.span())),
+        }
+    }
+}
+
+impl Spanned for ProjectionSelect {
+    fn span(&self) -> Span {
+        let ProjectionSelect {
+            projection,
+            order_by,
+            group_by,
+        } = self;
+
+        union_spans(
+            projection
+                .iter()
+                .map(|i| i.span())
+                .chain(order_by.iter().map(|i| i.span()))
+                .chain(group_by.iter().map(|i| i.span())),
+        )
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [OrderByKind::All]
+impl Spanned for OrderBy {
+    fn span(&self) -> Span {
+        match &self.kind {
+            OrderByKind::All(_) => Span::empty(),
+            OrderByKind::Expressions(exprs) => union_spans(
+                exprs
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(self.interpolate.iter().map(|i| i.span())),
+            ),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [GroupByExpr::All]
+impl Spanned for GroupByExpr {
+    fn span(&self) -> Span {
+        match self {
+            GroupByExpr::All(_) => Span::empty(),
+            GroupByExpr::Expressions(exprs, _modifiers) => {
+                union_spans(exprs.iter().map(|i| i.span()))
+            }
+        }
+    }
+}
+
+impl Spanned for Interpolate {
+    fn span(&self) -> Span {
+        let Interpolate { exprs } = self;
+
+        union_spans(exprs.iter().flat_map(|i| i.iter().map(|e| e.span())))
+    }
+}
+
+impl Spanned for InterpolateExpr {
+    fn span(&self) -> Span {
+        let InterpolateExpr { column, expr } = self;
+
+        column.span.union_opt(&expr.as_ref().map(|e| e.span()))
+    }
+}
+
+impl Spanned for AlterIndexOperation {
+    fn span(&self) -> Span {
+        match self {
+            AlterIndexOperation::RenameIndex { index_name } => index_name.span(),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:ever
+/// - [Insert::insert_alias]
+impl Spanned for Insert {
+    fn span(&self) -> Span {
+        let Insert {
+            or: _,     // enum, sqlite specific
+            ignore: _, // bool
+            into: _,   // bool
+            table,
+            table_alias,
+            columns,
+            overwrite: _, // bool
+            source,
+            partitioned,
+            after_columns,
+            has_table_keyword: _, // bool
+            on,
+            returning,
+            replace_into: _, // bool
+            priority: _,     // todo, mysql specific
+            insert_alias: _, // todo, mysql specific
+            assignments,
+            settings: _,      // todo, clickhouse specific
+            format_clause: _, // todo, clickhouse specific
+        } = self;
+
+        union_spans(
+            core::iter::once(table.span())
+                .chain(table_alias.as_ref().map(|i| i.span))
+                .chain(columns.iter().map(|i| i.span))
+                .chain(source.as_ref().map(|q| q.span()))
+                .chain(assignments.iter().map(|i| i.span()))
+                .chain(partitioned.iter().flat_map(|i| i.iter().map(|k| k.span())))
+                .chain(after_columns.iter().map(|i| i.span))
+                .chain(on.as_ref().map(|i| i.span()))
+                .chain(returning.iter().flat_map(|i| i.iter().map(|k| k.span()))),
+        )
+    }
+}
+
+impl Spanned for OnInsert {
+    fn span(&self) -> Span {
+        match self {
+            OnInsert::DuplicateKeyUpdate(vec) => union_spans(vec.iter().map(|i| i.span())),
+            OnInsert::OnConflict(on_conflict) => on_conflict.span(),
+        }
+    }
+}
+
+impl Spanned for OnConflict {
+    fn span(&self) -> Span {
+        let OnConflict {
+            conflict_target,
+            action,
+        } = self;
+
+        action
+            .span()
+            .union_opt(&conflict_target.as_ref().map(|i| i.span()))
+    }
+}
+
+impl Spanned for ConflictTarget {
+    fn span(&self) -> Span {
+        match self {
+            ConflictTarget::Columns(vec) => union_spans(vec.iter().map(|i| i.span)),
+            ConflictTarget::OnConstraint(object_name) => object_name.span(),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [OnConflictAction::DoNothing]
+impl Spanned for OnConflictAction {
+    fn span(&self) -> Span {
+        match self {
+            OnConflictAction::DoNothing => Span::empty(),
+            OnConflictAction::DoUpdate(do_update) => do_update.span(),
+        }
+    }
+}
+
+impl Spanned for DoUpdate {
+    fn span(&self) -> Span {
+        let DoUpdate {
+            assignments,
+            selection,
+        } = self;
+
+        union_spans(
+            assignments
+                .iter()
+                .map(|i| i.span())
+                .chain(selection.iter().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for Assignment {
+    fn span(&self) -> Span {
+        let Assignment { target, value } = self;
+
+        target.span().union(&value.span())
+    }
+}
+
+impl Spanned for AssignmentTarget {
+    fn span(&self) -> Span {
+        match self {
+            AssignmentTarget::ColumnName(object_name) => object_name.span(),
+            AssignmentTarget::Tuple(vec) => union_spans(vec.iter().map(|i| i.span())),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Most expressions are missing keywords in their spans.
+/// f.e. `IS NULL <expr>` reports as `<expr>::span`.
+///
+/// Missing spans:
+/// - [Expr::MatchAgainst] # MySQL specific
+/// - [Expr::RLike] # MySQL specific
+/// - [Expr::Struct] # BigQuery specific
+/// - [Expr::Named] # BigQuery specific
+/// - [Expr::Dictionary] # DuckDB specific
+/// - [Expr::Map] # DuckDB specific
+/// - [Expr::Lambda]
+impl Spanned for Expr {
+    fn span(&self) -> Span {
+        match self {
+            Expr::Identifier(ident) => ident.span,
+            Expr::CompoundIdentifier(vec) => union_spans(vec.iter().map(|i| i.span)),
+            Expr::CompoundFieldAccess { root, access_chain } => {
+                union_spans(iter::once(root.span()).chain(access_chain.iter().map(|i| i.span())))
+            }
+            Expr::IsFalse(expr) => expr.span(),
+            Expr::IsNotFalse(expr) => expr.span(),
+            Expr::IsTrue(expr) => expr.span(),
+            Expr::IsNotTrue(expr) => expr.span(),
+            Expr::IsNull(expr) => expr.span(),
+            Expr::IsNotNull(expr) => expr.span(),
+            Expr::IsUnknown(expr) => expr.span(),
+            Expr::IsNotUnknown(expr) => expr.span(),
+            Expr::IsDistinctFrom(lhs, rhs) => lhs.span().union(&rhs.span()),
+            Expr::IsNotDistinctFrom(lhs, rhs) => lhs.span().union(&rhs.span()),
+            Expr::InList {
+                expr,
+                list,
+                negated: _,
+            } => union_spans(
+                core::iter::once(expr.span()).chain(list.iter().map(|item| item.span())),
+            ),
+            Expr::InSubquery {
+                expr,
+                subquery,
+                negated: _,
+            } => expr.span().union(&subquery.span()),
+            Expr::InUnnest {
+                expr,
+                array_expr,
+                negated: _,
+            } => expr.span().union(&array_expr.span()),
+            Expr::Between {
+                expr,
+                negated: _,
+                low,
+                high,
+            } => expr.span().union(&low.span()).union(&high.span()),
+
+            Expr::BinaryOp { left, op: _, right } => left.span().union(&right.span()),
+            Expr::Like {
+                negated: _,
+                expr,
+                pattern,
+                escape_char: _,
+                any: _,
+            } => expr.span().union(&pattern.span()),
+            Expr::ILike {
+                negated: _,
+                expr,
+                pattern,
+                escape_char: _,
+                any: _,
+            } => expr.span().union(&pattern.span()),
+            Expr::RLike { .. } => Span::empty(),
+            Expr::IsNormalized {
+                expr,
+                form: _,
+                negated: _,
+            } => expr.span(),
+            Expr::SimilarTo {
+                negated: _,
+                expr,
+                pattern,
+                escape_char: _,
+            } => expr.span().union(&pattern.span()),
+            Expr::Ceil { expr, field: _ } => expr.span(),
+            Expr::Floor { expr, field: _ } => expr.span(),
+            Expr::Position { expr, r#in } => expr.span().union(&r#in.span()),
+            Expr::Overlay {
+                expr,
+                overlay_what,
+                overlay_from,
+                overlay_for,
+            } => expr
+                .span()
+                .union(&overlay_what.span())
+                .union(&overlay_from.span())
+                .union_opt(&overlay_for.as_ref().map(|i| i.span())),
+            Expr::Collate { expr, collation } => expr
+                .span()
+                .union(&union_spans(collation.0.iter().map(|i| i.span()))),
+            Expr::Nested(expr) => expr.span(),
+            Expr::Value(value) => value.span(),
+            Expr::TypedString(TypedString { value, .. }) => value.span(),
+            Expr::Function(function) => function.span(),
+            Expr::GroupingSets(vec) => {
+                union_spans(vec.iter().flat_map(|i| i.iter().map(|k| k.span())))
+            }
+            Expr::Cube(vec) => union_spans(vec.iter().flat_map(|i| i.iter().map(|k| k.span()))),
+            Expr::Rollup(vec) => union_spans(vec.iter().flat_map(|i| i.iter().map(|k| k.span()))),
+            Expr::Tuple(vec) => union_spans(vec.iter().map(|i| i.span())),
+            Expr::Array(array) => array.span(),
+            Expr::MatchAgainst { .. } => Span::empty(),
+            Expr::JsonAccess { value, path } => value.span().union(&path.span()),
+            Expr::AnyOp {
+                left,
+                compare_op: _,
+                right,
+                is_some: _,
+            } => left.span().union(&right.span()),
+            Expr::AllOp {
+                left,
+                compare_op: _,
+                right,
+            } => left.span().union(&right.span()),
+            Expr::UnaryOp { op: _, expr } => expr.span(),
+            Expr::Convert {
+                expr,
+                data_type: _,
+                charset,
+                target_before_value: _,
+                styles,
+                is_try: _,
+            } => union_spans(
+                core::iter::once(expr.span())
+                    .chain(charset.as_ref().map(|i| i.span()))
+                    .chain(styles.iter().map(|i| i.span())),
+            ),
+            Expr::Cast {
+                kind: _,
+                expr,
+                data_type: _,
+                format: _,
+            } => expr.span(),
+            Expr::AtTimeZone {
+                timestamp,
+                time_zone,
+            } => timestamp.span().union(&time_zone.span()),
+            Expr::Extract {
+                field: _,
+                syntax: _,
+                expr,
+            } => expr.span(),
+            Expr::Substring {
+                expr,
+                substring_from,
+                substring_for,
+                special: _,
+                shorthand: _,
+            } => union_spans(
+                core::iter::once(expr.span())
+                    .chain(substring_from.as_ref().map(|i| i.span()))
+                    .chain(substring_for.as_ref().map(|i| i.span())),
+            ),
+            Expr::Trim {
+                expr,
+                trim_where: _,
+                trim_what,
+                trim_characters,
+            } => union_spans(
+                core::iter::once(expr.span())
+                    .chain(trim_what.as_ref().map(|i| i.span()))
+                    .chain(
+                        trim_characters
+                            .as_ref()
+                            .map(|items| union_spans(items.iter().map(|i| i.span()))),
+                    ),
+            ),
+            Expr::Prefixed { value, .. } => value.span(),
+            Expr::Case {
+                case_token,
+                end_token,
+                operand,
+                conditions,
+                else_result,
+            } => union_spans(
+                iter::once(case_token.0.span)
+                    .chain(
+                        operand
+                            .as_ref()
+                            .map(|i| i.span())
+                            .into_iter()
+                            .chain(conditions.iter().flat_map(|case_when| {
+                                [case_when.condition.span(), case_when.result.span()]
+                            }))
+                            .chain(else_result.as_ref().map(|i| i.span())),
+                    )
+                    .chain(iter::once(end_token.0.span)),
+            ),
+            Expr::Exists { subquery, .. } => subquery.span(),
+            Expr::Subquery(query) => query.span(),
+            Expr::Struct { .. } => Span::empty(),
+            Expr::Named { .. } => Span::empty(),
+            Expr::Dictionary(_) => Span::empty(),
+            Expr::Map(_) => Span::empty(),
+            Expr::Interval(interval) => interval.value.span(),
+            Expr::Wildcard(token) => token.0.span,
+            Expr::QualifiedWildcard(object_name, token) => union_spans(
+                object_name
+                    .0
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(iter::once(token.0.span)),
+            ),
+            Expr::OuterJoin(expr) => expr.span(),
+            Expr::Prior(expr) => expr.span(),
+            Expr::Lambda(_) => Span::empty(),
+            Expr::MemberOf(member_of) => member_of.value.span().union(&member_of.array.span()),
+        }
+    }
+}
+
+impl Spanned for Subscript {
+    fn span(&self) -> Span {
+        match self {
+            Subscript::Index { index } => index.span(),
+            Subscript::Slice {
+                lower_bound,
+                upper_bound,
+                stride,
+            } => union_spans(
+                [
+                    lower_bound.as_ref().map(|i| i.span()),
+                    upper_bound.as_ref().map(|i| i.span()),
+                    stride.as_ref().map(|i| i.span()),
+                ]
+                .into_iter()
+                .flatten(),
+            ),
+        }
+    }
+}
+
+impl Spanned for AccessExpr {
+    fn span(&self) -> Span {
+        match self {
+            AccessExpr::Dot(ident) => ident.span(),
+            AccessExpr::Subscript(subscript) => subscript.span(),
+        }
+    }
+}
+
+impl Spanned for ObjectName {
+    fn span(&self) -> Span {
+        let ObjectName(segments) = self;
+
+        union_spans(segments.iter().map(|i| i.span()))
+    }
+}
+
+impl Spanned for ObjectNamePart {
+    fn span(&self) -> Span {
+        match self {
+            ObjectNamePart::Identifier(ident) => ident.span,
+            ObjectNamePart::Function(func) => func
+                .name
+                .span
+                .union(&union_spans(func.args.iter().map(|i| i.span()))),
+        }
+    }
+}
+
+impl Spanned for Array {
+    fn span(&self) -> Span {
+        let Array {
+            elem,
+            named: _, // bool
+        } = self;
+
+        union_spans(elem.iter().map(|i| i.span()))
+    }
+}
+
+impl Spanned for Function {
+    fn span(&self) -> Span {
+        let Function {
+            name,
+            uses_odbc_syntax: _,
+            parameters,
+            args,
+            filter,
+            null_treatment: _, // enum
+            over: _,           // todo
+            within_group,
+        } = self;
+
+        union_spans(
+            name.0
+                .iter()
+                .map(|i| i.span())
+                .chain(iter::once(args.span()))
+                .chain(iter::once(parameters.span()))
+                .chain(filter.iter().map(|i| i.span()))
+                .chain(within_group.iter().map(|i| i.span())),
+        )
+    }
+}
+
+/// # partial span
+///
+/// The span of [FunctionArguments::None] is empty.
+impl Spanned for FunctionArguments {
+    fn span(&self) -> Span {
+        match self {
+            FunctionArguments::None => Span::empty(),
+            FunctionArguments::Subquery(query) => query.span(),
+            FunctionArguments::List(list) => list.span(),
+        }
+    }
+}
+
+impl Spanned for FunctionArgumentList {
+    fn span(&self) -> Span {
+        let FunctionArgumentList {
+            duplicate_treatment: _, // enum
+            args,
+            clauses,
+        } = self;
+
+        union_spans(
+            // # todo: duplicate-treatment span
+            args.iter()
+                .map(|i| i.span())
+                .chain(clauses.iter().map(|i| i.span())),
+        )
+    }
+}
+
+impl Spanned for FunctionArgumentClause {
+    fn span(&self) -> Span {
+        match self {
+            FunctionArgumentClause::IgnoreOrRespectNulls(_) => Span::empty(),
+            FunctionArgumentClause::OrderBy(vec) => union_spans(vec.iter().map(|i| i.expr.span())),
+            FunctionArgumentClause::Limit(expr) => expr.span(),
+            FunctionArgumentClause::OnOverflow(_) => Span::empty(),
+            FunctionArgumentClause::Having(HavingBound(_kind, expr)) => expr.span(),
+            FunctionArgumentClause::Separator(value) => value.span(),
+            FunctionArgumentClause::JsonNullClause(_) => Span::empty(),
+        }
+    }
+}
+
+/// # partial span
+///
+/// see Spanned impl for JsonPathElem for more information
+impl Spanned for JsonPath {
+    fn span(&self) -> Span {
+        let JsonPath { path } = self;
+
+        union_spans(path.iter().map(|i| i.span()))
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [JsonPathElem::Dot]
+impl Spanned for JsonPathElem {
+    fn span(&self) -> Span {
+        match self {
+            JsonPathElem::Dot { .. } => Span::empty(),
+            JsonPathElem::Bracket { key } => key.span(),
+        }
+    }
+}
+
+impl Spanned for SelectItemQualifiedWildcardKind {
+    fn span(&self) -> Span {
+        match self {
+            SelectItemQualifiedWildcardKind::ObjectName(object_name) => object_name.span(),
+            SelectItemQualifiedWildcardKind::Expr(expr) => expr.span(),
+        }
+    }
+}
+
+impl Spanned for SelectItem {
+    fn span(&self) -> Span {
+        match self {
+            SelectItem::UnnamedExpr(expr) => expr.span(),
+            SelectItem::ExprWithAlias { expr, alias } => expr.span().union(&alias.span),
+            SelectItem::QualifiedWildcard(kind, wildcard_additional_options) => union_spans(
+                [kind.span()]
+                    .into_iter()
+                    .chain(iter::once(wildcard_additional_options.span())),
+            ),
+            SelectItem::Wildcard(wildcard_additional_options) => wildcard_additional_options.span(),
+        }
+    }
+}
+
+impl Spanned for WildcardAdditionalOptions {
+    fn span(&self) -> Span {
+        let WildcardAdditionalOptions {
+            wildcard_token,
+            opt_ilike,
+            opt_exclude,
+            opt_except,
+            opt_replace,
+            opt_rename,
+        } = self;
+
+        union_spans(
+            core::iter::once(wildcard_token.0.span)
+                .chain(opt_ilike.as_ref().map(|i| i.span()))
+                .chain(opt_exclude.as_ref().map(|i| i.span()))
+                .chain(opt_rename.as_ref().map(|i| i.span()))
+                .chain(opt_replace.as_ref().map(|i| i.span()))
+                .chain(opt_except.as_ref().map(|i| i.span())),
+        )
+    }
+}
+
+/// # missing span
+impl Spanned for IlikeSelectItem {
+    fn span(&self) -> Span {
+        Span::empty()
+    }
+}
+
+impl Spanned for ExcludeSelectItem {
+    fn span(&self) -> Span {
+        match self {
+            ExcludeSelectItem::Single(ident) => ident.span,
+            ExcludeSelectItem::Multiple(vec) => union_spans(vec.iter().map(|i| i.span)),
+        }
+    }
+}
+
+impl Spanned for RenameSelectItem {
+    fn span(&self) -> Span {
+        match self {
+            RenameSelectItem::Single(ident) => ident.ident.span.union(&ident.alias.span),
+            RenameSelectItem::Multiple(vec) => {
+                union_spans(vec.iter().map(|i| i.ident.span.union(&i.alias.span)))
+            }
+        }
+    }
+}
+
+impl Spanned for ExceptSelectItem {
+    fn span(&self) -> Span {
+        let ExceptSelectItem {
+            first_element,
+            additional_elements,
+        } = self;
+
+        union_spans(
+            iter::once(first_element.span).chain(additional_elements.iter().map(|i| i.span)),
+        )
+    }
+}
+
+impl Spanned for ReplaceSelectItem {
+    fn span(&self) -> Span {
+        let ReplaceSelectItem { items } = self;
+
+        union_spans(items.iter().map(|i| i.span()))
+    }
+}
+
+impl Spanned for ReplaceSelectElement {
+    fn span(&self) -> Span {
+        let ReplaceSelectElement {
+            expr,
+            column_name,
+            as_keyword: _, // bool
+        } = self;
+
+        expr.span().union(&column_name.span)
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [TableFactor::JsonTable]
+impl Spanned for TableFactor {
+    fn span(&self) -> Span {
+        match self {
+            TableFactor::Table {
+                name,
+                alias,
+                args: _,
+                with_hints: _,
+                version: _,
+                with_ordinality: _,
+                partitions: _,
+                json_path: _,
+                sample: _,
+                index_hints: _,
+            } => union_spans(
+                name.0
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(alias.as_ref().map(|alias| {
+                        union_spans(
+                            iter::once(alias.name.span)
+                                .chain(alias.columns.iter().map(|i| i.span())),
+                        )
+                    })),
+            ),
+            TableFactor::Derived {
+                lateral: _,
+                subquery,
+                alias,
+            } => subquery
+                .span()
+                .union_opt(&alias.as_ref().map(|alias| alias.span())),
+            TableFactor::TableFunction { expr, alias } => expr
+                .span()
+                .union_opt(&alias.as_ref().map(|alias| alias.span())),
+            TableFactor::UNNEST {
+                alias,
+                with_offset: _,
+                with_offset_alias,
+                array_exprs,
+                with_ordinality: _,
+            } => union_spans(
+                alias
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(array_exprs.iter().map(|i| i.span()))
+                    .chain(with_offset_alias.as_ref().map(|i| i.span)),
+            ),
+            TableFactor::NestedJoin {
+                table_with_joins,
+                alias,
+            } => table_with_joins
+                .span()
+                .union_opt(&alias.as_ref().map(|alias| alias.span())),
+            TableFactor::Function {
+                lateral: _,
+                name,
+                args,
+                alias,
+            } => union_spans(
+                name.0
+                    .iter()
+                    .map(|i| i.span())
+                    .chain(args.iter().map(|i| i.span()))
+                    .chain(alias.as_ref().map(|alias| alias.span())),
+            ),
+            TableFactor::JsonTable { .. } => Span::empty(),
+            TableFactor::XmlTable { .. } => Span::empty(),
+            TableFactor::Pivot {
+                table,
+                aggregate_functions,
+                value_column,
+                value_source,
+                default_on_null,
+                alias,
+            } => union_spans(
+                core::iter::once(table.span())
+                    .chain(aggregate_functions.iter().map(|i| i.span()))
+                    .chain(value_column.iter().map(|i| i.span))
+                    .chain(core::iter::once(value_source.span()))
+                    .chain(default_on_null.as_ref().map(|i| i.span()))
+                    .chain(alias.as_ref().map(|i| i.span())),
+            ),
+            TableFactor::Unpivot {
+                table,
+                value,
+                null_inclusion: _,
+                name,
+                columns,
+                alias,
+            } => union_spans(
+                core::iter::once(table.span())
+                    .chain(core::iter::once(value.span()))
+                    .chain(core::iter::once(name.span))
+                    .chain(columns.iter().map(|ilist| ilist.span()))
+                    .chain(alias.as_ref().map(|alias| alias.span())),
+            ),
+            TableFactor::MatchRecognize {
+                table,
+                partition_by,
+                order_by,
+                measures,
+                rows_per_match: _,
+                after_match_skip: _,
+                pattern,
+                symbols,
+                alias,
+            } => union_spans(
+                core::iter::once(table.span())
+                    .chain(partition_by.iter().map(|i| i.span()))
+                    .chain(order_by.iter().map(|i| i.span()))
+                    .chain(measures.iter().map(|i| i.span()))
+                    .chain(core::iter::once(pattern.span()))
+                    .chain(symbols.iter().map(|i| i.span()))
+                    .chain(alias.as_ref().map(|i| i.span())),
+            ),
+            TableFactor::OpenJsonTable { .. } => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for PivotValueSource {
+    fn span(&self) -> Span {
+        match self {
+            PivotValueSource::List(vec) => union_spans(vec.iter().map(|i| i.span())),
+            PivotValueSource::Any(vec) => union_spans(vec.iter().map(|i| i.span())),
+            PivotValueSource::Subquery(query) => query.span(),
+        }
+    }
+}
+
+impl Spanned for ExprWithAlias {
+    fn span(&self) -> Span {
+        let ExprWithAlias { expr, alias } = self;
+
+        expr.span().union_opt(&alias.as_ref().map(|i| i.span))
+    }
+}
+
+/// # missing span
+impl Spanned for MatchRecognizePattern {
+    fn span(&self) -> Span {
+        Span::empty()
+    }
+}
+
+impl Spanned for SymbolDefinition {
+    fn span(&self) -> Span {
+        let SymbolDefinition { symbol, definition } = self;
+
+        symbol.span.union(&definition.span())
+    }
+}
+
+impl Spanned for Measure {
+    fn span(&self) -> Span {
+        let Measure { expr, alias } = self;
+
+        expr.span().union(&alias.span)
+    }
+}
+
+impl Spanned for OrderByExpr {
+    fn span(&self) -> Span {
+        let OrderByExpr {
+            expr,
+            options: _,
+            with_fill,
+        } = self;
+
+        expr.span().union_opt(&with_fill.as_ref().map(|f| f.span()))
+    }
+}
+
+impl Spanned for WithFill {
+    fn span(&self) -> Span {
+        let WithFill { from, to, step } = self;
+
+        union_spans(
+            from.iter()
+                .map(|f| f.span())
+                .chain(to.iter().map(|t| t.span()))
+                .chain(step.iter().map(|s| s.span())),
+        )
+    }
+}
+
+impl Spanned for FunctionArg {
+    fn span(&self) -> Span {
+        match self {
+            FunctionArg::Named {
+                name,
+                arg,
+                operator: _,
+            } => name.span.union(&arg.span()),
+            FunctionArg::Unnamed(arg) => arg.span(),
+            FunctionArg::ExprNamed {
+                name,
+                arg,
+                operator: _,
+            } => name.span().union(&arg.span()),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [FunctionArgExpr::Wildcard]
+impl Spanned for FunctionArgExpr {
+    fn span(&self) -> Span {
+        match self {
+            FunctionArgExpr::Expr(expr) => expr.span(),
+            FunctionArgExpr::QualifiedWildcard(object_name) => {
+                union_spans(object_name.0.iter().map(|i| i.span()))
+            }
+            FunctionArgExpr::Wildcard => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for TableAlias {
+    fn span(&self) -> Span {
+        let TableAlias { name, columns } = self;
+
+        union_spans(iter::once(name.span).chain(columns.iter().map(|i| i.span())))
+    }
+}
+
+impl Spanned for TableAliasColumnDef {
+    fn span(&self) -> Span {
+        let TableAliasColumnDef { name, data_type: _ } = self;
+
+        name.span
+    }
+}
+
+impl Spanned for ValueWithSpan {
+    fn span(&self) -> Span {
+        self.span
+    }
+}
+
+/// The span is stored in the `ValueWrapper` struct
+impl Spanned for Value {
+    fn span(&self) -> Span {
+        Span::empty() // # todo: Value needs to store spans before this is possible
+    }
+}
+
+impl Spanned for Join {
+    fn span(&self) -> Span {
+        let Join {
+            relation,
+            global: _, // bool
+            join_operator,
+        } = self;
+
+        relation.span().union(&join_operator.span())
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [JoinOperator::CrossJoin]
+/// - [JoinOperator::CrossApply]
+/// - [JoinOperator::OuterApply]
+impl Spanned for JoinOperator {
+    fn span(&self) -> Span {
+        match self {
+            JoinOperator::Join(join_constraint) => join_constraint.span(),
+            JoinOperator::Inner(join_constraint) => join_constraint.span(),
+            JoinOperator::Left(join_constraint) => join_constraint.span(),
+            JoinOperator::LeftOuter(join_constraint) => join_constraint.span(),
+            JoinOperator::Right(join_constraint) => join_constraint.span(),
+            JoinOperator::RightOuter(join_constraint) => join_constraint.span(),
+            JoinOperator::FullOuter(join_constraint) => join_constraint.span(),
+            JoinOperator::CrossJoin => Span::empty(),
+            JoinOperator::LeftSemi(join_constraint) => join_constraint.span(),
+            JoinOperator::RightSemi(join_constraint) => join_constraint.span(),
+            JoinOperator::LeftAnti(join_constraint) => join_constraint.span(),
+            JoinOperator::RightAnti(join_constraint) => join_constraint.span(),
+            JoinOperator::CrossApply => Span::empty(),
+            JoinOperator::OuterApply => Span::empty(),
+            JoinOperator::AsOf {
+                match_condition,
+                constraint,
+            } => match_condition.span().union(&constraint.span()),
+            JoinOperator::Anti(join_constraint) => join_constraint.span(),
+            JoinOperator::Semi(join_constraint) => join_constraint.span(),
+            JoinOperator::StraightJoin(join_constraint) => join_constraint.span(),
+        }
+    }
+}
+
+/// # partial span
+///
+/// Missing spans:
+/// - [JoinConstraint::Natural]
+/// - [JoinConstraint::None]
+impl Spanned for JoinConstraint {
+    fn span(&self) -> Span {
+        match self {
+            JoinConstraint::On(expr) => expr.span(),
+            JoinConstraint::Using(vec) => union_spans(vec.iter().map(|i| i.span())),
+            JoinConstraint::Natural => Span::empty(),
+            JoinConstraint::None => Span::empty(),
+        }
+    }
+}
+
+impl Spanned for TableWithJoins {
+    fn span(&self) -> Span {
+        let TableWithJoins { relation, joins } = self;
+
+        union_spans(core::iter::once(relation.span()).chain(joins.iter().map(|item| item.span())))
+    }
+}
+
+impl Spanned for Select {
+    fn span(&self) -> Span {
+        let Select {
+            select_token,
+            distinct: _, // todo
+            top: _,      // todo, mysql specific
+            projection,
+            exclude: _,
+            into,
+            from,
+            lateral_views,
+            prewhere,
+            selection,
+            group_by,
+            cluster_by,
+            distribute_by,
+            sort_by,
+            having,
+            named_window,
+            qualify,
+            window_before_qualify: _, // bool
+            value_table_mode: _,      // todo, BigQuery specific
+            connect_by,
+            top_before_distinct: _,
+            flavor: _,
+        } = self;
+
+        union_spans(
+            core::iter::once(select_token.0.span)
+                .chain(projection.iter().map(|item| item.span()))
+                .chain(into.iter().map(|item| item.span()))
+                .chain(from.iter().map(|item| item.span()))
+                .chain(lateral_views.iter().map(|item| item.span()))
+                .chain(prewhere.iter().map(|item| item.span()))
+                .chain(selection.iter().map(|item| item.span()))
+                .chain(core::iter::once(group_by.span()))
+                .chain(cluster_by.iter().map(|item| item.span()))
+                .chain(distribute_by.iter().map(|item| item.span()))
+                .chain(sort_by.iter().map(|item| item.span()))
+                .chain(having.iter().map(|item| item.span()))
+                .chain(named_window.iter().map(|item| item.span()))
+                .chain(qualify.iter().map(|item| item.span()))
+                .chain(connect_by.iter().map(|item| item.span())),
+        )
+    }
+}
+
+impl Spanned for ConnectBy {
+    fn span(&self) -> Span {
+        let ConnectBy {
+            condition,
+            relationships,
+        } = self;
+
+        union_spans(
+            core::iter::once(condition.span()).chain(relationships.iter().map(|item| item.span())),
+        )
+    }
+}
+
+impl Spanned for NamedWindowDefinition {
+    fn span(&self) -> Span {
+        let NamedWindowDefinition(
+            ident,
+            _, // todo: NamedWindowExpr
+        ) = self;
+
+        ident.span
+    }
+}
+
+impl Spanned for LateralView {
+    fn span(&self) -> Span {
+        let LateralView {
+            lateral_view,
+            lateral_view_name,
+            lateral_col_alias,
+            outer: _, // bool
+        } = self;
+
+        union_spans(
+            core::iter::once(lateral_view.span())
+                .chain(core::iter::once(lateral_view_name.span()))
+                .chain(lateral_col_alias.iter().map(|i| i.span)),
+        )
+    }
+}
+
+impl Spanned for SelectInto {
+    fn span(&self) -> Span {
+        let SelectInto {
+            temporary: _, // bool
+            unlogged: _,  // bool
+            table: _,     // bool
+            name,
+        } = self;
+
+        name.span()
+    }
+}
+
+impl Spanned for UpdateTableFromKind {
+    fn span(&self) -> Span {
+        let from = match self {
+            UpdateTableFromKind::BeforeSet(from) => from,
+            UpdateTableFromKind::AfterSet(from) => from,
+        };
+        union_spans(from.iter().map(|t| t.span()))
+    }
+}
+
+impl Spanned for TableObject {
+    fn span(&self) -> Span {
+        match self {
+            TableObject::TableName(ObjectName(segments)) => {
+                union_spans(segments.iter().map(|i| i.span()))
+            }
+            TableObject::TableFunction(func) => func.span(),
+        }
+    }
+}
+
+impl Spanned for BeginEndStatements {
+    fn span(&self) -> Span {
+        let BeginEndStatements {
+            begin_token,
+            statements,
+            end_token,
+        } = self;
+        union_spans(
+            core::iter::once(begin_token.0.span)
+                .chain(statements.iter().map(|i| i.span()))
+                .chain(core::iter::once(end_token.0.span)),
+        )
+    }
+}
+
+impl Spanned for OpenStatement {
+    fn span(&self) -> Span {
+        let OpenStatement { cursor_name } = self;
+        cursor_name.span
+    }
+}
+
+#[cfg(test)]
+pub mod tests {
+    use crate::dialect::{Dialect, GenericDialect, SnowflakeDialect};
+    use crate::parser::Parser;
+    use crate::tokenizer::Span;
+
+    use super::*;
+
+    struct SpanTest<'a>(Parser<'a>, &'a str);
+
+    impl<'a> SpanTest<'a> {
+        fn new(dialect: &'a dyn Dialect, sql: &'a str) -> Self {
+            Self(Parser::new(dialect).try_with_sql(sql).unwrap(), sql)
+        }
+
+        // get the subsection of the source string that corresponds to the span
+        // only works on single-line strings
+        fn get_source(&self, span: Span) -> &'a str {
+            // lines in spans are 1-indexed
+            &self.1[(span.start.column as usize - 1)..(span.end.column - 1) as usize]
+        }
+    }
+
+    #[test]
+    fn test_join() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(
+            dialect,
+            "SELECT id, name FROM users LEFT JOIN companies ON users.company_id = companies.id",
+        );
+
+        let query = test.0.parse_select().unwrap();
+        let select_span = query.span();
+
+        assert_eq!(
+            test.get_source(select_span),
+            "SELECT id, name FROM users LEFT JOIN companies ON users.company_id = companies.id"
+        );
+
+        let join_span = query.from[0].joins[0].span();
+
+        // 'LEFT JOIN' missing
+        assert_eq!(
+            test.get_source(join_span),
+            "companies ON users.company_id = companies.id"
+        );
+    }
+
+    #[test]
+    pub fn test_union() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(
+            dialect,
+            "SELECT a FROM postgres.public.source UNION SELECT a FROM postgres.public.source",
+        );
+
+        let query = test.0.parse_query().unwrap();
+        let select_span = query.span();
+
+        assert_eq!(
+            test.get_source(select_span),
+            "SELECT a FROM postgres.public.source UNION SELECT a FROM postgres.public.source"
+        );
+    }
+
+    #[test]
+    pub fn test_subquery() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(
+            dialect,
+            "SELECT a FROM (SELECT a FROM postgres.public.source) AS b",
+        );
+
+        let query = test.0.parse_select().unwrap();
+        let select_span = query.span();
+
+        assert_eq!(
+            test.get_source(select_span),
+            "SELECT a FROM (SELECT a FROM postgres.public.source) AS b"
+        );
+
+        let subquery_span = query.from[0].span();
+
+        // left paren missing
+        assert_eq!(
+            test.get_source(subquery_span),
+            "SELECT a FROM postgres.public.source) AS b"
+        );
+    }
+
+    #[test]
+    pub fn test_cte() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(dialect, "WITH cte_outer AS (SELECT a FROM postgres.public.source), cte_ignored AS (SELECT a FROM cte_outer), cte_inner AS (SELECT a FROM cte_outer) SELECT a FROM cte_inner");
+
+        let query = test.0.parse_query().unwrap();
+
+        let select_span = query.span();
+
+        assert_eq!(test.get_source(select_span), "WITH cte_outer AS (SELECT a FROM postgres.public.source), cte_ignored AS (SELECT a FROM cte_outer), cte_inner AS (SELECT a FROM cte_outer) SELECT a FROM cte_inner");
+    }
+
+    #[test]
+    pub fn test_snowflake_lateral_flatten() {
+        let dialect = &SnowflakeDialect;
+        let mut test = SpanTest::new(dialect, "SELECT FLATTENED.VALUE:field::TEXT AS FIELD FROM SNOWFLAKE.SCHEMA.SOURCE AS S, LATERAL FLATTEN(INPUT => S.JSON_ARRAY) AS FLATTENED");
+
+        let query = test.0.parse_select().unwrap();
+
+        let select_span = query.span();
+
+        assert_eq!(test.get_source(select_span), "SELECT FLATTENED.VALUE:field::TEXT AS FIELD FROM SNOWFLAKE.SCHEMA.SOURCE AS S, LATERAL FLATTEN(INPUT => S.JSON_ARRAY) AS FLATTENED");
+    }
+
+    #[test]
+    pub fn test_wildcard_from_cte() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(
+            dialect,
+            "WITH cte AS (SELECT a FROM postgres.public.source) SELECT cte.* FROM cte",
+        );
+
+        let query = test.0.parse_query().unwrap();
+        let cte_span = query.clone().with.unwrap().cte_tables[0].span();
+        let cte_query_span = query.clone().with.unwrap().cte_tables[0].query.span();
+        let body_span = query.body.span();
+
+        // the WITH keyboard is part of the query
+        assert_eq!(
+            test.get_source(cte_span),
+            "cte AS (SELECT a FROM postgres.public.source)"
+        );
+        assert_eq!(
+            test.get_source(cte_query_span),
+            "SELECT a FROM postgres.public.source"
+        );
+
+        assert_eq!(test.get_source(body_span), "SELECT cte.* FROM cte");
+    }
+
+    #[test]
+    fn test_case_expr_span() {
+        let dialect = &GenericDialect;
+        let mut test = SpanTest::new(dialect, "CASE 1 WHEN 2 THEN 3 ELSE 4 END");
+        let expr = test.0.parse_expr().unwrap();
+        let expr_span = expr.span();
+        assert_eq!(
+            test.get_source(expr_span),
+            "CASE 1 WHEN 2 THEN 3 ELSE 4 END"
+        );
+    }
+
+    #[test]
+    fn test_placeholder_span() {
+        let sql = "\nSELECT\n  :fooBar";
+        let r = Parser::parse_sql(&GenericDialect, sql).unwrap();
+        assert_eq!(1, r.len());
+        match &r[0] {
+            Statement::Query(q) => {
+                let col = &q.body.as_select().unwrap().projection[0];
+                match col {
+                    SelectItem::UnnamedExpr(Expr::Value(ValueWithSpan {
+                        value: Value::Placeholder(s),
+                        span,
+                    })) => {
+                        assert_eq!(":fooBar", s);
+                        assert_eq!(&Span::new((3, 3).into(), (3, 10).into()), span);
+                    }
+                    _ => panic!("expected unnamed expression; got {col:?}"),
+                }
+            }
+            stmt => panic!("expected query; got {stmt:?}"),
+        }
+    }
+}
diff --git a/src/ast/trigger.rs b/src/ast/trigger.rs
index cf1c8c466..2c64e4239 100644
--- a/src/ast/trigger.rs
+++ b/src/ast/trigger.rs
@@ -110,6 +110,7 @@ impl fmt::Display for TriggerEvent {
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum TriggerPeriod {
+    For,
     After,
     Before,
     InsteadOf,
@@ -118,6 +119,7 @@ pub enum TriggerPeriod {
 impl fmt::Display for TriggerPeriod {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
+            TriggerPeriod::For => write!(f, "FOR"),
             TriggerPeriod::After => write!(f, "AFTER"),
             TriggerPeriod::Before => write!(f, "BEFORE"),
             TriggerPeriod::InsteadOf => write!(f, "INSTEAD OF"),
diff --git a/src/ast/value.rs b/src/ast/value.rs
index 30d956a07..fdfa6a674 100644
--- a/src/ast/value.rs
+++ b/src/ast/value.rs
@@ -26,14 +26,96 @@ use bigdecimal::BigDecimal;
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
 
-use crate::ast::Ident;
+use crate::{ast::Ident, tokenizer::Span};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
+/// Wraps a primitive SQL [`Value`]  with its [`Span`] location
+///
+/// # Example: create a `ValueWithSpan` from a `Value`
+/// ```
+/// # use sqlparser::ast::{Value, ValueWithSpan};
+/// # use sqlparser::tokenizer::{Location, Span};
+/// let value = Value::SingleQuotedString(String::from("endpoint"));
+/// // from line 1, column 1 to line 1, column 7
+/// let span = Span::new(Location::new(1, 1), Location::new(1, 7));
+/// let value_with_span = value.with_span(span);
+/// ```
+///
+/// # Example: create a `ValueWithSpan` from a `Value` with an empty span
+///
+/// You can call [`Value::with_empty_span`] to create a `ValueWithSpan` with an empty span
+/// ```
+/// # use sqlparser::ast::{Value, ValueWithSpan};
+/// # use sqlparser::tokenizer::{Location, Span};
+/// let value = Value::SingleQuotedString(String::from("endpoint"));
+/// let value_with_span = value.with_empty_span();
+/// assert_eq!(value_with_span.span, Span::empty());
+/// ```
+///
+/// You can also use the [`From`] trait to convert  `ValueWithSpan` to/from `Value`s
+/// ```
+/// # use sqlparser::ast::{Value, ValueWithSpan};
+/// # use sqlparser::tokenizer::{Location, Span};
+/// let value = Value::SingleQuotedString(String::from("endpoint"));
+/// // converting `Value` to `ValueWithSpan` results in an empty span
+/// let value_with_span: ValueWithSpan = value.into();
+/// assert_eq!(value_with_span.span, Span::empty());
+/// // convert back to `Value`
+/// let value: Value = value_with_span.into();
+/// ```
+#[derive(Debug, Clone, Eq)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct ValueWithSpan {
+    pub value: Value,
+    pub span: Span,
+}
+
+impl PartialEq for ValueWithSpan {
+    fn eq(&self, other: &Self) -> bool {
+        self.value == other.value
+    }
+}
+
+impl Ord for ValueWithSpan {
+    fn cmp(&self, other: &Self) -> core::cmp::Ordering {
+        self.value.cmp(&other.value)
+    }
+}
+
+impl PartialOrd for ValueWithSpan {
+    fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
+        Some(Ord::cmp(self, other))
+    }
+}
+
+impl core::hash::Hash for ValueWithSpan {
+    fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
+        self.value.hash(state);
+    }
+}
+
+impl From<Value> for ValueWithSpan {
+    fn from(value: Value) -> Self {
+        value.with_empty_span()
+    }
+}
+
+impl From<ValueWithSpan> for Value {
+    fn from(value: ValueWithSpan) -> Self {
+        value.value
+    }
+}
+
 /// Primitive SQL values such as number and string
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+#[cfg_attr(
+    feature = "visitor",
+    derive(Visit, VisitMut),
+    visit(with = "visit_value")
+)]
 pub enum Value {
     /// Numeric literal
     #[cfg(not(feature = "bigdecimal"))]
@@ -97,6 +179,53 @@ pub enum Value {
     Placeholder(String),
 }
 
+impl ValueWithSpan {
+    /// If the underlying literal is a string, regardless of quote style, returns the associated string value
+    pub fn into_string(self) -> Option<String> {
+        self.value.into_string()
+    }
+}
+
+impl Value {
+    /// If the underlying literal is a string, regardless of quote style, returns the associated string value
+    pub fn into_string(self) -> Option<String> {
+        match self {
+            Value::SingleQuotedString(s)
+            | Value::DoubleQuotedString(s)
+            | Value::TripleSingleQuotedString(s)
+            | Value::TripleDoubleQuotedString(s)
+            | Value::SingleQuotedByteStringLiteral(s)
+            | Value::DoubleQuotedByteStringLiteral(s)
+            | Value::TripleSingleQuotedByteStringLiteral(s)
+            | Value::TripleDoubleQuotedByteStringLiteral(s)
+            | Value::SingleQuotedRawStringLiteral(s)
+            | Value::DoubleQuotedRawStringLiteral(s)
+            | Value::TripleSingleQuotedRawStringLiteral(s)
+            | Value::TripleDoubleQuotedRawStringLiteral(s)
+            | Value::EscapedStringLiteral(s)
+            | Value::UnicodeStringLiteral(s)
+            | Value::NationalStringLiteral(s)
+            | Value::HexStringLiteral(s) => Some(s),
+            Value::DollarQuotedString(s) => Some(s.value),
+            _ => None,
+        }
+    }
+
+    pub fn with_span(self, span: Span) -> ValueWithSpan {
+        ValueWithSpan { value: self, span }
+    }
+
+    pub fn with_empty_span(self) -> ValueWithSpan {
+        self.with_span(Span::empty())
+    }
+}
+
+impl fmt::Display for ValueWithSpan {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.value)
+    }
+}
+
 impl fmt::Display for Value {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
@@ -155,7 +284,9 @@ impl fmt::Display for DollarQuotedString {
 #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub enum DateTimeField {
     Year,
+    Years,
     Month,
+    Months,
     /// Week optionally followed by a WEEKDAY.
     ///
     /// ```sql
@@ -164,14 +295,19 @@ pub enum DateTimeField {
     ///
     /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions#extract)
     Week(Option<Ident>),
+    Weeks,
     Day,
     DayOfWeek,
     DayOfYear,
+    Days,
     Date,
     Datetime,
     Hour,
+    Hours,
     Minute,
+    Minutes,
     Second,
+    Seconds,
     Century,
     Decade,
     Dow,
@@ -210,7 +346,9 @@ impl fmt::Display for DateTimeField {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
             DateTimeField::Year => write!(f, "YEAR"),
+            DateTimeField::Years => write!(f, "YEARS"),
             DateTimeField::Month => write!(f, "MONTH"),
+            DateTimeField::Months => write!(f, "MONTHS"),
             DateTimeField::Week(week_day) => {
                 write!(f, "WEEK")?;
                 if let Some(week_day) = week_day {
@@ -218,14 +356,19 @@ impl fmt::Display for DateTimeField {
                 }
                 Ok(())
             }
+            DateTimeField::Weeks => write!(f, "WEEKS"),
             DateTimeField::Day => write!(f, "DAY"),
             DateTimeField::DayOfWeek => write!(f, "DAYOFWEEK"),
             DateTimeField::DayOfYear => write!(f, "DAYOFYEAR"),
+            DateTimeField::Days => write!(f, "DAYS"),
             DateTimeField::Date => write!(f, "DATE"),
             DateTimeField::Datetime => write!(f, "DATETIME"),
             DateTimeField::Hour => write!(f, "HOUR"),
+            DateTimeField::Hours => write!(f, "HOURS"),
             DateTimeField::Minute => write!(f, "MINUTE"),
+            DateTimeField::Minutes => write!(f, "MINUTES"),
             DateTimeField::Second => write!(f, "SECOND"),
+            DateTimeField::Seconds => write!(f, "SECONDS"),
             DateTimeField::Century => write!(f, "CENTURY"),
             DateTimeField::Decade => write!(f, "DECADE"),
             DateTimeField::Dow => write!(f, "DOW"),
@@ -256,12 +399,41 @@ impl fmt::Display for DateTimeField {
     }
 }
 
+#[derive(Debug, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+/// The Unicode Standard defines four normalization forms, which are intended to eliminate
+/// certain distinctions between visually or functionally identical characters.
+///
+/// See [Unicode Normalization Forms](https://unicode.org/reports/tr15/) for details.
+pub enum NormalizationForm {
+    /// Canonical Decomposition, followed by Canonical Composition.
+    NFC,
+    /// Canonical Decomposition.
+    NFD,
+    /// Compatibility Decomposition, followed by Canonical Composition.
+    NFKC,
+    /// Compatibility Decomposition.
+    NFKD,
+}
+
+impl fmt::Display for NormalizationForm {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            NormalizationForm::NFC => write!(f, "NFC"),
+            NormalizationForm::NFD => write!(f, "NFD"),
+            NormalizationForm::NFKC => write!(f, "NFKC"),
+            NormalizationForm::NFKD => write!(f, "NFKD"),
+        }
+    }
+}
+
 pub struct EscapeQuotedString<'a> {
     string: &'a str,
     quote: char,
 }
 
-impl<'a> fmt::Display for EscapeQuotedString<'a> {
+impl fmt::Display for EscapeQuotedString<'_> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         // EscapeQuotedString doesn't know which mode of escape was
         // chosen by the user. So this code must to correctly display
@@ -283,30 +455,38 @@ impl<'a> fmt::Display for EscapeQuotedString<'a> {
         // | `"A\"B\"A"`    | default   | `DoubleQuotedString(String::from("A\"B\"A"))`      | `"A""B""A"`  |
         let quote = self.quote;
         let mut previous_char = char::default();
-        let mut peekable_chars = self.string.chars().peekable();
-        while let Some(&ch) = peekable_chars.peek() {
+        let mut start_idx = 0;
+        let mut peekable_chars = self.string.char_indices().peekable();
+        while let Some(&(idx, ch)) = peekable_chars.peek() {
             match ch {
                 char if char == quote => {
                     if previous_char == '\\' {
-                        write!(f, "{char}")?;
+                        // the quote is already escaped with a backslash, skip
                         peekable_chars.next();
                         continue;
                     }
                     peekable_chars.next();
-                    if peekable_chars.peek().map(|c| *c == quote).unwrap_or(false) {
-                        write!(f, "{char}{char}")?;
-                        peekable_chars.next();
-                    } else {
-                        write!(f, "{char}{char}")?;
+                    match peekable_chars.peek() {
+                        Some((_, c)) if *c == quote => {
+                            // the quote is already escaped with another quote, skip
+                            peekable_chars.next();
+                        }
+                        _ => {
+                            // The quote is not escaped.
+                            // Including idx in the range, so the quote at idx will be printed twice:
+                            // in this call to write_str() and in the next one.
+                            f.write_str(&self.string[start_idx..=idx])?;
+                            start_idx = idx;
+                        }
                     }
                 }
                 _ => {
-                    write!(f, "{ch}")?;
                     peekable_chars.next();
                 }
             }
             previous_char = ch;
         }
+        f.write_str(&self.string[start_idx..])?;
         Ok(())
     }
 }
@@ -325,7 +505,7 @@ pub fn escape_double_quote_string(s: &str) -> EscapeQuotedString<'_> {
 
 pub struct EscapeEscapedStringLiteral<'a>(&'a str);
 
-impl<'a> fmt::Display for EscapeEscapedStringLiteral<'a> {
+impl fmt::Display for EscapeEscapedStringLiteral<'_> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         for c in self.0.chars() {
             match c {
@@ -359,7 +539,7 @@ pub fn escape_escaped_string(s: &str) -> EscapeEscapedStringLiteral<'_> {
 
 pub struct EscapeUnicodeStringLiteral<'a>(&'a str);
 
-impl<'a> fmt::Display for EscapeUnicodeStringLiteral<'a> {
+impl fmt::Display for EscapeUnicodeStringLiteral<'_> {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         for c in self.0.chars() {
             match c {
@@ -370,16 +550,16 @@ impl<'a> fmt::Display for EscapeUnicodeStringLiteral<'a> {
                     write!(f, r#"\\"#)?;
                 }
                 x if x.is_ascii() => {
-                    write!(f, "{}", c)?;
+                    write!(f, "{c}")?;
                 }
                 _ => {
                     let codepoint = c as u32;
                     // if the character fits in 32 bits, we can use the \XXXX format
                     // otherwise, we need to use the \+XXXXXX format
                     if codepoint <= 0xFFFF {
-                        write!(f, "\\{:04X}", codepoint)?;
+                        write!(f, "\\{codepoint:04X}")?;
                     } else {
-                        write!(f, "\\+{:06X}", codepoint)?;
+                        write!(f, "\\+{codepoint:06X}")?;
                     }
                 }
             }
diff --git a/src/ast/visitor.rs b/src/ast/visitor.rs
index 418e0a299..8e0a3139a 100644
--- a/src/ast/visitor.rs
+++ b/src/ast/visitor.rs
@@ -17,7 +17,7 @@
 
 //! Recursive visitors for ast Nodes. See [`Visitor`] for more details.
 
-use crate::ast::{Expr, ObjectName, Query, Statement, TableFactor};
+use crate::ast::{Expr, ObjectName, Query, Statement, TableFactor, Value};
 use core::ops::ControlFlow;
 
 /// A type that can be visited by a [`Visitor`]. See [`Visitor`] for
@@ -233,6 +233,16 @@ pub trait Visitor {
     fn post_visit_statement(&mut self, _statement: &Statement) -> ControlFlow<Self::Break> {
         ControlFlow::Continue(())
     }
+
+    /// Invoked for any Value that appear in the AST before visiting children
+    fn pre_visit_value(&mut self, _value: &Value) -> ControlFlow<Self::Break> {
+        ControlFlow::Continue(())
+    }
+
+    /// Invoked for any Value that appear in the AST after visiting children
+    fn post_visit_value(&mut self, _value: &Value) -> ControlFlow<Self::Break> {
+        ControlFlow::Continue(())
+    }
 }
 
 /// A visitor that can be used to mutate an AST tree.
@@ -337,6 +347,16 @@ pub trait VisitorMut {
     fn post_visit_statement(&mut self, _statement: &mut Statement) -> ControlFlow<Self::Break> {
         ControlFlow::Continue(())
     }
+
+    /// Invoked for any value that appear in the AST before visiting children
+    fn pre_visit_value(&mut self, _value: &mut Value) -> ControlFlow<Self::Break> {
+        ControlFlow::Continue(())
+    }
+
+    /// Invoked for any statements that appear in the AST after visiting children
+    fn post_visit_value(&mut self, _value: &mut Value) -> ControlFlow<Self::Break> {
+        ControlFlow::Continue(())
+    }
 }
 
 struct RelationVisitor<F>(F);
@@ -403,7 +423,7 @@ where
 /// ```
 /// # use sqlparser::parser::Parser;
 /// # use sqlparser::dialect::GenericDialect;
-/// # use sqlparser::ast::{ObjectName, visit_relations_mut};
+/// # use sqlparser::ast::{ObjectName, ObjectNamePart, Ident, visit_relations_mut};
 /// # use core::ops::ControlFlow;
 /// let sql = "SELECT a FROM foo";
 /// let mut statements = Parser::parse_sql(&GenericDialect{}, sql)
@@ -411,7 +431,7 @@ where
 ///
 /// // visit statements, renaming table foo to bar
 /// visit_relations_mut(&mut statements, |table| {
-///   table.0[0].value = table.0[0].value.replace("foo", "bar");
+///   table.0[0] = ObjectNamePart::Identifier(Ident::new("bar"));
 ///   ControlFlow::<()>::Continue(())
 /// });
 ///
@@ -503,7 +523,7 @@ where
 /// // Remove all select limits in sub-queries
 /// visit_expressions_mut(&mut statements, |expr| {
 ///   if let Expr::Subquery(q) = expr {
-///      q.limit = None
+///      q.limit_clause = None;
 ///   }
 ///   ControlFlow::<()>::Continue(())
 /// });
@@ -527,9 +547,10 @@ where
 ///
 /// visit_expressions_mut(&mut statements, |expr| {
 ///   if matches!(expr, Expr::Identifier(col_name) if col_name.value == "x") {
-///     let old_expr = std::mem::replace(expr, Expr::Value(Value::Null));
+///     let old_expr = std::mem::replace(expr, Expr::value(Value::Null));
 ///     *expr = Expr::Function(Function {
-///           name: ObjectName(vec![Ident::new("f")]),
+///           name: ObjectName::from(vec![Ident::new("f")]),
+///           uses_odbc_syntax: false,
 ///           args: FunctionArguments::List(FunctionArgumentList {
 ///               duplicate_treatment: None,
 ///               args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(old_expr))],
@@ -626,7 +647,7 @@ where
 /// // Remove all select limits in outer statements (not in sub-queries)
 /// visit_statements_mut(&mut statements, |stmt| {
 ///   if let Statement::Query(q) = stmt {
-///      q.limit = None
+///      q.limit_clause = None;
 ///   }
 ///   ControlFlow::<()>::Continue(())
 /// });
@@ -646,6 +667,7 @@ where
 #[cfg(test)]
 mod tests {
     use super::*;
+    use crate::ast::Statement;
     use crate::dialect::GenericDialect;
     use crate::parser::Parser;
     use crate::tokenizer::Tokenizer;
@@ -719,7 +741,7 @@ mod tests {
         }
     }
 
-    fn do_visit(sql: &str) -> Vec<String> {
+    fn do_visit<V: Visitor<Break = ()>>(sql: &str, visitor: &mut V) -> Statement {
         let dialect = GenericDialect {};
         let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
         let s = Parser::new(&dialect)
@@ -727,9 +749,9 @@ mod tests {
             .parse_statement()
             .unwrap();
 
-        let mut visitor = TestVisitor::default();
-        s.visit(&mut visitor);
-        visitor.visited
+        let flow = s.visit(visitor);
+        assert_eq!(flow, ControlFlow::Continue(()));
+        s
     }
 
     #[test]
@@ -876,12 +898,113 @@ mod tests {
                     "POST: QUERY: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID",
                     "POST: STATEMENT: SELECT * FROM monthly_sales PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ORDER BY EMPID",
                 ]
-            )
+            ),
+            (
+                "SHOW COLUMNS FROM t1",
+                vec![
+                    "PRE: STATEMENT: SHOW COLUMNS FROM t1",
+                    "PRE: RELATION: t1",
+                    "POST: RELATION: t1",
+                    "POST: STATEMENT: SHOW COLUMNS FROM t1",
+                ],
+            ),
         ];
         for (sql, expected) in tests {
-            let actual = do_visit(sql);
-            let actual: Vec<_> = actual.iter().map(|x| x.as_str()).collect();
+            let mut visitor = TestVisitor::default();
+            let _ = do_visit(sql, &mut visitor);
+            let actual: Vec<_> = visitor.visited.iter().map(|x| x.as_str()).collect();
             assert_eq!(actual, expected)
         }
     }
+
+    struct QuickVisitor; // [`TestVisitor`] is too slow to iterate over thousands of nodes
+
+    impl Visitor for QuickVisitor {
+        type Break = ();
+    }
+
+    #[test]
+    fn overflow() {
+        let cond = (0..1000)
+            .map(|n| format!("X = {n}"))
+            .collect::<Vec<_>>()
+            .join(" OR ");
+        let sql = format!("SELECT x where {cond}");
+
+        let dialect = GenericDialect {};
+        let tokens = Tokenizer::new(&dialect, sql.as_str()).tokenize().unwrap();
+        let s = Parser::new(&dialect)
+            .with_tokens(tokens)
+            .parse_statement()
+            .unwrap();
+
+        let mut visitor = QuickVisitor {};
+        let flow = s.visit(&mut visitor);
+        assert_eq!(flow, ControlFlow::Continue(()));
+    }
+}
+
+#[cfg(test)]
+mod visit_mut_tests {
+    use crate::ast::{Statement, Value, VisitMut, VisitorMut};
+    use crate::dialect::GenericDialect;
+    use crate::parser::Parser;
+    use crate::tokenizer::Tokenizer;
+    use core::ops::ControlFlow;
+
+    #[derive(Default)]
+    struct MutatorVisitor {
+        index: u64,
+    }
+
+    impl VisitorMut for MutatorVisitor {
+        type Break = ();
+
+        fn pre_visit_value(&mut self, value: &mut Value) -> ControlFlow<Self::Break> {
+            self.index += 1;
+            *value = Value::SingleQuotedString(format!("REDACTED_{}", self.index));
+            ControlFlow::Continue(())
+        }
+
+        fn post_visit_value(&mut self, _value: &mut Value) -> ControlFlow<Self::Break> {
+            ControlFlow::Continue(())
+        }
+    }
+
+    fn do_visit_mut<V: VisitorMut<Break = ()>>(sql: &str, visitor: &mut V) -> Statement {
+        let dialect = GenericDialect {};
+        let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+        let mut s = Parser::new(&dialect)
+            .with_tokens(tokens)
+            .parse_statement()
+            .unwrap();
+
+        let flow = s.visit(visitor);
+        assert_eq!(flow, ControlFlow::Continue(()));
+        s
+    }
+
+    #[test]
+    fn test_value_redact() {
+        let tests = vec![
+            (
+                concat!(
+                    "SELECT * FROM monthly_sales ",
+                    "PIVOT(SUM(a.amount) FOR a.MONTH IN ('JAN', 'FEB', 'MAR', 'APR')) AS p (c, d) ",
+                    "ORDER BY EMPID"
+                ),
+                concat!(
+                    "SELECT * FROM monthly_sales ",
+                    "PIVOT(SUM(a.amount) FOR a.MONTH IN ('REDACTED_1', 'REDACTED_2', 'REDACTED_3', 'REDACTED_4')) AS p (c, d) ",
+                    "ORDER BY EMPID"
+                ),
+            ),
+        ];
+
+        for (sql, expected) in tests {
+            let mut visitor = MutatorVisitor::default();
+            let mutated = do_visit_mut(sql, &mut visitor);
+            assert_eq!(mutated.to_string(), expected)
+        }
+    }
 }
diff --git a/src/dialect/bigquery.rs b/src/dialect/bigquery.rs
index 96633552b..27fd3cca3 100644
--- a/src/dialect/bigquery.rs
+++ b/src/dialect/bigquery.rs
@@ -15,14 +15,53 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use crate::ast::Statement;
 use crate::dialect::Dialect;
+use crate::keywords::Keyword;
+use crate::parser::{Parser, ParserError};
+use crate::tokenizer::Token;
+
+/// These keywords are disallowed as column identifiers. Such that
+/// `SELECT 5 AS <col> FROM T` is rejected by BigQuery.
+const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
+    Keyword::WITH,
+    Keyword::SELECT,
+    Keyword::WHERE,
+    Keyword::GROUP,
+    Keyword::HAVING,
+    Keyword::ORDER,
+    Keyword::LATERAL,
+    Keyword::LIMIT,
+    Keyword::FETCH,
+    Keyword::UNION,
+    Keyword::EXCEPT,
+    Keyword::INTERSECT,
+    Keyword::FROM,
+    Keyword::INTO,
+    Keyword::END,
+];
 
 /// A [`Dialect`] for [Google Bigquery](https://cloud.google.com/bigquery/)
 #[derive(Debug, Default)]
 pub struct BigQueryDialect;
 
 impl Dialect for BigQueryDialect {
-    // See https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#identifiers
+    fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
+        if parser.parse_keyword(Keyword::BEGIN) {
+            if parser.peek_keyword(Keyword::TRANSACTION)
+                || parser.peek_token_ref().token == Token::SemiColon
+                || parser.peek_token_ref().token == Token::EOF
+            {
+                parser.prev_token();
+                return None;
+            }
+            return Some(parser.parse_begin_exception_end());
+        }
+
+        None
+    }
+
+    /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#identifiers>
     fn is_delimited_identifier_start(&self, ch: char) -> bool {
         ch == '`'
     }
@@ -31,8 +70,16 @@ impl Dialect for BigQueryDialect {
         true
     }
 
+    /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_statement>
+    fn supports_column_definition_trailing_commas(&self) -> bool {
+        true
+    }
+
     fn is_identifier_start(&self, ch: char) -> bool {
         ch.is_ascii_lowercase() || ch.is_ascii_uppercase() || ch == '_'
+            // BigQuery supports `@@foo.bar` variable syntax in its procedural language.
+            // https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#beginexceptionend
+            || ch == '@'
     }
 
     fn is_identifier_part(&self, ch: char) -> bool {
@@ -72,4 +119,41 @@ impl Dialect for BigQueryDialect {
     fn require_interval_qualifier(&self) -> bool {
         true
     }
+
+    // See https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct
+    fn supports_struct_literal(&self) -> bool {
+        true
+    }
+
+    /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select_expression_star>
+    fn supports_select_expr_star(&self) -> bool {
+        true
+    }
+
+    /// See <https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#execute_immediate>
+    fn supports_execute_immediate(&self) -> bool {
+        true
+    }
+
+    // See <https://cloud.google.com/bigquery/docs/access-historical-data>
+    fn supports_timestamp_versioning(&self) -> bool {
+        true
+    }
+
+    // See <https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#group_by_clause>
+    fn supports_group_by_expr(&self) -> bool {
+        true
+    }
+
+    fn is_column_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
+        !RESERVED_FOR_COLUMN_ALIAS.contains(kw)
+    }
+
+    fn supports_pipe_operator(&self) -> bool {
+        true
+    }
+
+    fn supports_create_table_multi_schema_info_sources(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/clickhouse.rs b/src/dialect/clickhouse.rs
index 0c8f08040..f5e70c309 100644
--- a/src/dialect/clickhouse.rs
+++ b/src/dialect/clickhouse.rs
@@ -50,4 +50,48 @@ impl Dialect for ClickHouseDialect {
     fn supports_limit_comma(&self) -> bool {
         true
     }
+
+    fn supports_insert_table_function(&self) -> bool {
+        true
+    }
+
+    fn supports_insert_format(&self) -> bool {
+        true
+    }
+
+    fn supports_numeric_literal_underscores(&self) -> bool {
+        true
+    }
+
+    // ClickHouse uses this for some FORMAT expressions in `INSERT` context, e.g. when inserting
+    // with FORMAT JSONEachRow a raw JSON key-value expression is valid and expected.
+    //
+    // [ClickHouse formats](https://clickhouse.com/docs/en/interfaces/formats)
+    fn supports_dictionary_syntax(&self) -> bool {
+        true
+    }
+
+    /// See <https://clickhouse.com/docs/en/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function>
+    fn supports_lambda_functions(&self) -> bool {
+        true
+    }
+
+    fn supports_from_first_select(&self) -> bool {
+        true
+    }
+
+    /// See <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by>
+    fn supports_order_by_all(&self) -> bool {
+        true
+    }
+
+    // See <https://clickhouse.com/docs/en/sql-reference/aggregate-functions/grouping_function#grouping-sets>
+    fn supports_group_by_expr(&self) -> bool {
+        true
+    }
+
+    /// See <https://clickhouse.com/docs/en/sql-reference/statements/select/group-by#rollup-modifier>
+    fn supports_group_by_with_modifier(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/databricks.rs b/src/dialect/databricks.rs
index 4924e8077..a3476b1b8 100644
--- a/src/dialect/databricks.rs
+++ b/src/dialect/databricks.rs
@@ -59,4 +59,9 @@ impl Dialect for DatabricksDialect {
     fn require_interval_qualifier(&self) -> bool {
         true
     }
+
+    // See https://docs.databricks.com/en/sql/language-manual/functions/struct.html
+    fn supports_struct_literal(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/duckdb.rs b/src/dialect/duckdb.rs
index a2699d850..37cf7d369 100644
--- a/src/dialect/duckdb.rs
+++ b/src/dialect/duckdb.rs
@@ -65,6 +65,11 @@ impl Dialect for DuckDbDialect {
         true
     }
 
+    /// See <https://duckdb.org/docs/stable/sql/functions/lambda>
+    fn supports_lambda_functions(&self) -> bool {
+        true
+    }
+
     // DuckDB is compatible with PostgreSQL syntax for this statement,
     // although not all features may be implemented.
     fn supports_explain_with_utility_options(&self) -> bool {
@@ -75,4 +80,28 @@ impl Dialect for DuckDbDialect {
     fn supports_load_extension(&self) -> bool {
         true
     }
+
+    // See DuckDB <https://duckdb.org/docs/sql/data_types/array.html#defining-an-array-field>
+    fn supports_array_typedef_with_brackets(&self) -> bool {
+        true
+    }
+
+    fn supports_from_first_select(&self) -> bool {
+        true
+    }
+
+    /// See DuckDB <https://duckdb.org/docs/sql/query_syntax/orderby.html#order-by-all-examples>
+    fn supports_order_by_all(&self) -> bool {
+        true
+    }
+
+    fn supports_select_wildcard_exclude(&self) -> bool {
+        true
+    }
+
+    /// DuckDB supports `NOTNULL` as an alias for `IS NOT NULL`,
+    /// see DuckDB Comparisons <https://duckdb.org/docs/stable/sql/expressions/comparison_operators#between-and-is-not-null>
+    fn supports_notnull_operator(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/generic.rs b/src/dialect/generic.rs
index e3beeae7f..b4c3ef027 100644
--- a/src/dialect/generic.rs
+++ b/src/dialect/generic.rs
@@ -48,6 +48,14 @@ impl Dialect for GenericDialect {
         true
     }
 
+    fn supports_group_by_with_modifier(&self) -> bool {
+        true
+    }
+
+    fn supports_left_associative_joins_without_parens(&self) -> bool {
+        true
+    }
+
     fn supports_connect_by(&self) -> bool {
         true
     }
@@ -104,6 +112,14 @@ impl Dialect for GenericDialect {
         true
     }
 
+    fn supports_from_first_select(&self) -> bool {
+        true
+    }
+
+    fn supports_projection_trailing_commas(&self) -> bool {
+        true
+    }
+
     fn supports_asc_desc_in_column_definition(&self) -> bool {
         true
     }
@@ -123,4 +139,56 @@ impl Dialect for GenericDialect {
     fn supports_named_fn_args_with_assignment_operator(&self) -> bool {
         true
     }
+
+    fn supports_struct_literal(&self) -> bool {
+        true
+    }
+
+    fn supports_empty_projections(&self) -> bool {
+        true
+    }
+
+    fn supports_nested_comments(&self) -> bool {
+        true
+    }
+
+    fn supports_user_host_grantee(&self) -> bool {
+        true
+    }
+
+    fn supports_string_escape_constant(&self) -> bool {
+        true
+    }
+
+    fn supports_array_typedef_with_brackets(&self) -> bool {
+        true
+    }
+
+    fn supports_match_against(&self) -> bool {
+        true
+    }
+
+    fn supports_set_names(&self) -> bool {
+        true
+    }
+
+    fn supports_comma_separated_set_assignments(&self) -> bool {
+        true
+    }
+
+    fn supports_filter_during_aggregation(&self) -> bool {
+        true
+    }
+
+    fn supports_select_wildcard_exclude(&self) -> bool {
+        true
+    }
+
+    fn supports_data_type_signed_suffix(&self) -> bool {
+        true
+    }
+
+    fn supports_interval_options(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/hive.rs b/src/dialect/hive.rs
index 571f9b9ba..3e15d395b 100644
--- a/src/dialect/hive.rs
+++ b/src/dialect/hive.rs
@@ -52,13 +52,23 @@ impl Dialect for HiveDialect {
         true
     }
 
-    /// See Hive <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362061#Tutorial-BuiltInOperators>
+    /// See <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362061#Tutorial-BuiltInOperators>
     fn supports_bang_not_operator(&self) -> bool {
         true
     }
 
-    /// See Hive <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362036#LanguageManualDML-Loadingfilesintotables>
+    /// See <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362036#LanguageManualDML-Loadingfilesintotables>
     fn supports_load_data(&self) -> bool {
         true
     }
+
+    /// See <https://cwiki.apache.org/confluence/display/hive/languagemanual+sampling>
+    fn supports_table_sample_before_alias(&self) -> bool {
+        true
+    }
+
+    /// See <https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=30151323#EnhancedAggregation,Cube,GroupingandRollup-CubesandRollupsr>
+    fn supports_group_by_with_modifier(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs
index 985cad749..6ca364784 100644
--- a/src/dialect/mod.rs
+++ b/src/dialect/mod.rs
@@ -49,7 +49,7 @@ pub use self::postgresql::PostgreSqlDialect;
 pub use self::redshift::RedshiftSqlDialect;
 pub use self::snowflake::SnowflakeDialect;
 pub use self::sqlite::SQLiteDialect;
-use crate::ast::{ColumnOption, Expr, Statement};
+use crate::ast::{ColumnOption, Expr, GranteesType, Ident, ObjectNamePart, Statement};
 pub use crate::keywords;
 use crate::keywords::Keyword;
 use crate::parser::{Parser, ParserError};
@@ -75,6 +75,15 @@ macro_rules! dialect_of {
     };
 }
 
+// Similar to above, but for applying directly against an instance of dialect
+// instead of a struct member named dialect. This avoids lifetime issues when
+// mixing match guards and token references.
+macro_rules! dialect_is {
+    ($dialect:ident is $($dialect_type:ty)|+) => {
+        ($($dialect.is::<$dialect_type>())||+)
+    }
+}
+
 /// Encapsulates the differences between SQL implementations.
 ///
 /// # SQL Dialects
@@ -128,14 +137,39 @@ pub trait Dialect: Debug + Any {
         ch == '"' || ch == '`'
     }
 
-    /// Return the character used to quote identifiers.
-    fn identifier_quote_style(&self, _identifier: &str) -> Option<char> {
+    /// Determine if a character starts a potential nested quoted identifier.
+    /// Example: RedShift supports the following quote styles to all mean the same thing:
+    /// ```sql
+    /// SELECT 1 AS foo;
+    /// SELECT 1 AS "foo";
+    /// SELECT 1 AS [foo];
+    /// SELECT 1 AS ["foo"];
+    /// ```
+    fn is_nested_delimited_identifier_start(&self, _ch: char) -> bool {
+        false
+    }
+
+    /// Only applicable whenever [`Self::is_nested_delimited_identifier_start`] returns true
+    /// If the next sequence of tokens potentially represent a nested identifier, then this method
+    /// returns a tuple containing the outer quote style, and if present, the inner (nested) quote style.
+    ///
+    /// Example (Redshift):
+    /// ```text
+    /// `["foo"]` => Some(`[`, Some(`"`))
+    /// `[foo]` => Some(`[`, None)
+    /// `[0]` => None
+    /// `"foo"` => None
+    /// ```
+    fn peek_nested_delimited_identifier_quotes(
+        &self,
+        mut _chars: Peekable<Chars<'_>>,
+    ) -> Option<(char, Option<char>)> {
         None
     }
 
-    /// Determine if quoted characters are proper for identifier
-    fn is_proper_identifier_inside_quotes(&self, mut _chars: Peekable<Chars<'_>>) -> bool {
-        true
+    /// Return the character used to quote identifiers.
+    fn identifier_quote_style(&self, _identifier: &str) -> Option<char> {
+        None
     }
 
     /// Determine if a character is a valid start character for an unquoted identifier
@@ -167,6 +201,33 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Determine whether the dialect strips the backslash when escaping LIKE wildcards (%, _).
+    ///
+    /// [MySQL] has a special case when escaping single quoted strings which leaves these unescaped
+    /// so they can be used in LIKE patterns without double-escaping (as is necessary in other
+    /// escaping dialects, such as [Snowflake]). Generally, special characters have escaping rules
+    /// causing them to be replaced with a different byte sequences (e.g. `'\0'` becoming the zero
+    /// byte), and the default if an escaped character does not have a specific escaping rule is to
+    /// strip the backslash (e.g. there is no rule for `h`, so `'\h' = 'h'`). MySQL's special case
+    /// for ignoring LIKE wildcard escapes is to *not* strip the backslash, so that `'\%' = '\\%'`.
+    /// This applies to all string literals though, not just those used in LIKE patterns.
+    ///
+    /// ```text
+    /// mysql> select '\_', hex('\\'), hex('_'), hex('\_');
+    /// +----+-----------+----------+-----------+
+    /// | \_ | hex('\\') | hex('_') | hex('\_') |
+    /// +----+-----------+----------+-----------+
+    /// | \_ | 5C        | 5F       | 5C5F      |
+    /// +----+-----------+----------+-----------+
+    /// 1 row in set (0.00 sec)
+    /// ```
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/8.4/en/string-literals.html
+    /// [Snowflake]: https://docs.snowflake.com/en/sql-reference/functions/like#usage-notes
+    fn ignores_wildcard_escapes(&self) -> bool {
+        false
+    }
+
     /// Determine if the dialect supports string literals with `U&` prefix.
     /// This is used to specify Unicode code points in string literals.
     /// For example, in PostgreSQL, the following is a valid string literal:
@@ -211,11 +272,55 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if the dialects supports `GROUP BY` modifiers prefixed by a `WITH` keyword.
+    /// Example: `GROUP BY value WITH ROLLUP`.
+    fn supports_group_by_with_modifier(&self) -> bool {
+        false
+    }
+
+    /// Indicates whether the dialect supports left-associative join parsing
+    /// by default when parentheses are omitted in nested joins.
+    ///
+    /// Most dialects (like MySQL or Postgres) assume **left-associative** precedence,
+    /// so a query like:
+    ///
+    /// ```sql
+    /// SELECT * FROM t1 NATURAL JOIN t5 INNER JOIN t0 ON ...
+    /// ```
+    /// is interpreted as:
+    /// ```sql
+    /// ((t1 NATURAL JOIN t5) INNER JOIN t0 ON ...)
+    /// ```
+    /// and internally represented as a **flat list** of joins.
+    ///
+    /// In contrast, some dialects (e.g. **Snowflake**) assume **right-associative**
+    /// precedence and interpret the same query as:
+    /// ```sql
+    /// (t1 NATURAL JOIN (t5 INNER JOIN t0 ON ...))
+    /// ```
+    /// which results in a **nested join** structure in the AST.
+    ///
+    /// If this method returns `false`, the parser must build nested join trees
+    /// even in the absence of parentheses to reflect the correct associativity
+    fn supports_left_associative_joins_without_parens(&self) -> bool {
+        true
+    }
+
+    /// Returns true if the dialect supports the `(+)` syntax for OUTER JOIN.
+    fn supports_outer_join_operator(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialect supports CONNECT BY.
     fn supports_connect_by(&self) -> bool {
         false
     }
 
+    /// Returns true if the dialect supports `EXECUTE IMMEDIATE` statements.
+    fn supports_execute_immediate(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialect supports the MATCH_RECOGNIZE operation.
     fn supports_match_recognize(&self) -> bool {
         false
@@ -226,11 +331,16 @@ pub trait Dialect: Debug + Any {
         false
     }
 
-    /// Returns true if the dialect supports `BEGIN {DEFERRED | IMMEDIATE | EXCLUSIVE} [TRANSACTION]` statements
+    /// Returns true if the dialect supports `BEGIN {DEFERRED | IMMEDIATE | EXCLUSIVE | TRY | CATCH} [TRANSACTION]` statements
     fn supports_start_transaction_modifier(&self) -> bool {
         false
     }
 
+    /// Returns true if the dialect supports `END {TRY | CATCH}` statements
+    fn supports_end_transaction_modifier(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialect supports named arguments of the form `FUN(a = '1', b = '2')`.
     fn supports_named_fn_args_with_eq_operator(&self) -> bool {
         false
@@ -265,6 +375,11 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if the dialect supports numbers containing underscores, e.g. `10_000_000`
+    fn supports_numeric_literal_underscores(&self) -> bool {
+        false
+    }
+
     /// Returns true if the dialects supports specifying null treatment
     /// as part of a window function's parameter list as opposed
     /// to after the parameter list.
@@ -302,22 +417,23 @@ pub trait Dialect: Debug + Any {
         false
     }
 
-    /// Returns true if the dialect supports method calls, for example:
+    /// Returns true if the dialect supports multiple variable assignment
+    /// using parentheses in a `SET` variable declaration.
     ///
     /// ```sql
-    /// SELECT (SELECT ',' + name FROM sys.objects  FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)')
+    /// SET (variable[, ...]) = (expression[, ...]);
     /// ```
-    fn supports_methods(&self) -> bool {
+    fn supports_parenthesized_set_variables(&self) -> bool {
         false
     }
 
-    /// Returns true if the dialect supports multiple variable assignment
-    /// using parentheses in a `SET` variable declaration.
+    /// Returns true if the dialect supports multiple `SET` statements
+    /// in a single statement.
     ///
     /// ```sql
-    /// SET (variable[, ...]) = (expression[, ...]);
+    /// SET variable = expression [, variable = expression];
     /// ```
-    fn supports_parenthesized_set_variables(&self) -> bool {
+    fn supports_comma_separated_set_assignments(&self) -> bool {
         false
     }
 
@@ -365,6 +481,122 @@ pub trait Dialect: Debug + Any {
         self.supports_trailing_commas()
     }
 
+    /// Returns true if the dialect supports trailing commas in the `FROM` clause of a `SELECT` statement.
+    /// Example: `SELECT 1 FROM T, U, LIMIT 1`
+    fn supports_from_trailing_commas(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports trailing commas in the
+    /// column definitions list of a `CREATE` statement.
+    /// Example: `CREATE TABLE T (x INT, y TEXT,)`
+    fn supports_column_definition_trailing_commas(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports double dot notation for object names
+    ///
+    /// Example
+    /// ```sql
+    /// SELECT * FROM db_name..table_name
+    /// ```
+    fn supports_object_name_double_dot_notation(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports the STRUCT literal
+    ///
+    /// Example
+    /// ```sql
+    /// SELECT STRUCT(1 as one, 'foo' as foo, false)
+    /// ```
+    fn supports_struct_literal(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports empty projections in SELECT statements
+    ///
+    /// Example
+    /// ```sql
+    /// SELECT from table_name
+    /// ```
+    fn supports_empty_projections(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports wildcard expansion on
+    /// arbitrary expressions in projections.
+    ///
+    /// Example:
+    /// ```sql
+    /// SELECT STRUCT<STRING>('foo').* FROM T
+    /// ```
+    fn supports_select_expr_star(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports "FROM-first" selects.
+    ///
+    /// Example:
+    /// ```sql
+    /// FROM table
+    /// SELECT *
+    /// ```
+    fn supports_from_first_select(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports pipe operator.
+    ///
+    /// Example:
+    /// ```sql
+    /// SELECT *
+    /// FROM table
+    /// |> limit 1
+    /// ```
+    ///
+    /// See <https://cloud.google.com/bigquery/docs/pipe-syntax-guide#basic_syntax>
+    fn supports_pipe_operator(&self) -> bool {
+        false
+    }
+
+    /// Does the dialect support MySQL-style `'user'@'host'` grantee syntax?
+    fn supports_user_host_grantee(&self) -> bool {
+        false
+    }
+
+    /// Does the dialect support the `MATCH() AGAINST()` syntax?
+    fn supports_match_against(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports an exclude option
+    /// following a wildcard in the projection section. For example:
+    /// `SELECT * EXCLUDE col1 FROM tbl`.
+    ///
+    /// [Redshift](https://docs.aws.amazon.com/redshift/latest/dg/r_EXCLUDE_list.html)
+    /// [Snowflake](https://docs.snowflake.com/en/sql-reference/sql/select)
+    fn supports_select_wildcard_exclude(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports an exclude option
+    /// as the last item in the projection section, not necessarily
+    /// after a wildcard. For example:
+    /// `SELECT *, c1, c2 EXCLUDE c3 FROM tbl`
+    ///
+    /// [Redshift](https://docs.aws.amazon.com/redshift/latest/dg/r_EXCLUDE_list.html)
+    fn supports_select_exclude(&self) -> bool {
+        false
+    }
+
+    /// Return true if the dialect supports specifying multiple options
+    /// in a `CREATE TABLE` statement for the structure of the new table. For example:
+    /// `CREATE TABLE t (a INT, b INT) AS SELECT 1 AS b, 2 AS a`
+    fn supports_create_table_multi_schema_info_sources(&self) -> bool {
+        false
+    }
+
     /// Dialect-specific infix parser override
     ///
     /// This method is called to parse the next infix expression.
@@ -410,7 +642,7 @@ pub trait Dialect: Debug + Any {
         }
 
         let token = parser.peek_token();
-        debug!("get_next_precedence_full() {:?}", token);
+        debug!("get_next_precedence_full() {token:?}");
         match token.token {
             Token::Word(w) if w.keyword == Keyword::OR => Ok(p!(Or)),
             Token::Word(w) if w.keyword == Keyword::AND => Ok(p!(And)),
@@ -442,20 +674,35 @@ pub trait Dialect: Debug + Any {
                 Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(p!(Like)),
                 Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(p!(Like)),
                 Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(p!(Like)),
+                Token::Word(w) if w.keyword == Keyword::MATCH => Ok(p!(Like)),
                 Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(p!(Like)),
+                Token::Word(w) if w.keyword == Keyword::MEMBER => Ok(p!(Like)),
+                Token::Word(w)
+                    if w.keyword == Keyword::NULL && !parser.in_column_definition_state() =>
+                {
+                    Ok(p!(Is))
+                }
                 _ => Ok(self.prec_unknown()),
             },
+            Token::Word(w) if w.keyword == Keyword::NOTNULL && self.supports_notnull_operator() => {
+                Ok(p!(Is))
+            }
             Token::Word(w) if w.keyword == Keyword::IS => Ok(p!(Is)),
             Token::Word(w) if w.keyword == Keyword::IN => Ok(p!(Between)),
             Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(p!(Between)),
+            Token::Word(w) if w.keyword == Keyword::OVERLAPS => Ok(p!(Between)),
             Token::Word(w) if w.keyword == Keyword::LIKE => Ok(p!(Like)),
             Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(p!(Like)),
             Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(p!(Like)),
             Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(p!(Like)),
+            Token::Word(w) if w.keyword == Keyword::MATCH => Ok(p!(Like)),
             Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(p!(Like)),
+            Token::Word(w) if w.keyword == Keyword::MEMBER => Ok(p!(Like)),
             Token::Word(w) if w.keyword == Keyword::OPERATOR => Ok(p!(Between)),
             Token::Word(w) if w.keyword == Keyword::DIV => Ok(p!(MulDivModOp)),
-            Token::Eq
+            Token::Period => Ok(p!(Period)),
+            Token::Assignment
+            | Token::Eq
             | Token::Lt
             | Token::LtEq
             | Token::Neq
@@ -471,18 +718,34 @@ pub trait Dialect: Debug + Any {
             | Token::ExclamationMarkDoubleTilde
             | Token::ExclamationMarkDoubleTildeAsterisk
             | Token::Spaceship => Ok(p!(Eq)),
-            Token::Pipe => Ok(p!(Pipe)),
+            Token::Pipe
+            | Token::QuestionMarkDash
+            | Token::DoubleSharp
+            | Token::Overlap
+            | Token::AmpersandLeftAngleBracket
+            | Token::AmpersandRightAngleBracket
+            | Token::QuestionMarkDashVerticalBar
+            | Token::AmpersandLeftAngleBracketVerticalBar
+            | Token::VerticalBarAmpersandRightAngleBracket
+            | Token::TwoWayArrow
+            | Token::LeftAngleBracketCaret
+            | Token::RightAngleBracketCaret
+            | Token::QuestionMarkSharp
+            | Token::QuestionMarkDoubleVerticalBar
+            | Token::QuestionPipe
+            | Token::TildeEqual
+            | Token::AtSign
+            | Token::ShiftLeftVerticalBar
+            | Token::VerticalBarShiftRight => Ok(p!(Pipe)),
             Token::Caret | Token::Sharp | Token::ShiftRight | Token::ShiftLeft => Ok(p!(Caret)),
             Token::Ampersand => Ok(p!(Ampersand)),
             Token::Plus | Token::Minus => Ok(p!(PlusMinus)),
             Token::Mul | Token::Div | Token::DuckIntDiv | Token::Mod | Token::StringConcat => {
                 Ok(p!(MulDivModOp))
             }
-            Token::DoubleColon
-            | Token::ExclamationMark
-            | Token::LBracket
-            | Token::Overlap
-            | Token::CaretAt => Ok(p!(DoubleColon)),
+            Token::DoubleColon | Token::ExclamationMark | Token::LBracket | Token::CaretAt => {
+                Ok(p!(DoubleColon))
+            }
             Token::Arrow
             | Token::LongArrow
             | Token::HashArrow
@@ -494,7 +757,6 @@ pub trait Dialect: Debug + Any {
             | Token::AtAt
             | Token::Question
             | Token::QuestionAnd
-            | Token::QuestionPipe
             | Token::CustomBinaryOperator(_) => Ok(p!(PgOther)),
             _ => Ok(self.prec_unknown()),
         }
@@ -528,6 +790,7 @@ pub trait Dialect: Debug + Any {
     /// Uses (APPROXIMATELY) <https://www.postgresql.org/docs/7.0/operators.htm#AEN2026> as a reference
     fn prec_value(&self, prec: Precedence) -> u8 {
         match prec {
+            Precedence::Period => 100,
             Precedence::DoubleColon => 50,
             Precedence::AtTz => 41,
             Precedence::MulDivModOp => 40,
@@ -572,6 +835,12 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if this dialect allows dollar placeholders
+    /// e.g. `SELECT $var` (SQLite)
+    fn supports_dollar_placeholder(&self) -> bool {
+        false
+    }
+
     /// Does the dialect support with clause in create index statement?
     /// e.g. `CREATE INDEX idx ON t WITH (key = value, key2)`
     fn supports_create_index_with_clause(&self) -> bool {
@@ -612,6 +881,12 @@ pub trait Dialect: Debug + Any {
         false
     }
 
+    /// Returns true if the dialect supports nested comments
+    /// e.g. `/* /* nested */ */`
+    fn supports_nested_comments(&self) -> bool {
+        false
+    }
+
     /// Returns true if this dialect supports treating the equals operator `=` within a `SelectItem`
     /// as an alias assignment operator, rather than a boolean expression.
     /// For example: the following statements are equivalent for such a dialect:
@@ -675,6 +950,219 @@ pub trait Dialect: Debug + Any {
     fn supports_create_table_select(&self) -> bool {
         false
     }
+
+    /// Returns true if the dialect supports PartiQL for querying semi-structured data
+    /// <https://partiql.org/index.html>
+    fn supports_partiql(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the specified keyword is reserved and cannot be
+    /// used as an identifier without special handling like quoting.
+    fn is_reserved_for_identifier(&self, kw: Keyword) -> bool {
+        keywords::RESERVED_FOR_IDENTIFIER.contains(&kw)
+    }
+
+    /// Returns reserved keywords that may prefix a select item expression
+    /// e.g. `SELECT CONNECT_BY_ROOT name FROM Tbl2` (Snowflake)
+    fn get_reserved_keywords_for_select_item_operator(&self) -> &[Keyword] {
+        &[]
+    }
+
+    /// Returns grantee types that should be treated as identifiers
+    fn get_reserved_grantees_types(&self) -> &[GranteesType] {
+        &[]
+    }
+
+    /// Returns true if this dialect supports the `TABLESAMPLE` option
+    /// before the table alias option. For example:
+    ///
+    /// Table sample before alias: `SELECT * FROM tbl AS t TABLESAMPLE (10)`
+    /// Table sample after alias: `SELECT * FROM tbl TABLESAMPLE (10) AS t`
+    ///
+    /// <https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#_7_6_table_reference>
+    fn supports_table_sample_before_alias(&self) -> bool {
+        false
+    }
+
+    /// Returns true if this dialect supports the `INSERT INTO ... SET col1 = 1, ...` syntax.
+    ///
+    /// MySQL: <https://dev.mysql.com/doc/refman/8.4/en/insert.html>
+    fn supports_insert_set(&self) -> bool {
+        false
+    }
+
+    /// Does the dialect support table function in insertion?
+    fn supports_insert_table_function(&self) -> bool {
+        false
+    }
+
+    /// Does the dialect support insert formats, e.g. `INSERT INTO ... FORMAT <format>`
+    fn supports_insert_format(&self) -> bool {
+        false
+    }
+
+    /// Returns true if this dialect supports `SET` statements without an explicit
+    /// assignment operator such as `=`. For example: `SET SHOWPLAN_XML ON`.
+    fn supports_set_stmt_without_operator(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the specified keyword should be parsed as a column identifier.
+    /// See [keywords::RESERVED_FOR_COLUMN_ALIAS]
+    fn is_column_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
+        !keywords::RESERVED_FOR_COLUMN_ALIAS.contains(kw)
+    }
+
+    /// Returns true if the specified keyword should be parsed as a select item alias.
+    /// When explicit is true, the keyword is preceded by an `AS` word. Parser is provided
+    /// to enable looking ahead if needed.
+    fn is_select_item_alias(&self, explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
+        explicit || self.is_column_alias(kw, parser)
+    }
+
+    /// Returns true if the specified keyword should be parsed as a table factor identifier.
+    /// See [keywords::RESERVED_FOR_TABLE_FACTOR]
+    fn is_table_factor(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
+        !keywords::RESERVED_FOR_TABLE_FACTOR.contains(kw)
+    }
+
+    /// Returns true if the specified keyword should be parsed as a table factor alias.
+    /// See [keywords::RESERVED_FOR_TABLE_ALIAS]
+    fn is_table_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
+        !keywords::RESERVED_FOR_TABLE_ALIAS.contains(kw)
+    }
+
+    /// Returns true if the specified keyword should be parsed as a table factor alias.
+    /// When explicit is true, the keyword is preceded by an `AS` word. Parser is provided
+    /// to enable looking ahead if needed.
+    fn is_table_factor_alias(&self, explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
+        explicit || self.is_table_alias(kw, parser)
+    }
+
+    /// Returns true if this dialect supports querying historical table data
+    /// by specifying which version of the data to query.
+    fn supports_timestamp_versioning(&self) -> bool {
+        false
+    }
+
+    /// Returns true if this dialect supports the E'...' syntax for string literals
+    ///
+    /// Postgres: <https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE>
+    fn supports_string_escape_constant(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports the table hints in the `FROM` clause.
+    fn supports_table_hints(&self) -> bool {
+        false
+    }
+
+    /// Returns true if this dialect requires a whitespace character after `--` to start a single line comment.
+    ///
+    /// MySQL: <https://dev.mysql.com/doc/refman/8.4/en/ansi-diff-comments.html>
+    /// e.g. UPDATE account SET balance=balance--1
+    //       WHERE account_id=5752             ^^^ will be interpreted as two minus signs instead of a comment
+    fn requires_single_line_comment_whitespace(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports array type definition with brackets with
+    /// an optional size. For example:
+    /// ```CREATE TABLE my_table (arr1 INT[], arr2 INT[3])```
+    /// ```SELECT x::INT[]```
+    fn supports_array_typedef_with_brackets(&self) -> bool {
+        false
+    }
+    /// Returns true if the dialect supports geometric types.
+    ///
+    /// Postgres: <https://www.postgresql.org/docs/9.5/functions-geometry.html>
+    /// e.g. @@ circle '((0,0),10)'
+    fn supports_geometric_types(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports `ORDER BY ALL`.
+    /// `ALL` which means all columns of the SELECT clause.
+    ///
+    /// For example: ```SELECT * FROM addresses ORDER BY ALL;```.
+    fn supports_order_by_all(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports `SET NAMES <charset_name> [COLLATE <collation_name>]`.
+    ///
+    /// - [MySQL](https://dev.mysql.com/doc/refman/8.4/en/set-names.html)
+    /// - [PostgreSQL](https://www.postgresql.org/docs/17/sql-set.html)
+    ///
+    /// Note: Postgres doesn't support the `COLLATE` clause, but we permissively parse it anyway.
+    fn supports_set_names(&self) -> bool {
+        false
+    }
+
+    fn supports_space_separated_column_options(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports the `USING` clause in an `ALTER COLUMN` statement.
+    /// Example:
+    ///  ```sql
+    ///  ALTER TABLE tbl ALTER COLUMN col SET DATA TYPE <type> USING <exp>`
+    /// ```
+    fn supports_alter_column_type_using(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports `ALTER TABLE tbl DROP COLUMN c1, ..., cn`
+    fn supports_comma_separated_drop_column_list(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect considers the specified ident as a function
+    /// that returns an identifier. Typically used to generate identifiers
+    /// programmatically.
+    ///
+    /// - [Snowflake](https://docs.snowflake.com/en/sql-reference/identifier-literal)
+    fn is_identifier_generating_function_name(
+        &self,
+        _ident: &Ident,
+        _name_parts: &[ObjectNamePart],
+    ) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports the `x NOTNULL`
+    /// operator expression.
+    fn supports_notnull_operator(&self) -> bool {
+        false
+    }
+
+    /// Returns true if this dialect allows an optional `SIGNED` suffix after integer data types.
+    ///
+    /// Example:
+    /// ```sql
+    /// CREATE TABLE t (i INT(20) SIGNED);
+    /// ```
+    ///
+    /// Note that this is canonicalized to `INT(20)`.
+    fn supports_data_type_signed_suffix(&self) -> bool {
+        false
+    }
+
+    /// Returns true if the dialect supports the `INTERVAL` data type with [Postgres]-style options.
+    ///
+    /// Examples:
+    /// ```sql
+    /// CREATE TABLE t (i INTERVAL YEAR TO MONTH);
+    /// SELECT '1 second'::INTERVAL HOUR TO SECOND(3);
+    /// ```
+    ///
+    /// See [`crate::ast::DataType::Interval`] and [`crate::ast::IntervalFields`].
+    ///
+    /// [Postgres]: https://www.postgresql.org/docs/17/datatype-datetime.html
+    fn supports_interval_options(&self) -> bool {
+        false
+    }
 }
 
 /// This represents the operators for which precedence must be defined
@@ -682,6 +1170,7 @@ pub trait Dialect: Debug + Any {
 /// higher number -> higher precedence
 #[derive(Debug, Clone, Copy)]
 pub enum Precedence {
+    Period,
     DoubleColon,
     AtTz,
     MulDivModOp,
@@ -826,6 +1315,17 @@ mod tests {
                 self.0.is_delimited_identifier_start(ch)
             }
 
+            fn is_nested_delimited_identifier_start(&self, ch: char) -> bool {
+                self.0.is_nested_delimited_identifier_start(ch)
+            }
+
+            fn peek_nested_delimited_identifier_quotes(
+                &self,
+                chars: std::iter::Peekable<std::str::Chars<'_>>,
+            ) -> Option<(char, Option<char>)> {
+                self.0.peek_nested_delimited_identifier_quotes(chars)
+            }
+
             fn identifier_quote_style(&self, identifier: &str) -> Option<char> {
                 self.0.identifier_quote_style(identifier)
             }
@@ -834,13 +1334,6 @@ mod tests {
                 self.0.supports_string_literal_backslash_escape()
             }
 
-            fn is_proper_identifier_inside_quotes(
-                &self,
-                chars: std::iter::Peekable<std::str::Chars<'_>>,
-            ) -> bool {
-                self.0.is_proper_identifier_inside_quotes(chars)
-            }
-
             fn supports_filter_during_aggregation(&self) -> bool {
                 self.0.supports_filter_during_aggregation()
             }
diff --git a/src/dialect/mssql.rs b/src/dialect/mssql.rs
index 2d0ef027f..36bd222b8 100644
--- a/src/dialect/mssql.rs
+++ b/src/dialect/mssql.rs
@@ -15,7 +15,19 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use crate::ast::helpers::attached_token::AttachedToken;
+use crate::ast::{
+    BeginEndStatements, ConditionalStatementBlock, ConditionalStatements, GranteesType,
+    IfStatement, Statement, TriggerObject,
+};
 use crate::dialect::Dialect;
+use crate::keywords::{self, Keyword};
+use crate::parser::{Parser, ParserError};
+use crate::tokenizer::Token;
+#[cfg(not(feature = "std"))]
+use alloc::{vec, vec::Vec};
+
+const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[Keyword::IF, Keyword::ELSE];
 
 /// A [`Dialect`] for [Microsoft SQL Server](https://www.microsoft.com/en-us/sql-server/)
 #[derive(Debug)]
@@ -40,12 +52,20 @@ impl Dialect for MsSqlDialect {
             || ch == '_'
     }
 
+    fn identifier_quote_style(&self, _identifier: &str) -> Option<char> {
+        Some('[')
+    }
+
     /// SQL Server has `CONVERT(type, value)` instead of `CONVERT(value, type)`
     /// <https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16>
     fn convert_type_before_value(&self) -> bool {
         true
     }
 
+    fn supports_outer_join_operator(&self) -> bool {
+        true
+    }
+
     fn supports_connect_by(&self) -> bool {
         true
     }
@@ -63,10 +83,6 @@ impl Dialect for MsSqlDialect {
         false
     }
 
-    fn supports_methods(&self) -> bool {
-        true
-    }
-
     fn supports_named_fn_args_with_colon_operator(&self) -> bool {
         true
     }
@@ -78,4 +94,205 @@ impl Dialect for MsSqlDialect {
     fn supports_named_fn_args_with_rarrow_operator(&self) -> bool {
         false
     }
+
+    fn supports_start_transaction_modifier(&self) -> bool {
+        true
+    }
+
+    fn supports_end_transaction_modifier(&self) -> bool {
+        true
+    }
+
+    /// See: <https://learn.microsoft.com/en-us/sql/t-sql/statements/set-statements-transact-sql>
+    fn supports_set_stmt_without_operator(&self) -> bool {
+        true
+    }
+
+    /// See: <https://learn.microsoft.com/en-us/sql/relational-databases/tables/querying-data-in-a-system-versioned-temporal-table>
+    fn supports_timestamp_versioning(&self) -> bool {
+        true
+    }
+
+    /// See <https://learn.microsoft.com/en-us/sql/t-sql/language-elements/slash-star-comment-transact-sql?view=sql-server-ver16>
+    fn supports_nested_comments(&self) -> bool {
+        true
+    }
+
+    /// See <https://learn.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql>
+    fn supports_object_name_double_dot_notation(&self) -> bool {
+        true
+    }
+
+    /// See <https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/server-level-roles>
+    fn get_reserved_grantees_types(&self) -> &[GranteesType] {
+        &[GranteesType::Public]
+    }
+
+    fn is_column_alias(&self, kw: &Keyword, _parser: &mut Parser) -> bool {
+        !keywords::RESERVED_FOR_COLUMN_ALIAS.contains(kw) && !RESERVED_FOR_COLUMN_ALIAS.contains(kw)
+    }
+
+    fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
+        if parser.peek_keyword(Keyword::IF) {
+            Some(self.parse_if_stmt(parser))
+        } else if parser.parse_keywords(&[Keyword::CREATE, Keyword::TRIGGER]) {
+            Some(self.parse_create_trigger(parser, false))
+        } else if parser.parse_keywords(&[
+            Keyword::CREATE,
+            Keyword::OR,
+            Keyword::ALTER,
+            Keyword::TRIGGER,
+        ]) {
+            Some(self.parse_create_trigger(parser, true))
+        } else {
+            None
+        }
+    }
+}
+
+impl MsSqlDialect {
+    /// ```sql
+    /// IF boolean_expression
+    ///     { sql_statement | statement_block }
+    /// [ ELSE
+    ///     { sql_statement | statement_block } ]
+    /// ```
+    fn parse_if_stmt(&self, parser: &mut Parser) -> Result<Statement, ParserError> {
+        let if_token = parser.expect_keyword(Keyword::IF)?;
+
+        let condition = parser.parse_expr()?;
+
+        let if_block = if parser.peek_keyword(Keyword::BEGIN) {
+            let begin_token = parser.expect_keyword(Keyword::BEGIN)?;
+            let statements = self.parse_statement_list(parser, Some(Keyword::END))?;
+            let end_token = parser.expect_keyword(Keyword::END)?;
+            ConditionalStatementBlock {
+                start_token: AttachedToken(if_token),
+                condition: Some(condition),
+                then_token: None,
+                conditional_statements: ConditionalStatements::BeginEnd(BeginEndStatements {
+                    begin_token: AttachedToken(begin_token),
+                    statements,
+                    end_token: AttachedToken(end_token),
+                }),
+            }
+        } else {
+            let stmt = parser.parse_statement()?;
+            ConditionalStatementBlock {
+                start_token: AttachedToken(if_token),
+                condition: Some(condition),
+                then_token: None,
+                conditional_statements: ConditionalStatements::Sequence {
+                    statements: vec![stmt],
+                },
+            }
+        };
+
+        let mut prior_statement_ended_with_semi_colon = false;
+        while let Token::SemiColon = parser.peek_token_ref().token {
+            parser.advance_token();
+            prior_statement_ended_with_semi_colon = true;
+        }
+
+        let mut else_block = None;
+        if parser.peek_keyword(Keyword::ELSE) {
+            let else_token = parser.expect_keyword(Keyword::ELSE)?;
+            if parser.peek_keyword(Keyword::BEGIN) {
+                let begin_token = parser.expect_keyword(Keyword::BEGIN)?;
+                let statements = self.parse_statement_list(parser, Some(Keyword::END))?;
+                let end_token = parser.expect_keyword(Keyword::END)?;
+                else_block = Some(ConditionalStatementBlock {
+                    start_token: AttachedToken(else_token),
+                    condition: None,
+                    then_token: None,
+                    conditional_statements: ConditionalStatements::BeginEnd(BeginEndStatements {
+                        begin_token: AttachedToken(begin_token),
+                        statements,
+                        end_token: AttachedToken(end_token),
+                    }),
+                });
+            } else {
+                let stmt = parser.parse_statement()?;
+                else_block = Some(ConditionalStatementBlock {
+                    start_token: AttachedToken(else_token),
+                    condition: None,
+                    then_token: None,
+                    conditional_statements: ConditionalStatements::Sequence {
+                        statements: vec![stmt],
+                    },
+                });
+            }
+        } else if prior_statement_ended_with_semi_colon {
+            parser.prev_token();
+        }
+
+        Ok(Statement::If(IfStatement {
+            if_block,
+            else_block,
+            elseif_blocks: Vec::new(),
+            end_token: None,
+        }))
+    }
+
+    /// Parse `CREATE TRIGGER` for [MsSql]
+    ///
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql
+    fn parse_create_trigger(
+        &self,
+        parser: &mut Parser,
+        or_alter: bool,
+    ) -> Result<Statement, ParserError> {
+        let name = parser.parse_object_name(false)?;
+        parser.expect_keyword_is(Keyword::ON)?;
+        let table_name = parser.parse_object_name(false)?;
+        let period = parser.parse_trigger_period()?;
+        let events = parser.parse_comma_separated(Parser::parse_trigger_event)?;
+
+        parser.expect_keyword_is(Keyword::AS)?;
+        let statements = Some(parser.parse_conditional_statements(&[Keyword::END])?);
+
+        Ok(Statement::CreateTrigger {
+            or_alter,
+            or_replace: false,
+            is_constraint: false,
+            name,
+            period,
+            events,
+            table_name,
+            referenced_table_name: None,
+            referencing: Vec::new(),
+            trigger_object: TriggerObject::Statement,
+            include_each: false,
+            condition: None,
+            exec_body: None,
+            statements,
+            characteristics: None,
+        })
+    }
+
+    /// Parse a sequence of statements, optionally separated by semicolon.
+    ///
+    /// Stops parsing when reaching EOF or the given keyword.
+    fn parse_statement_list(
+        &self,
+        parser: &mut Parser,
+        terminal_keyword: Option<Keyword>,
+    ) -> Result<Vec<Statement>, ParserError> {
+        let mut stmts = Vec::new();
+        loop {
+            if let Token::EOF = parser.peek_token_ref().token {
+                break;
+            }
+            if let Some(term) = terminal_keyword {
+                if parser.peek_keyword(term) {
+                    break;
+                }
+            }
+            stmts.push(parser.parse_statement()?);
+            while let Token::SemiColon = parser.peek_token_ref().token {
+                parser.advance_token();
+            }
+        }
+        Ok(stmts)
+    }
 }
diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs
index 197ce48d4..6cf24e14e 100644
--- a/src/dialect/mysql.rs
+++ b/src/dialect/mysql.rs
@@ -25,6 +25,15 @@ use crate::{
     parser::{Parser, ParserError},
 };
 
+use super::keywords;
+
+const RESERVED_FOR_TABLE_ALIAS_MYSQL: &[Keyword] = &[
+    Keyword::USE,
+    Keyword::IGNORE,
+    Keyword::FORCE,
+    Keyword::STRAIGHT_JOIN,
+];
+
 /// A [`Dialect`] for [MySQL](https://www.mysql.com/)
 #[derive(Debug)]
 pub struct MySqlDialect {}
@@ -34,15 +43,19 @@ impl Dialect for MySqlDialect {
         // See https://dev.mysql.com/doc/refman/8.0/en/identifiers.html.
         // Identifiers which begin with a digit are recognized while tokenizing numbers,
         // so they can be distinguished from exponent numeric literals.
+        // MySQL also implements non ascii utf-8 charecters
         ch.is_alphabetic()
             || ch == '_'
             || ch == '$'
             || ch == '@'
             || ('\u{0080}'..='\u{ffff}').contains(&ch)
+            || !ch.is_ascii()
     }
 
     fn is_identifier_part(&self, ch: char) -> bool {
-        self.is_identifier_start(ch) || ch.is_ascii_digit()
+        self.is_identifier_start(ch) || ch.is_ascii_digit() ||
+        // MySQL implements Unicode characters in identifiers.
+        !ch.is_ascii()
     }
 
     fn is_delimited_identifier_start(&self, ch: char) -> bool {
@@ -58,6 +71,10 @@ impl Dialect for MySqlDialect {
         true
     }
 
+    fn ignores_wildcard_escapes(&self) -> bool {
+        true
+    }
+
     fn supports_numeric_prefix(&self) -> bool {
         true
     }
@@ -98,10 +115,49 @@ impl Dialect for MySqlDialect {
         true
     }
 
-    /// see <https://dev.mysql.com/doc/refman/8.4/en/create-table-select.html>
+    /// See: <https://dev.mysql.com/doc/refman/8.4/en/create-table-select.html>
     fn supports_create_table_select(&self) -> bool {
         true
     }
+
+    /// See: <https://dev.mysql.com/doc/refman/8.4/en/insert.html>
+    fn supports_insert_set(&self) -> bool {
+        true
+    }
+
+    fn supports_user_host_grantee(&self) -> bool {
+        true
+    }
+
+    fn is_table_factor_alias(&self, explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
+        explicit
+            || (!keywords::RESERVED_FOR_TABLE_ALIAS.contains(kw)
+                && !RESERVED_FOR_TABLE_ALIAS_MYSQL.contains(kw))
+    }
+
+    fn supports_table_hints(&self) -> bool {
+        true
+    }
+
+    fn requires_single_line_comment_whitespace(&self) -> bool {
+        true
+    }
+
+    fn supports_match_against(&self) -> bool {
+        true
+    }
+
+    fn supports_set_names(&self) -> bool {
+        true
+    }
+
+    fn supports_comma_separated_set_assignments(&self) -> bool {
+        true
+    }
+
+    fn supports_data_type_signed_suffix(&self) -> bool {
+        true
+    }
 }
 
 /// `LOCK TABLES`
@@ -113,7 +169,7 @@ fn parse_lock_tables(parser: &mut Parser) -> Result<Statement, ParserError> {
 
 // tbl_name [[AS] alias] lock_type
 fn parse_lock_table(parser: &mut Parser) -> Result<LockTable, ParserError> {
-    let table = parser.parse_identifier(false)?;
+    let table = parser.parse_identifier()?;
     let alias =
         parser.parse_optional_alias(&[Keyword::READ, Keyword::WRITE, Keyword::LOW_PRIORITY])?;
     let lock_type = parse_lock_tables_type(parser)?;
diff --git a/src/dialect/postgresql.rs b/src/dialect/postgresql.rs
index 559586e3f..207f4787f 100644
--- a/src/dialect/postgresql.rs
+++ b/src/dialect/postgresql.rs
@@ -28,7 +28,6 @@
 // limitations under the License.
 use log::debug;
 
-use crate::ast::{ObjectName, Statement, UserDefinedTypeRepresentation};
 use crate::dialect::{Dialect, Precedence};
 use crate::keywords::Keyword;
 use crate::parser::{Parser, ParserError};
@@ -38,6 +37,7 @@ use crate::tokenizer::Token;
 #[derive(Debug)]
 pub struct PostgreSqlDialect {}
 
+const PERIOD_PREC: u8 = 200;
 const DOUBLE_COLON_PREC: u8 = 140;
 const BRACKET_PREC: u8 = 130;
 const COLLATE_PREC: u8 = 120;
@@ -65,14 +65,15 @@ impl Dialect for PostgreSqlDialect {
     }
 
     fn is_identifier_start(&self, ch: char) -> bool {
-        // See https://www.postgresql.org/docs/11/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
-        // We don't yet support identifiers beginning with "letters with
-        // diacritical marks"
-        ch.is_alphabetic() || ch == '_'
+        ch.is_alphabetic() || ch == '_' ||
+        // PostgreSQL implements Unicode characters in identifiers.
+        !ch.is_ascii()
     }
 
     fn is_identifier_part(&self, ch: char) -> bool {
-        ch.is_alphabetic() || ch.is_ascii_digit() || ch == '$' || ch == '_'
+        ch.is_alphabetic() || ch.is_ascii_digit() || ch == '$' || ch == '_'  ||
+        // PostgreSQL implements Unicode characters in identifiers.
+        !ch.is_ascii()
     }
 
     fn supports_unicode_string_literal(&self) -> bool {
@@ -104,7 +105,7 @@ impl Dialect for PostgreSqlDialect {
 
     fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, ParserError>> {
         let token = parser.peek_token();
-        debug!("get_next_precedence() {:?}", token);
+        debug!("get_next_precedence() {token:?}");
 
         // we only return some custom value here when the behaviour (not merely the numeric value) differs
         // from the default implementation
@@ -135,15 +136,6 @@ impl Dialect for PostgreSqlDialect {
         }
     }
 
-    fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
-        if parser.parse_keyword(Keyword::CREATE) {
-            parser.prev_token(); // unconsume the CREATE in case we don't end up parsing anything
-            parse_create(parser)
-        } else {
-            None
-        }
-    }
-
     fn supports_filter_during_aggregation(&self) -> bool {
         true
     }
@@ -154,6 +146,7 @@ impl Dialect for PostgreSqlDialect {
 
     fn prec_value(&self, prec: Precedence) -> u8 {
         match prec {
+            Precedence::Period => PERIOD_PREC,
             Precedence::DoubleColon => DOUBLE_COLON_PREC,
             Precedence::AtTz => AT_TZ_PREC,
             Precedence::MulDivModOp => MUL_DIV_MOD_OP_PREC,
@@ -211,38 +204,76 @@ impl Dialect for PostgreSqlDialect {
     fn supports_load_extension(&self) -> bool {
         true
     }
-}
 
-pub fn parse_create(parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
-    let name = parser.maybe_parse(|parser| -> Result<ObjectName, ParserError> {
-        parser.expect_keyword(Keyword::CREATE)?;
-        parser.expect_keyword(Keyword::TYPE)?;
-        let name = parser.parse_object_name(false)?;
-        parser.expect_keyword(Keyword::AS)?;
-        parser.expect_keyword(Keyword::ENUM)?;
-        Ok(name)
-    });
+    /// See <https://www.postgresql.org/docs/current/functions-json.html>
+    ///
+    /// Required to support the colon in:
+    /// ```sql
+    /// SELECT json_object('a': 'b')
+    /// ```
+    fn supports_named_fn_args_with_colon_operator(&self) -> bool {
+        true
+    }
 
-    match name {
-        Ok(name) => name.map(|name| parse_create_type_as_enum(parser, name)),
-        Err(e) => Some(Err(e)),
+    /// See <https://www.postgresql.org/docs/current/functions-json.html>
+    ///
+    /// Required to support the label in:
+    /// ```sql
+    /// SELECT json_object('label': 'value')
+    /// ```
+    fn supports_named_fn_args_with_expr_name(&self) -> bool {
+        true
+    }
+
+    /// Return true if the dialect supports empty projections in SELECT statements
+    ///
+    /// Example
+    /// ```sql
+    /// SELECT from table_name
+    /// ```
+    fn supports_empty_projections(&self) -> bool {
+        true
+    }
+
+    fn supports_nested_comments(&self) -> bool {
+        true
+    }
+
+    fn supports_string_escape_constant(&self) -> bool {
+        true
     }
-}
 
-// https://www.postgresql.org/docs/current/sql-createtype.html
-pub fn parse_create_type_as_enum(
-    parser: &mut Parser,
-    name: ObjectName,
-) -> Result<Statement, ParserError> {
-    if !parser.consume_token(&Token::LParen) {
-        return parser.expected("'(' after CREATE TYPE AS ENUM", parser.peek_token());
+    fn supports_numeric_literal_underscores(&self) -> bool {
+        true
     }
 
-    let labels = parser.parse_comma_separated0(|p| p.parse_identifier(false), Token::RParen)?;
-    parser.expect_token(&Token::RParen)?;
+    /// See: <https://www.postgresql.org/docs/current/arrays.html#ARRAYS-DECLARATION>
+    fn supports_array_typedef_with_brackets(&self) -> bool {
+        true
+    }
+
+    fn supports_geometric_types(&self) -> bool {
+        true
+    }
+
+    fn supports_set_names(&self) -> bool {
+        true
+    }
 
-    Ok(Statement::CreateType {
-        name,
-        representation: UserDefinedTypeRepresentation::Enum { labels },
-    })
+    fn supports_alter_column_type_using(&self) -> bool {
+        true
+    }
+
+    /// Postgres supports `NOTNULL` as an alias for `IS NOT NULL`
+    /// See: <https://www.postgresql.org/docs/17/functions-comparison.html>
+    fn supports_notnull_operator(&self) -> bool {
+        true
+    }
+
+    /// [Postgres] supports optional field and precision options for `INTERVAL` data type.
+    ///
+    /// [Postgres]: https://www.postgresql.org/docs/17/datatype-datetime.html
+    fn supports_interval_options(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/redshift.rs b/src/dialect/redshift.rs
index 4d0773843..68e025d18 100644
--- a/src/dialect/redshift.rs
+++ b/src/dialect/redshift.rs
@@ -32,30 +32,62 @@ pub struct RedshiftSqlDialect {}
 // in the Postgres dialect, the query will be parsed as an array, while in the Redshift dialect it will
 // be a json path
 impl Dialect for RedshiftSqlDialect {
-    fn is_delimited_identifier_start(&self, ch: char) -> bool {
-        ch == '"' || ch == '['
+    /// Determine if a character starts a potential nested quoted identifier.
+    /// Example: RedShift supports the following quote styles to all mean the same thing:
+    /// ```sql
+    /// SELECT 1 AS foo;
+    /// SELECT 1 AS "foo";
+    /// SELECT 1 AS [foo];
+    /// SELECT 1 AS ["foo"];
+    /// ```
+    fn is_nested_delimited_identifier_start(&self, ch: char) -> bool {
+        ch == '['
     }
 
-    /// Determine if quoted characters are proper for identifier
-    /// It's needed to distinguish treating square brackets as quotes from
-    /// treating them as json path. If there is identifier then we assume
-    /// there is no json path.
-    fn is_proper_identifier_inside_quotes(&self, mut chars: Peekable<Chars<'_>>) -> bool {
+    /// Only applicable whenever [`Self::is_nested_delimited_identifier_start`] returns true
+    /// If the next sequence of tokens potentially represent a nested identifier, then this method
+    /// returns a tuple containing the outer quote style, and if present, the inner (nested) quote style.
+    ///
+    /// Example (Redshift):
+    /// ```text
+    /// `["foo"]` => Some(`[`, Some(`"`))
+    /// `[foo]` => Some(`[`, None)
+    /// `[0]` => None
+    /// `"foo"` => None
+    /// ```
+    fn peek_nested_delimited_identifier_quotes(
+        &self,
+        mut chars: Peekable<Chars<'_>>,
+    ) -> Option<(char, Option<char>)> {
+        if chars.peek() != Some(&'[') {
+            return None;
+        }
+
         chars.next();
+
         let mut not_white_chars = chars.skip_while(|ch| ch.is_whitespace()).peekable();
+
         if let Some(&ch) = not_white_chars.peek() {
-            return self.is_identifier_start(ch);
+            if ch == '"' {
+                return Some(('[', Some('"')));
+            }
+            if self.is_identifier_start(ch) {
+                return Some(('[', None));
+            }
         }
-        false
+
+        None
     }
 
     fn is_identifier_start(&self, ch: char) -> bool {
-        // Extends Postgres dialect with sharp
+        // UTF-8 multibyte characters are supported in identifiers via the PostgreSqlDialect.
+        // https://docs.aws.amazon.com/redshift/latest/dg/r_names.html
         PostgreSqlDialect {}.is_identifier_start(ch) || ch == '#'
     }
 
     fn is_identifier_part(&self, ch: char) -> bool {
-        // Extends Postgres dialect with sharp
+        // UTF-8 multibyte characters are supported in identifiers via the PostgreSqlDialect.
+        // https://docs.aws.amazon.com/redshift/latest/dg/r_names.html
         PostgreSqlDialect {}.is_identifier_part(ch) || ch == '#'
     }
 
@@ -74,4 +106,37 @@ impl Dialect for RedshiftSqlDialect {
     fn supports_top_before_distinct(&self) -> bool {
         true
     }
+
+    /// Redshift supports PartiQL: <https://docs.aws.amazon.com/redshift/latest/dg/super-overview.html>
+    fn supports_partiql(&self) -> bool {
+        true
+    }
+
+    fn supports_string_escape_constant(&self) -> bool {
+        true
+    }
+
+    fn supports_geometric_types(&self) -> bool {
+        true
+    }
+
+    fn supports_array_typedef_with_brackets(&self) -> bool {
+        true
+    }
+
+    fn allow_extract_single_quotes(&self) -> bool {
+        true
+    }
+
+    fn supports_string_literal_backslash_escape(&self) -> bool {
+        true
+    }
+
+    fn supports_select_wildcard_exclude(&self) -> bool {
+        true
+    }
+
+    fn supports_select_exclude(&self) -> bool {
+        true
+    }
 }
diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs
index b584ed9b4..697ba3b4f 100644
--- a/src/dialect/snowflake.rs
+++ b/src/dialect/snowflake.rs
@@ -17,27 +17,113 @@
 
 #[cfg(not(feature = "std"))]
 use crate::alloc::string::ToString;
+use crate::ast::helpers::key_value_options::{
+    KeyValueOption, KeyValueOptionType, KeyValueOptions, KeyValueOptionsDelimiter,
+};
+use crate::ast::helpers::stmt_create_database::CreateDatabaseBuilder;
 use crate::ast::helpers::stmt_create_table::CreateTableBuilder;
 use crate::ast::helpers::stmt_data_loading::{
-    DataLoadingOption, DataLoadingOptionType, DataLoadingOptions, StageLoadSelectItem,
-    StageParamsObject,
+    FileStagingCommand, StageLoadSelectItem, StageLoadSelectItemKind, StageParamsObject,
 };
 use crate::ast::{
-    ColumnOption, ColumnPolicy, ColumnPolicyProperty, Ident, IdentityParameters, IdentityProperty,
+    CatalogSyncNamespaceMode, ColumnOption, ColumnPolicy, ColumnPolicyProperty, ContactEntry,
+    CopyIntoSnowflakeKind, DollarQuotedString, Ident, IdentityParameters, IdentityProperty,
     IdentityPropertyFormatKind, IdentityPropertyKind, IdentityPropertyOrder, ObjectName,
-    RowAccessPolicy, Statement, TagsColumnOption, WrappedCollection,
+    ObjectNamePart, RowAccessPolicy, ShowObjects, SqlOption, Statement, StorageSerializationPolicy,
+    TagsColumnOption, WrappedCollection,
 };
 use crate::dialect::{Dialect, Precedence};
 use crate::keywords::Keyword;
-use crate::parser::{Parser, ParserError};
+use crate::parser::{IsOptional, Parser, ParserError};
 use crate::tokenizer::Token;
 #[cfg(not(feature = "std"))]
+use alloc::boxed::Box;
+#[cfg(not(feature = "std"))]
 use alloc::string::String;
 #[cfg(not(feature = "std"))]
 use alloc::vec::Vec;
 #[cfg(not(feature = "std"))]
 use alloc::{format, vec};
 
+use super::keywords::RESERVED_FOR_IDENTIFIER;
+
+const RESERVED_KEYWORDS_FOR_SELECT_ITEM_OPERATOR: [Keyword; 1] = [Keyword::CONNECT_BY_ROOT];
+
+// See: <https://docs.snowflake.com/en/sql-reference/reserved-keywords>
+const RESERVED_KEYWORDS_FOR_TABLE_FACTOR: &[Keyword] = &[
+    Keyword::ALL,
+    Keyword::ALTER,
+    Keyword::AND,
+    Keyword::ANY,
+    Keyword::AS,
+    Keyword::BETWEEN,
+    Keyword::BY,
+    Keyword::CHECK,
+    Keyword::COLUMN,
+    Keyword::CONNECT,
+    Keyword::CREATE,
+    Keyword::CROSS,
+    Keyword::CURRENT,
+    Keyword::DELETE,
+    Keyword::DISTINCT,
+    Keyword::DROP,
+    Keyword::ELSE,
+    Keyword::EXISTS,
+    Keyword::FOLLOWING,
+    Keyword::FOR,
+    Keyword::FROM,
+    Keyword::FULL,
+    Keyword::GRANT,
+    Keyword::GROUP,
+    Keyword::HAVING,
+    Keyword::ILIKE,
+    Keyword::IN,
+    Keyword::INCREMENT,
+    Keyword::INNER,
+    Keyword::INSERT,
+    Keyword::INTERSECT,
+    Keyword::INTO,
+    Keyword::IS,
+    Keyword::JOIN,
+    Keyword::LEFT,
+    Keyword::LIKE,
+    Keyword::MINUS,
+    Keyword::NATURAL,
+    Keyword::NOT,
+    Keyword::NULL,
+    Keyword::OF,
+    Keyword::ON,
+    Keyword::OR,
+    Keyword::ORDER,
+    Keyword::QUALIFY,
+    Keyword::REGEXP,
+    Keyword::REVOKE,
+    Keyword::RIGHT,
+    Keyword::RLIKE,
+    Keyword::ROW,
+    Keyword::ROWS,
+    Keyword::SAMPLE,
+    Keyword::SELECT,
+    Keyword::SET,
+    Keyword::SOME,
+    Keyword::START,
+    Keyword::TABLE,
+    Keyword::TABLESAMPLE,
+    Keyword::THEN,
+    Keyword::TO,
+    Keyword::TRIGGER,
+    Keyword::UNION,
+    Keyword::UNIQUE,
+    Keyword::UPDATE,
+    Keyword::USING,
+    Keyword::VALUES,
+    Keyword::WHEN,
+    Keyword::WHENEVER,
+    Keyword::WHERE,
+    Keyword::WINDOW,
+    Keyword::WITH,
+];
+
 /// A [`Dialect`] for [Snowflake](https://www.snowflake.com/)
 #[derive(Debug, Default)]
 pub struct SnowflakeDialect;
@@ -52,6 +138,18 @@ impl Dialect for SnowflakeDialect {
         true
     }
 
+    fn supports_from_trailing_commas(&self) -> bool {
+        true
+    }
+
+    // Snowflake supports double-dot notation when the schema name is not specified
+    // In this case the default PUBLIC schema is used
+    //
+    // see https://docs.snowflake.com/en/sql-reference/name-resolution#resolution-when-schema-omitted-double-dot-notation
+    fn supports_object_name_double_dot_notation(&self) -> bool {
+        true
+    }
+
     fn is_identifier_part(&self, ch: char) -> bool {
         ch.is_ascii_lowercase()
             || ch.is_ascii_uppercase()
@@ -69,10 +167,20 @@ impl Dialect for SnowflakeDialect {
         true
     }
 
+    /// See <https://docs.snowflake.com/en/sql-reference/constructs/where#joins-in-the-where-clause>
+    fn supports_outer_join_operator(&self) -> bool {
+        true
+    }
+
     fn supports_connect_by(&self) -> bool {
         true
     }
 
+    /// See <https://docs.snowflake.com/en/sql-reference/sql/execute-immediate>
+    fn supports_execute_immediate(&self) -> bool {
+        true
+    }
+
     fn supports_match_recognize(&self) -> bool {
         true
     }
@@ -102,6 +210,20 @@ impl Dialect for SnowflakeDialect {
     }
 
     fn parse_statement(&self, parser: &mut Parser) -> Option<Result<Statement, ParserError>> {
+        if parser.parse_keyword(Keyword::BEGIN) {
+            return Some(parser.parse_begin_exception_end());
+        }
+
+        if parser.parse_keywords(&[Keyword::ALTER, Keyword::SESSION]) {
+            // ALTER SESSION
+            let set = match parser.parse_one_of_keywords(&[Keyword::SET, Keyword::UNSET]) {
+                Some(Keyword::SET) => true,
+                Some(Keyword::UNSET) => false,
+                _ => return Some(parser.expected("SET or UNSET", parser.peek_token())),
+            };
+            return Some(parse_alter_session(parser, set));
+        }
+
         if parser.parse_keyword(Keyword::CREATE) {
             // possibly CREATE STAGE
             //[ OR  REPLACE ]
@@ -116,16 +238,19 @@ impl Dialect for SnowflakeDialect {
             let mut temporary = false;
             let mut volatile = false;
             let mut transient = false;
+            let mut iceberg = false;
 
             match parser.parse_one_of_keywords(&[
                 Keyword::TEMP,
                 Keyword::TEMPORARY,
                 Keyword::VOLATILE,
                 Keyword::TRANSIENT,
+                Keyword::ICEBERG,
             ]) {
                 Some(Keyword::TEMP | Keyword::TEMPORARY) => temporary = true,
                 Some(Keyword::VOLATILE) => volatile = true,
                 Some(Keyword::TRANSIENT) => transient = true,
+                Some(Keyword::ICEBERG) => iceberg = true,
                 _ => {}
             }
 
@@ -134,8 +259,10 @@ impl Dialect for SnowflakeDialect {
                 return Some(parse_create_stage(or_replace, temporary, parser));
             } else if parser.parse_keyword(Keyword::TABLE) {
                 return Some(parse_create_table(
-                    or_replace, global, temporary, volatile, transient, parser,
+                    or_replace, global, temporary, volatile, transient, iceberg, parser,
                 ));
+            } else if parser.parse_keyword(Keyword::DATABASE) {
+                return Some(parse_create_database(or_replace, transient, parser));
             } else {
                 // need to go back with the cursor
                 let mut back = 1;
@@ -155,6 +282,28 @@ impl Dialect for SnowflakeDialect {
             return Some(parse_copy_into(parser));
         }
 
+        if let Some(kw) = parser.parse_one_of_keywords(&[
+            Keyword::LIST,
+            Keyword::LS,
+            Keyword::REMOVE,
+            Keyword::RM,
+        ]) {
+            return Some(parse_file_staging_command(kw, parser));
+        }
+
+        if parser.parse_keyword(Keyword::SHOW) {
+            let terse = parser.parse_keyword(Keyword::TERSE);
+            if parser.parse_keyword(Keyword::OBJECTS) {
+                return Some(parse_show_objects(terse, parser));
+            }
+            //Give back Keyword::TERSE
+            if terse {
+                parser.prev_token();
+            }
+            //Give back Keyword::SHOW
+            parser.prev_token();
+        }
+
         None
     }
 
@@ -214,16 +363,262 @@ impl Dialect for SnowflakeDialect {
     fn supports_show_like_before_in(&self) -> bool {
         true
     }
+
+    fn supports_left_associative_joins_without_parens(&self) -> bool {
+        false
+    }
+
+    fn is_reserved_for_identifier(&self, kw: Keyword) -> bool {
+        // Unreserve some keywords that Snowflake accepts as identifiers
+        // See: https://docs.snowflake.com/en/sql-reference/reserved-keywords
+        if matches!(kw, Keyword::INTERVAL) {
+            false
+        } else {
+            RESERVED_FOR_IDENTIFIER.contains(&kw)
+        }
+    }
+
+    fn supports_partiql(&self) -> bool {
+        true
+    }
+
+    fn is_column_alias(&self, kw: &Keyword, parser: &mut Parser) -> bool {
+        match kw {
+            // The following keywords can be considered an alias as long as 
+            // they are not followed by other tokens that may change their meaning
+            // e.g. `SELECT * EXCEPT (col1) FROM tbl`
+            Keyword::EXCEPT
+            // e.g. `INSERT INTO t SELECT 1 RETURNING *`
+            | Keyword::RETURNING if !matches!(parser.peek_token_ref().token, Token::Comma | Token::EOF) =>
+            {
+                false
+            }
+
+            // e.g. `SELECT 1 LIMIT 5` - not an alias
+            // e.g. `SELECT 1 OFFSET 5 ROWS` - not an alias
+            Keyword::LIMIT | Keyword::OFFSET if peek_for_limit_options(parser) => false,
+
+            // `FETCH` can be considered an alias as long as it's not followed by `FIRST`` or `NEXT`
+            // which would give it a different meanings, for example: 
+            // `SELECT 1 FETCH FIRST 10 ROWS` - not an alias
+            // `SELECT 1 FETCH 10` - not an alias
+            Keyword::FETCH if parser.peek_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]).is_some()
+                    || peek_for_limit_options(parser) =>
+            {
+                false
+            }
+
+            // Reserved keywords by the Snowflake dialect, which seem to be less strictive 
+            // than what is listed in `keywords::RESERVED_FOR_COLUMN_ALIAS`. The following 
+            // keywords were tested with the this statement: `SELECT 1 <KW>`.
+            Keyword::FROM
+            | Keyword::GROUP
+            | Keyword::HAVING
+            | Keyword::INTERSECT
+            | Keyword::INTO
+            | Keyword::MINUS
+            | Keyword::ORDER
+            | Keyword::SELECT
+            | Keyword::UNION
+            | Keyword::WHERE
+            | Keyword::WITH => false,
+
+            // Any other word is considered an alias
+            _ => true,
+        }
+    }
+
+    fn is_table_alias(&self, kw: &Keyword, parser: &mut Parser) -> bool {
+        match kw {
+            // The following keywords can be considered an alias as long as
+            // they are not followed by other tokens that may change their meaning
+            Keyword::RETURNING
+            | Keyword::INNER
+            | Keyword::USING
+            | Keyword::PIVOT
+            | Keyword::UNPIVOT
+            | Keyword::EXCEPT
+            | Keyword::MATCH_RECOGNIZE
+                if !matches!(parser.peek_token_ref().token, Token::SemiColon | Token::EOF) =>
+            {
+                false
+            }
+
+            // `LIMIT` can be considered an alias as long as it's not followed by a value. For example:
+            // `SELECT * FROM tbl LIMIT WHERE 1=1` - alias
+            // `SELECT * FROM tbl LIMIT 3` - not an alias
+            Keyword::LIMIT | Keyword::OFFSET if peek_for_limit_options(parser) => false,
+
+            // `FETCH` can be considered an alias as long as it's not followed by `FIRST`` or `NEXT`
+            // which would give it a different meanings, for example:
+            // `SELECT * FROM tbl FETCH FIRST 10 ROWS` - not an alias
+            // `SELECT * FROM tbl FETCH 10` - not an alias
+            Keyword::FETCH
+                if parser
+                    .peek_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])
+                    .is_some()
+                    || peek_for_limit_options(parser) =>
+            {
+                false
+            }
+
+            // All sorts of join-related keywords can be considered aliases unless additional
+            // keywords change their meaning.
+            Keyword::RIGHT | Keyword::LEFT | Keyword::SEMI | Keyword::ANTI
+                if parser
+                    .peek_one_of_keywords(&[Keyword::JOIN, Keyword::OUTER])
+                    .is_some() =>
+            {
+                false
+            }
+
+            Keyword::GLOBAL if parser.peek_keyword(Keyword::FULL) => false,
+
+            // Reserved keywords by the Snowflake dialect, which seem to be less strictive
+            // than what is listed in `keywords::RESERVED_FOR_TABLE_ALIAS`. The following
+            // keywords were tested with the this statement: `SELECT <KW>.* FROM tbl <KW>`.
+            Keyword::WITH
+            | Keyword::ORDER
+            | Keyword::SELECT
+            | Keyword::WHERE
+            | Keyword::GROUP
+            | Keyword::HAVING
+            | Keyword::LATERAL
+            | Keyword::UNION
+            | Keyword::INTERSECT
+            | Keyword::MINUS
+            | Keyword::ON
+            | Keyword::JOIN
+            | Keyword::INNER
+            | Keyword::CROSS
+            | Keyword::FULL
+            | Keyword::LEFT
+            | Keyword::RIGHT
+            | Keyword::NATURAL
+            | Keyword::USING
+            | Keyword::ASOF
+            | Keyword::MATCH_CONDITION
+            | Keyword::SET
+            | Keyword::QUALIFY
+            | Keyword::FOR
+            | Keyword::START
+            | Keyword::CONNECT
+            | Keyword::SAMPLE
+            | Keyword::TABLESAMPLE
+            | Keyword::FROM => false,
+
+            // Any other word is considered an alias
+            _ => true,
+        }
+    }
+
+    fn is_table_factor(&self, kw: &Keyword, parser: &mut Parser) -> bool {
+        match kw {
+            Keyword::LIMIT if peek_for_limit_options(parser) => false,
+            _ => !RESERVED_KEYWORDS_FOR_TABLE_FACTOR.contains(kw),
+        }
+    }
+
+    /// See: <https://docs.snowflake.com/en/sql-reference/constructs/at-before>
+    fn supports_timestamp_versioning(&self) -> bool {
+        true
+    }
+
+    /// See: <https://docs.snowflake.com/en/sql-reference/constructs/group-by>
+    fn supports_group_by_expr(&self) -> bool {
+        true
+    }
+
+    /// See: <https://docs.snowflake.com/en/sql-reference/constructs/connect-by>
+    fn get_reserved_keywords_for_select_item_operator(&self) -> &[Keyword] {
+        &RESERVED_KEYWORDS_FOR_SELECT_ITEM_OPERATOR
+    }
+
+    fn supports_space_separated_column_options(&self) -> bool {
+        true
+    }
+
+    fn supports_comma_separated_drop_column_list(&self) -> bool {
+        true
+    }
+
+    fn is_identifier_generating_function_name(
+        &self,
+        ident: &Ident,
+        name_parts: &[ObjectNamePart],
+    ) -> bool {
+        ident.quote_style.is_none()
+            && ident.value.to_lowercase() == "identifier"
+            && !name_parts
+                .iter()
+                .any(|p| matches!(p, ObjectNamePart::Function(_)))
+    }
+
+    // For example: `SELECT IDENTIFIER('alias1').* FROM tbl AS alias1`
+    fn supports_select_expr_star(&self) -> bool {
+        true
+    }
+
+    fn supports_select_wildcard_exclude(&self) -> bool {
+        true
+    }
+}
+
+// Peeks ahead to identify tokens that are expected after
+// a LIMIT/FETCH keyword.
+fn peek_for_limit_options(parser: &Parser) -> bool {
+    match &parser.peek_token_ref().token {
+        Token::Number(_, _) | Token::Placeholder(_) => true,
+        Token::SingleQuotedString(val) if val.is_empty() => true,
+        Token::DollarQuotedString(DollarQuotedString { value, .. }) if value.is_empty() => true,
+        Token::Word(w) if w.keyword == Keyword::NULL => true,
+        _ => false,
+    }
+}
+
+fn parse_file_staging_command(kw: Keyword, parser: &mut Parser) -> Result<Statement, ParserError> {
+    let stage = parse_snowflake_stage_name(parser)?;
+    let pattern = if parser.parse_keyword(Keyword::PATTERN) {
+        parser.expect_token(&Token::Eq)?;
+        Some(parser.parse_literal_string()?)
+    } else {
+        None
+    };
+
+    match kw {
+        Keyword::LIST | Keyword::LS => Ok(Statement::List(FileStagingCommand { stage, pattern })),
+        Keyword::REMOVE | Keyword::RM => {
+            Ok(Statement::Remove(FileStagingCommand { stage, pattern }))
+        }
+        _ => Err(ParserError::ParserError(
+            "unexpected stage command, expecting LIST, LS, REMOVE or RM".to_string(),
+        )),
+    }
+}
+
+/// Parse snowflake alter session.
+/// <https://docs.snowflake.com/en/sql-reference/sql/alter-session>
+fn parse_alter_session(parser: &mut Parser, set: bool) -> Result<Statement, ParserError> {
+    let session_options = parse_session_options(parser, set)?;
+    Ok(Statement::AlterSession {
+        set,
+        session_params: KeyValueOptions {
+            options: session_options,
+            delimiter: KeyValueOptionsDelimiter::Space,
+        },
+    })
 }
 
 /// Parse snowflake create table statement.
 /// <https://docs.snowflake.com/en/sql-reference/sql/create-table>
+/// <https://docs.snowflake.com/en/sql-reference/sql/create-iceberg-table>
 pub fn parse_create_table(
     or_replace: bool,
     global: Option<bool>,
     temporary: bool,
     volatile: bool,
     transient: bool,
+    iceberg: bool,
     parser: &mut Parser,
 ) -> Result<Statement, ParserError> {
     let if_not_exists = parser.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
@@ -235,6 +630,7 @@ pub fn parse_create_table(
         .temporary(temporary)
         .transient(transient)
         .volatile(volatile)
+        .iceberg(iceberg)
         .global(global)
         .hive_formats(Some(Default::default()));
 
@@ -244,39 +640,40 @@ pub fn parse_create_table(
     // "CREATE TABLE x COPY GRANTS (c INT)" and "CREATE TABLE x (c INT) COPY GRANTS" are both
     // accepted by Snowflake
 
+    let mut plain_options = vec![];
+
     loop {
         let next_token = parser.next_token();
         match &next_token.token {
             Token::Word(word) => match word.keyword {
                 Keyword::COPY => {
-                    parser.expect_keyword(Keyword::GRANTS)?;
+                    parser.expect_keyword_is(Keyword::GRANTS)?;
                     builder = builder.copy_grants(true);
                 }
                 Keyword::COMMENT => {
                     // Rewind the COMMENT keyword
                     parser.prev_token();
-                    builder = builder.comment(parser.parse_optional_inline_comment()?);
+                    if let Some(comment_def) = parser.parse_optional_inline_comment()? {
+                        plain_options.push(SqlOption::Comment(comment_def))
+                    }
                 }
                 Keyword::AS => {
                     let query = parser.parse_query()?;
                     builder = builder.query(Some(query));
-                    break;
                 }
                 Keyword::CLONE => {
                     let clone = parser.parse_object_name(false).ok();
                     builder = builder.clone_clause(clone);
-                    break;
                 }
                 Keyword::LIKE => {
                     let like = parser.parse_object_name(false).ok();
                     builder = builder.like(like);
-                    break;
                 }
                 Keyword::CLUSTER => {
-                    parser.expect_keyword(Keyword::BY)?;
+                    parser.expect_keyword_is(Keyword::BY)?;
                     parser.expect_token(&Token::LParen)?;
                     let cluster_by = Some(WrappedCollection::Parentheses(
-                        parser.parse_comma_separated(|p| p.parse_identifier(false))?,
+                        parser.parse_comma_separated(|p| p.parse_expr())?,
                     ));
                     parser.expect_token(&Token::RParen)?;
 
@@ -284,29 +681,11 @@ pub fn parse_create_table(
                 }
                 Keyword::ENABLE_SCHEMA_EVOLUTION => {
                     parser.expect_token(&Token::Eq)?;
-                    let enable_schema_evolution =
-                        match parser.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
-                            Some(Keyword::TRUE) => true,
-                            Some(Keyword::FALSE) => false,
-                            _ => {
-                                return parser.expected("TRUE or FALSE", next_token);
-                            }
-                        };
-
-                    builder = builder.enable_schema_evolution(Some(enable_schema_evolution));
+                    builder = builder.enable_schema_evolution(Some(parser.parse_boolean_string()?));
                 }
                 Keyword::CHANGE_TRACKING => {
                     parser.expect_token(&Token::Eq)?;
-                    let change_tracking =
-                        match parser.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
-                            Some(Keyword::TRUE) => true,
-                            Some(Keyword::FALSE) => false,
-                            _ => {
-                                return parser.expected("TRUE or FALSE", next_token);
-                            }
-                        };
-
-                    builder = builder.change_tracking(Some(change_tracking));
+                    builder = builder.change_tracking(Some(parser.parse_boolean_string()?));
                 }
                 Keyword::DATA_RETENTION_TIME_IN_DAYS => {
                     parser.expect_token(&Token::Eq)?;
@@ -336,16 +715,16 @@ pub fn parse_create_table(
                     parser.prev_token();
                 }
                 Keyword::AGGREGATION => {
-                    parser.expect_keyword(Keyword::POLICY)?;
+                    parser.expect_keyword_is(Keyword::POLICY)?;
                     let aggregation_policy = parser.parse_object_name(false)?;
                     builder = builder.with_aggregation_policy(Some(aggregation_policy));
                 }
                 Keyword::ROW => {
                     parser.expect_keywords(&[Keyword::ACCESS, Keyword::POLICY])?;
                     let policy = parser.parse_object_name(false)?;
-                    parser.expect_keyword(Keyword::ON)?;
+                    parser.expect_keyword_is(Keyword::ON)?;
                     parser.expect_token(&Token::LParen)?;
-                    let columns = parser.parse_comma_separated(|p| p.parse_identifier(false))?;
+                    let columns = parser.parse_comma_separated(|p| p.parse_identifier())?;
                     parser.expect_token(&Token::RParen)?;
 
                     builder =
@@ -357,6 +736,35 @@ pub fn parse_create_table(
                     parser.expect_token(&Token::RParen)?;
                     builder = builder.with_tags(Some(tags));
                 }
+                Keyword::ON if parser.parse_keyword(Keyword::COMMIT) => {
+                    let on_commit = Some(parser.parse_create_table_on_commit()?);
+                    builder = builder.on_commit(on_commit);
+                }
+                Keyword::EXTERNAL_VOLUME => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder.external_volume = Some(parser.parse_literal_string()?);
+                }
+                Keyword::CATALOG => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder.catalog = Some(parser.parse_literal_string()?);
+                }
+                Keyword::BASE_LOCATION => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder.base_location = Some(parser.parse_literal_string()?);
+                }
+                Keyword::CATALOG_SYNC => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder.catalog_sync = Some(parser.parse_literal_string()?);
+                }
+                Keyword::STORAGE_SERIALIZATION_POLICY => {
+                    parser.expect_token(&Token::Eq)?;
+
+                    builder.storage_serialization_policy =
+                        Some(parse_storage_serialization_policy(parser)?);
+                }
+                Keyword::IF if parser.parse_keywords(&[Keyword::NOT, Keyword::EXISTS]) => {
+                    builder = builder.if_not_exists(true);
+                }
                 _ => {
                     return parser.expected("end of statement", next_token);
                 }
@@ -367,7 +775,7 @@ pub fn parse_create_table(
                 builder = builder.columns(columns).constraints(constraints);
             }
             Token::EOF => {
-                if builder.columns.is_empty() {
+                if !builder.validate_schema_info() {
                     return Err(ParserError::ParserError(
                         "unexpected end of input".to_string(),
                     ));
@@ -376,7 +784,7 @@ pub fn parse_create_table(
                 break;
             }
             Token::SemiColon => {
-                if builder.columns.is_empty() {
+                if !builder.validate_schema_info() {
                     return Err(ParserError::ParserError(
                         "unexpected end of input".to_string(),
                     ));
@@ -390,10 +798,146 @@ pub fn parse_create_table(
             }
         }
     }
+    let table_options = if !plain_options.is_empty() {
+        crate::ast::CreateTableOptions::Plain(plain_options)
+    } else {
+        crate::ast::CreateTableOptions::None
+    };
+
+    builder = builder.table_options(table_options);
+
+    if iceberg && builder.base_location.is_none() {
+        return Err(ParserError::ParserError(
+            "BASE_LOCATION is required for ICEBERG tables".to_string(),
+        ));
+    }
 
     Ok(builder.build())
 }
 
+/// Parse snowflake create database statement.
+/// <https://docs.snowflake.com/en/sql-reference/sql/create-database>
+pub fn parse_create_database(
+    or_replace: bool,
+    transient: bool,
+    parser: &mut Parser,
+) -> Result<Statement, ParserError> {
+    let if_not_exists = parser.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+    let name = parser.parse_object_name(false)?;
+
+    let mut builder = CreateDatabaseBuilder::new(name)
+        .or_replace(or_replace)
+        .transient(transient)
+        .if_not_exists(if_not_exists);
+
+    loop {
+        let next_token = parser.next_token();
+        match &next_token.token {
+            Token::Word(word) => match word.keyword {
+                Keyword::CLONE => {
+                    builder = builder.clone_clause(Some(parser.parse_object_name(false)?));
+                }
+                Keyword::DATA_RETENTION_TIME_IN_DAYS => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder =
+                        builder.data_retention_time_in_days(Some(parser.parse_literal_uint()?));
+                }
+                Keyword::MAX_DATA_EXTENSION_TIME_IN_DAYS => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder =
+                        builder.max_data_extension_time_in_days(Some(parser.parse_literal_uint()?));
+                }
+                Keyword::EXTERNAL_VOLUME => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.external_volume(Some(parser.parse_literal_string()?));
+                }
+                Keyword::CATALOG => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.catalog(Some(parser.parse_literal_string()?));
+                }
+                Keyword::REPLACE_INVALID_CHARACTERS => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder =
+                        builder.replace_invalid_characters(Some(parser.parse_boolean_string()?));
+                }
+                Keyword::DEFAULT_DDL_COLLATION => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.default_ddl_collation(Some(parser.parse_literal_string()?));
+                }
+                Keyword::STORAGE_SERIALIZATION_POLICY => {
+                    parser.expect_token(&Token::Eq)?;
+                    let policy = parse_storage_serialization_policy(parser)?;
+                    builder = builder.storage_serialization_policy(Some(policy));
+                }
+                Keyword::COMMENT => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.comment(Some(parser.parse_literal_string()?));
+                }
+                Keyword::CATALOG_SYNC => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.catalog_sync(Some(parser.parse_literal_string()?));
+                }
+                Keyword::CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER => {
+                    parser.expect_token(&Token::Eq)?;
+                    builder = builder.catalog_sync_namespace_flatten_delimiter(Some(
+                        parser.parse_literal_string()?,
+                    ));
+                }
+                Keyword::CATALOG_SYNC_NAMESPACE_MODE => {
+                    parser.expect_token(&Token::Eq)?;
+                    let mode =
+                        match parser.parse_one_of_keywords(&[Keyword::NEST, Keyword::FLATTEN]) {
+                            Some(Keyword::NEST) => CatalogSyncNamespaceMode::Nest,
+                            Some(Keyword::FLATTEN) => CatalogSyncNamespaceMode::Flatten,
+                            _ => {
+                                return parser.expected("NEST or FLATTEN", next_token);
+                            }
+                        };
+                    builder = builder.catalog_sync_namespace_mode(Some(mode));
+                }
+                Keyword::WITH => {
+                    if parser.parse_keyword(Keyword::TAG) {
+                        parser.expect_token(&Token::LParen)?;
+                        let tags = parser.parse_comma_separated(Parser::parse_tag)?;
+                        parser.expect_token(&Token::RParen)?;
+                        builder = builder.with_tags(Some(tags));
+                    } else if parser.parse_keyword(Keyword::CONTACT) {
+                        parser.expect_token(&Token::LParen)?;
+                        let contacts = parser.parse_comma_separated(|p| {
+                            let purpose = p.parse_identifier()?.value;
+                            p.expect_token(&Token::Eq)?;
+                            let contact = p.parse_identifier()?.value;
+                            Ok(ContactEntry { purpose, contact })
+                        })?;
+                        parser.expect_token(&Token::RParen)?;
+                        builder = builder.with_contacts(Some(contacts));
+                    } else {
+                        return parser.expected("TAG or CONTACT", next_token);
+                    }
+                }
+                _ => return parser.expected("end of statement", next_token),
+            },
+            Token::SemiColon | Token::EOF => break,
+            _ => return parser.expected("end of statement", next_token),
+        }
+    }
+    Ok(builder.build())
+}
+
+pub fn parse_storage_serialization_policy(
+    parser: &mut Parser,
+) -> Result<StorageSerializationPolicy, ParserError> {
+    let next_token = parser.next_token();
+    match &next_token.token {
+        Token::Word(w) => match w.keyword {
+            Keyword::COMPATIBLE => Ok(StorageSerializationPolicy::Compatible),
+            Keyword::OPTIMIZED => Ok(StorageSerializationPolicy::Optimized),
+            _ => parser.expected("storage_serialization_policy", next_token),
+        },
+        _ => parser.expected("storage_serialization_policy", next_token),
+    }
+}
+
 pub fn parse_create_stage(
     or_replace: bool,
     temporary: bool,
@@ -413,28 +957,25 @@ pub fn parse_create_stage(
     // [ directoryTableParams ]
     if parser.parse_keyword(Keyword::DIRECTORY) {
         parser.expect_token(&Token::Eq)?;
-        directory_table_params = parse_parentheses_options(parser)?;
+        directory_table_params = parser.parse_key_value_options(true, &[])?;
     }
 
     // [ file_format]
     if parser.parse_keyword(Keyword::FILE_FORMAT) {
         parser.expect_token(&Token::Eq)?;
-        file_format = parse_parentheses_options(parser)?;
+        file_format = parser.parse_key_value_options(true, &[])?;
     }
 
     // [ copy_options ]
     if parser.parse_keyword(Keyword::COPY_OPTIONS) {
         parser.expect_token(&Token::Eq)?;
-        copy_options = parse_parentheses_options(parser)?;
+        copy_options = parser.parse_key_value_options(true, &[])?;
     }
 
     // [ comment ]
     if parser.parse_keyword(Keyword::COMMENT) {
         parser.expect_token(&Token::Eq)?;
-        comment = Some(match parser.next_token().token {
-            Token::SingleQuotedString(word) => Ok(word),
-            _ => parser.expected("a comment statement", parser.peek_token()),
-        }?)
+        comment = Some(parser.parse_comment_value()?);
     }
 
     Ok(Statement::CreateStage {
@@ -443,14 +984,17 @@ pub fn parse_create_stage(
         if_not_exists,
         name,
         stage_params,
-        directory_table_params: DataLoadingOptions {
+        directory_table_params: KeyValueOptions {
             options: directory_table_params,
+            delimiter: KeyValueOptionsDelimiter::Space,
         },
-        file_format: DataLoadingOptions {
+        file_format: KeyValueOptions {
             options: file_format,
+            delimiter: KeyValueOptionsDelimiter::Space,
         },
-        copy_options: DataLoadingOptions {
+        copy_options: KeyValueOptions {
             options: copy_options,
+            delimiter: KeyValueOptionsDelimiter::Space,
         },
         comment,
     })
@@ -460,7 +1004,7 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result<Ident, ParserE
     let mut ident = String::new();
     while let Some(next_token) = parser.next_token_no_skip() {
         match &next_token.token {
-            Token::Whitespace(_) => break,
+            Token::Whitespace(_) | Token::SemiColon => break,
             Token::Period => {
                 parser.prev_token();
                 break;
@@ -473,7 +1017,9 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) -> Result<Ident, ParserE
             Token::Tilde => ident.push('~'),
             Token::Mod => ident.push('%'),
             Token::Div => ident.push('/'),
-            Token::Word(w) => ident.push_str(&w.value),
+            Token::Plus => ident.push('+'),
+            Token::Number(n, _) => ident.push_str(n),
+            Token::Word(w) => ident.push_str(&w.to_string()),
             _ => return parser.expected("stage name identifier", parser.peek_token()),
         }
     }
@@ -491,7 +1037,7 @@ pub fn parse_snowflake_stage_name(parser: &mut Parser) -> Result<ObjectName, Par
                     break;
                 }
             }
-            Ok(ObjectName(idents))
+            Ok(ObjectName::from(idents))
         }
         _ => {
             parser.prev_token();
@@ -500,40 +1046,76 @@ pub fn parse_snowflake_stage_name(parser: &mut Parser) -> Result<ObjectName, Par
     }
 }
 
+/// Parses a `COPY INTO` statement. Snowflake has two variants, `COPY INTO <table>`
+/// and `COPY INTO <location>` which have different syntax.
 pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
-    let into: ObjectName = parse_snowflake_stage_name(parser)?;
+    let kind = match parser.peek_token().token {
+        // Indicates an internal stage
+        Token::AtSign => CopyIntoSnowflakeKind::Location,
+        // Indicates an external stage, i.e. s3://, gcs:// or azure://
+        Token::SingleQuotedString(s) if s.contains("://") => CopyIntoSnowflakeKind::Location,
+        _ => CopyIntoSnowflakeKind::Table,
+    };
+
     let mut files: Vec<String> = vec![];
-    let mut from_transformations: Option<Vec<StageLoadSelectItem>> = None;
-    let from_stage_alias;
-    let from_stage: ObjectName;
-    let stage_params: StageParamsObject;
+    let mut from_transformations: Option<Vec<StageLoadSelectItemKind>> = None;
+    let mut from_stage_alias = None;
+    let mut from_stage = None;
+    let mut stage_params = StageParamsObject {
+        url: None,
+        encryption: KeyValueOptions {
+            options: vec![],
+            delimiter: KeyValueOptionsDelimiter::Space,
+        },
+        endpoint: None,
+        storage_integration: None,
+        credentials: KeyValueOptions {
+            options: vec![],
+            delimiter: KeyValueOptionsDelimiter::Space,
+        },
+    };
+    let mut from_query = None;
+    let mut partition = None;
+    let mut file_format = Vec::new();
+    let mut pattern = None;
+    let mut validation_mode = None;
+    let mut copy_options = Vec::new();
 
-    parser.expect_keyword(Keyword::FROM)?;
-    // check if data load transformations are present
+    let into: ObjectName = parse_snowflake_stage_name(parser)?;
+    if kind == CopyIntoSnowflakeKind::Location {
+        stage_params = parse_stage_params(parser)?;
+    }
+
+    let into_columns = match &parser.peek_token().token {
+        Token::LParen => Some(parser.parse_parenthesized_column_list(IsOptional::Optional, true)?),
+        _ => None,
+    };
+
+    parser.expect_keyword_is(Keyword::FROM)?;
     match parser.next_token().token {
-        Token::LParen => {
-            // data load with transformations
-            parser.expect_keyword(Keyword::SELECT)?;
+        Token::LParen if kind == CopyIntoSnowflakeKind::Table => {
+            // Data load with transformations
+            parser.expect_keyword_is(Keyword::SELECT)?;
             from_transformations = parse_select_items_for_data_load(parser)?;
 
-            parser.expect_keyword(Keyword::FROM)?;
-            from_stage = parse_snowflake_stage_name(parser)?;
+            parser.expect_keyword_is(Keyword::FROM)?;
+            from_stage = Some(parse_snowflake_stage_name(parser)?);
             stage_params = parse_stage_params(parser)?;
 
-            // as
-            from_stage_alias = if parser.parse_keyword(Keyword::AS) {
-                Some(match parser.next_token().token {
-                    Token::Word(w) => Ok(Ident::new(w.value)),
-                    _ => parser.expected("stage alias", parser.peek_token()),
-                }?)
-            } else {
-                None
-            };
+            // Parse an optional alias
+            from_stage_alias = parser
+                .maybe_parse_table_alias()?
+                .map(|table_alias| table_alias.name);
+            parser.expect_token(&Token::RParen)?;
+        }
+        Token::LParen if kind == CopyIntoSnowflakeKind::Location => {
+            // Data unload with a query
+            from_query = Some(parser.parse_query()?);
             parser.expect_token(&Token::RParen)?;
         }
         _ => {
             parser.prev_token();
-            from_stage = parse_snowflake_stage_name(parser)?;
+            from_stage = Some(parse_snowflake_stage_name(parser)?);
             stage_params = parse_stage_params(parser)?;
 
             // as
@@ -546,167 +1128,188 @@ pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
                 None
             };
         }
-    };
+    }
 
-    // [ files ]
-    if parser.parse_keyword(Keyword::FILES) {
-        parser.expect_token(&Token::Eq)?;
-        parser.expect_token(&Token::LParen)?;
-        let mut continue_loop = true;
-        while continue_loop {
-            continue_loop = false;
+    loop {
+        // FILE_FORMAT
+        if parser.parse_keyword(Keyword::FILE_FORMAT) {
+            parser.expect_token(&Token::Eq)?;
+            file_format = parser.parse_key_value_options(true, &[])?;
+        // PARTITION BY
+        } else if parser.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
+            partition = Some(Box::new(parser.parse_expr()?))
+        // FILES
+        } else if parser.parse_keyword(Keyword::FILES) {
+            parser.expect_token(&Token::Eq)?;
+            parser.expect_token(&Token::LParen)?;
+            let mut continue_loop = true;
+            while continue_loop {
+                continue_loop = false;
+                let next_token = parser.next_token();
+                match next_token.token {
+                    Token::SingleQuotedString(s) => files.push(s),
+                    _ => parser.expected("file token", next_token)?,
+                };
+                if parser.next_token().token.eq(&Token::Comma) {
+                    continue_loop = true;
+                } else {
+                    parser.prev_token(); // not a comma, need to go back
+                }
+            }
+            parser.expect_token(&Token::RParen)?;
+        // PATTERN
+        } else if parser.parse_keyword(Keyword::PATTERN) {
+            parser.expect_token(&Token::Eq)?;
             let next_token = parser.next_token();
-            match next_token.token {
-                Token::SingleQuotedString(s) => files.push(s),
-                _ => parser.expected("file token", next_token)?,
-            };
-            if parser.next_token().token.eq(&Token::Comma) {
-                continue_loop = true;
-            } else {
-                parser.prev_token(); // not a comma, need to go back
+            pattern = Some(match next_token.token {
+                Token::SingleQuotedString(s) => s,
+                _ => parser.expected("pattern", next_token)?,
+            });
+        // VALIDATION MODE
+        } else if parser.parse_keyword(Keyword::VALIDATION_MODE) {
+            parser.expect_token(&Token::Eq)?;
+            validation_mode = Some(parser.next_token().token.to_string());
+        // COPY OPTIONS
+        } else if parser.parse_keyword(Keyword::COPY_OPTIONS) {
+            parser.expect_token(&Token::Eq)?;
+            copy_options = parser.parse_key_value_options(true, &[])?;
+        } else {
+            match parser.next_token().token {
+                Token::SemiColon | Token::EOF => break,
+                Token::Comma => continue,
+                // In `COPY INTO <location>` the copy options do not have a shared key
+                // like in `COPY INTO <table>`
+                Token::Word(key) => copy_options.push(parser.parse_key_value_option(key)?),
+                _ => return parser.expected("another copy option, ; or EOF'", parser.peek_token()),
             }
         }
-        parser.expect_token(&Token::RParen)?;
-    }
-
-    // [ pattern ]
-    let mut pattern = None;
-    if parser.parse_keyword(Keyword::PATTERN) {
-        parser.expect_token(&Token::Eq)?;
-        let next_token = parser.next_token();
-        pattern = Some(match next_token.token {
-            Token::SingleQuotedString(s) => s,
-            _ => parser.expected("pattern", next_token)?,
-        });
-    }
-
-    // [ file_format]
-    let mut file_format = Vec::new();
-    if parser.parse_keyword(Keyword::FILE_FORMAT) {
-        parser.expect_token(&Token::Eq)?;
-        file_format = parse_parentheses_options(parser)?;
-    }
-
-    // [ copy_options ]
-    let mut copy_options = Vec::new();
-    if parser.parse_keyword(Keyword::COPY_OPTIONS) {
-        parser.expect_token(&Token::Eq)?;
-        copy_options = parse_parentheses_options(parser)?;
-    }
-
-    // [ VALIDATION_MODE ]
-    let mut validation_mode = None;
-    if parser.parse_keyword(Keyword::VALIDATION_MODE) {
-        parser.expect_token(&Token::Eq)?;
-        validation_mode = Some(parser.next_token().token.to_string());
     }
 
     Ok(Statement::CopyIntoSnowflake {
+        kind,
         into,
-        from_stage,
-        from_stage_alias,
+        into_columns,
+        from_obj: from_stage,
+        from_obj_alias: from_stage_alias,
         stage_params,
         from_transformations,
+        from_query,
         files: if files.is_empty() { None } else { Some(files) },
         pattern,
-        file_format: DataLoadingOptions {
+        file_format: KeyValueOptions {
             options: file_format,
+            delimiter: KeyValueOptionsDelimiter::Space,
         },
-        copy_options: DataLoadingOptions {
+        copy_options: KeyValueOptions {
             options: copy_options,
+            delimiter: KeyValueOptionsDelimiter::Space,
         },
         validation_mode,
+        partition,
     })
 }
 
 fn parse_select_items_for_data_load(
     parser: &mut Parser,
-) -> Result<Option<Vec<StageLoadSelectItem>>, ParserError> {
-    // [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ]
-    let mut select_items: Vec<StageLoadSelectItem> = vec![];
+) -> Result<Option<Vec<StageLoadSelectItemKind>>, ParserError> {
+    let mut select_items: Vec<StageLoadSelectItemKind> = vec![];
     loop {
-        let mut alias: Option<Ident> = None;
-        let mut file_col_num: i32 = 0;
-        let mut element: Option<Ident> = None;
-        let mut item_as: Option<Ident> = None;
+        match parser.maybe_parse(parse_select_item_for_data_load)? {
+            // [<alias>.]$<file_col_num>[.<element>] [ , [<alias>.]$<file_col_num>[.<element>] ... ]
+            Some(item) => select_items.push(StageLoadSelectItemKind::StageLoadSelectItem(item)),
+            // Fallback, try to parse a standard SQL select item
+            None => select_items.push(StageLoadSelectItemKind::SelectItem(
+                parser.parse_select_item()?,
+            )),
+        }
+        if matches!(parser.peek_token_ref().token, Token::Comma) {
+            parser.advance_token();
+        } else {
+            break;
+        }
+    }
+    Ok(Some(select_items))
+}
 
-        let next_token = parser.next_token();
-        match next_token.token {
+fn parse_select_item_for_data_load(
+    parser: &mut Parser,
+) -> Result<StageLoadSelectItem, ParserError> {
+    let mut alias: Option<Ident> = None;
+    let mut file_col_num: i32 = 0;
+    let mut element: Option<Ident> = None;
+    let mut item_as: Option<Ident> = None;
+
+    let next_token = parser.next_token();
+    match next_token.token {
+        Token::Placeholder(w) => {
+            file_col_num = w.to_string().split_off(1).parse::<i32>().map_err(|e| {
+                ParserError::ParserError(format!("Could not parse '{w}' as i32: {e}"))
+            })?;
+            Ok(())
+        }
+        Token::Word(w) => {
+            alias = Some(Ident::new(w.value));
+            Ok(())
+        }
+        _ => parser.expected("alias or file_col_num", next_token),
+    }?;
+
+    if alias.is_some() {
+        parser.expect_token(&Token::Period)?;
+        // now we get col_num token
+        let col_num_token = parser.next_token();
+        match col_num_token.token {
             Token::Placeholder(w) => {
                 file_col_num = w.to_string().split_off(1).parse::<i32>().map_err(|e| {
                     ParserError::ParserError(format!("Could not parse '{w}' as i32: {e}"))
                 })?;
                 Ok(())
             }
-            Token::Word(w) => {
-                alias = Some(Ident::new(w.value));
-                Ok(())
-            }
-            _ => parser.expected("alias or file_col_num", next_token),
+            _ => parser.expected("file_col_num", col_num_token),
         }?;
+    }
 
-        if alias.is_some() {
-            parser.expect_token(&Token::Period)?;
-            // now we get col_num token
-            let col_num_token = parser.next_token();
-            match col_num_token.token {
-                Token::Placeholder(w) => {
-                    file_col_num = w.to_string().split_off(1).parse::<i32>().map_err(|e| {
-                        ParserError::ParserError(format!("Could not parse '{w}' as i32: {e}"))
-                    })?;
-                    Ok(())
-                }
-                _ => parser.expected("file_col_num", col_num_token),
-            }?;
-        }
-
-        // try extracting optional element
-        match parser.next_token().token {
-            Token::Colon => {
-                // parse element
-                element = Some(Ident::new(match parser.next_token().token {
-                    Token::Word(w) => Ok(w.value),
-                    _ => parser.expected("file_col_num", parser.peek_token()),
-                }?));
-            }
-            _ => {
-                // element not present move back
-                parser.prev_token();
-            }
+    // try extracting optional element
+    match parser.next_token().token {
+        Token::Colon => {
+            // parse element
+            element = Some(Ident::new(match parser.next_token().token {
+                Token::Word(w) => Ok(w.value),
+                _ => parser.expected("file_col_num", parser.peek_token()),
+            }?));
         }
-
-        // as
-        if parser.parse_keyword(Keyword::AS) {
-            item_as = Some(match parser.next_token().token {
-                Token::Word(w) => Ok(Ident::new(w.value)),
-                _ => parser.expected("column item alias", parser.peek_token()),
-            }?);
+        _ => {
+            // element not present move back
+            parser.prev_token();
         }
+    }
 
-        select_items.push(StageLoadSelectItem {
-            alias,
-            file_col_num,
-            element,
-            item_as,
-        });
-
-        match parser.next_token().token {
-            Token::Comma => {
-                // continue
-            }
-            _ => {
-                parser.prev_token(); // need to move back
-                break;
-            }
-        }
+    // as
+    if parser.parse_keyword(Keyword::AS) {
+        item_as = Some(match parser.next_token().token {
+            Token::Word(w) => Ok(Ident::new(w.value)),
+            _ => parser.expected("column item alias", parser.peek_token()),
+        }?);
     }
-    Ok(Some(select_items))
+
+    Ok(StageLoadSelectItem {
+        alias,
+        file_col_num,
+        element,
+        item_as,
+    })
 }
 
 fn parse_stage_params(parser: &mut Parser) -> Result<StageParamsObject, ParserError> {
     let (mut url, mut storage_integration, mut endpoint) = (None, None, None);
-    let mut encryption: DataLoadingOptions = DataLoadingOptions { options: vec![] };
-    let mut credentials: DataLoadingOptions = DataLoadingOptions { options: vec![] };
+    let mut encryption: KeyValueOptions = KeyValueOptions {
+        options: vec![],
+        delimiter: KeyValueOptionsDelimiter::Space,
+    };
+    let mut credentials: KeyValueOptions = KeyValueOptions {
+        options: vec![],
+        delimiter: KeyValueOptionsDelimiter::Space,
+    };
 
     // URL
     if parser.parse_keyword(Keyword::URL) {
@@ -735,16 +1338,18 @@ fn parse_stage_params(parser: &mut Parser) -> Result<StageParamsObject, ParserEr
     // CREDENTIALS
     if parser.parse_keyword(Keyword::CREDENTIALS) {
         parser.expect_token(&Token::Eq)?;
-        credentials = DataLoadingOptions {
-            options: parse_parentheses_options(parser)?,
+        credentials = KeyValueOptions {
+            options: parser.parse_key_value_options(true, &[])?,
+            delimiter: KeyValueOptionsDelimiter::Space,
         };
     }
 
     // ENCRYPTION
     if parser.parse_keyword(Keyword::ENCRYPTION) {
         parser.expect_token(&Token::Eq)?;
-        encryption = DataLoadingOptions {
-            options: parse_parentheses_options(parser)?,
+        encryption = KeyValueOptions {
+            options: parser.parse_key_value_options(true, &[])?,
+            delimiter: KeyValueOptionsDelimiter::Space,
         };
     }
 
@@ -757,61 +1362,49 @@ fn parse_stage_params(parser: &mut Parser) -> Result<StageParamsObject, ParserEr
     })
 }
 
-/// Parses options provided within parentheses like:
-/// ( ENABLE = { TRUE | FALSE }
-///      [ AUTO_REFRESH = { TRUE | FALSE } ]
-///      [ REFRESH_ON_CREATE =  { TRUE | FALSE } ]
-///      [ NOTIFICATION_INTEGRATION = '<notification_integration_name>' ] )
-///
-fn parse_parentheses_options(parser: &mut Parser) -> Result<Vec<DataLoadingOption>, ParserError> {
-    let mut options: Vec<DataLoadingOption> = Vec::new();
-
-    parser.expect_token(&Token::LParen)?;
+/// Parses options separated by blank spaces, commas, or new lines like:
+/// ABORT_DETACHED_QUERY = { TRUE | FALSE }
+///      [ ACTIVE_PYTHON_PROFILER = { 'LINE' | 'MEMORY' } ]
+///      [ BINARY_INPUT_FORMAT = '\<string\>' ]
+fn parse_session_options(
+    parser: &mut Parser,
+    set: bool,
+) -> Result<Vec<KeyValueOption>, ParserError> {
+    let mut options: Vec<KeyValueOption> = Vec::new();
+    let empty = String::new;
     loop {
-        match parser.next_token().token {
-            Token::RParen => break,
+        let next_token = parser.peek_token();
+        match next_token.token {
+            Token::SemiColon | Token::EOF => break,
+            Token::Comma => {
+                parser.advance_token();
+                continue;
+            }
             Token::Word(key) => {
-                parser.expect_token(&Token::Eq)?;
-                if parser.parse_keyword(Keyword::TRUE) {
-                    options.push(DataLoadingOption {
-                        option_name: key.value,
-                        option_type: DataLoadingOptionType::BOOLEAN,
-                        value: "TRUE".to_string(),
-                    });
-                    Ok(())
-                } else if parser.parse_keyword(Keyword::FALSE) {
-                    options.push(DataLoadingOption {
+                parser.advance_token();
+                if set {
+                    let option = parser.parse_key_value_option(key)?;
+                    options.push(option);
+                } else {
+                    options.push(KeyValueOption {
                         option_name: key.value,
-                        option_type: DataLoadingOptionType::BOOLEAN,
-                        value: "FALSE".to_string(),
+                        option_type: KeyValueOptionType::STRING,
+                        value: empty(),
                     });
-                    Ok(())
-                } else {
-                    match parser.next_token().token {
-                        Token::SingleQuotedString(value) => {
-                            options.push(DataLoadingOption {
-                                option_name: key.value,
-                                option_type: DataLoadingOptionType::STRING,
-                                value,
-                            });
-                            Ok(())
-                        }
-                        Token::Word(word) => {
-                            options.push(DataLoadingOption {
-                                option_name: key.value,
-                                option_type: DataLoadingOptionType::ENUM,
-                                value: word.value,
-                            });
-                            Ok(())
-                        }
-                        _ => parser.expected("expected option value", parser.peek_token()),
-                    }
                 }
             }
-            _ => parser.expected("another option or ')'", parser.peek_token()),
-        }?;
+            _ => {
+                return parser.expected("another option or end of statement", next_token);
+            }
+        }
+    }
+    if options.is_empty() {
+        Err(ParserError::ParserError(
+            "expected at least one option".to_string(),
+        ))
+    } else {
+        Ok(options)
     }
-    Ok(options)
 }
 
 /// Parsing a property of identity or autoincrement column option
@@ -832,7 +1425,7 @@ fn parse_identity_property(parser: &mut Parser) -> Result<IdentityProperty, Pars
         ))
     } else if parser.parse_keyword(Keyword::START) {
         let seed = parser.parse_number()?;
-        parser.expect_keyword(Keyword::INCREMENT)?;
+        parser.expect_keyword_is(Keyword::INCREMENT)?;
         let increment = parser.parse_number()?;
 
         Some(IdentityPropertyFormatKind::StartAndIncrement(
@@ -859,10 +1452,10 @@ fn parse_column_policy_property(
     parser: &mut Parser,
     with: bool,
 ) -> Result<ColumnPolicyProperty, ParserError> {
-    let policy_name = parser.parse_identifier(false)?;
+    let policy_name = parser.parse_object_name(false)?;
     let using_columns = if parser.parse_keyword(Keyword::USING) {
         parser.expect_token(&Token::LParen)?;
-        let columns = parser.parse_comma_separated(|p| p.parse_identifier(false))?;
+        let columns = parser.parse_comma_separated(|p| p.parse_identifier())?;
         parser.expect_token(&Token::RParen)?;
         Some(columns)
     } else {
@@ -889,3 +1482,13 @@ fn parse_column_tags(parser: &mut Parser, with: bool) -> Result<TagsColumnOption
 
     Ok(TagsColumnOption { with, tags })
 }
+
+/// Parse snowflake show objects.
+/// <https://docs.snowflake.com/en/sql-reference/sql/show-objects>
+fn parse_show_objects(terse: bool, parser: &mut Parser) -> Result<Statement, ParserError> {
+    let show_options = parser.parse_show_stmt_options()?;
+    Ok(Statement::ShowObjects(ShowObjects {
+        terse,
+        show_options,
+    }))
+}
diff --git a/src/dialect/sqlite.rs b/src/dialect/sqlite.rs
index 95717f9fd..64a8d532f 100644
--- a/src/dialect/sqlite.rs
+++ b/src/dialect/sqlite.rs
@@ -15,7 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use crate::ast::Statement;
+#[cfg(not(feature = "std"))]
+use alloc::boxed::Box;
+
+use crate::ast::BinaryOperator;
+use crate::ast::{Expr, Statement};
 use crate::dialect::Dialect;
 use crate::keywords::Keyword;
 use crate::parser::{Parser, ParserError};
@@ -70,6 +74,27 @@ impl Dialect for SQLiteDialect {
         }
     }
 
+    fn parse_infix(
+        &self,
+        parser: &mut crate::parser::Parser,
+        expr: &crate::ast::Expr,
+        _precedence: u8,
+    ) -> Option<Result<crate::ast::Expr, ParserError>> {
+        // Parse MATCH and REGEXP as operators
+        // See <https://www.sqlite.org/lang_expr.html#the_like_glob_regexp_match_and_extract_operators>
+        for (keyword, op) in [
+            (Keyword::REGEXP, BinaryOperator::Regexp),
+            (Keyword::MATCH, BinaryOperator::Match),
+        ] {
+            if parser.parse_keyword(keyword) {
+                let left = Box::new(expr.clone());
+                let right = Box::new(parser.parse_expr().unwrap());
+                return Some(Ok(Expr::BinaryOp { left, op, right }));
+            }
+        }
+        None
+    }
+
     fn supports_in_empty_list(&self) -> bool {
         true
     }
@@ -81,4 +106,14 @@ impl Dialect for SQLiteDialect {
     fn supports_asc_desc_in_column_definition(&self) -> bool {
         true
     }
+
+    fn supports_dollar_placeholder(&self) -> bool {
+        true
+    }
+
+    /// SQLite supports `NOTNULL` as aliases for `IS NOT NULL`
+    /// See: <https://sqlite.org/syntax/expr.html>
+    fn supports_notnull_operator(&self) -> bool {
+        true
+    }
 }
diff --git a/src/display_utils.rs b/src/display_utils.rs
new file mode 100644
index 000000000..ba36fccdd
--- /dev/null
+++ b/src/display_utils.rs
@@ -0,0 +1,135 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+//! Utilities for formatting SQL AST nodes with pretty printing support.
+//!
+//! The module provides formatters that implement the `Display` trait with support
+//! for both regular (`{}`) and pretty (`{:#}`) formatting modes. Pretty printing
+//! adds proper indentation and line breaks to make SQL statements more readable.
+
+use core::fmt::{self, Display, Write};
+
+/// A wrapper around a value that adds an indent to the value when displayed with {:#}.
+pub(crate) struct Indent<T>(pub T);
+
+const INDENT: &str = "  ";
+
+impl<T> Display for Indent<T>
+where
+    T: Display,
+{
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if f.alternate() {
+            f.write_str(INDENT)?;
+            write!(Indent(f), "{:#}", self.0)
+        } else {
+            self.0.fmt(f)
+        }
+    }
+}
+
+/// Adds an indent to the inner writer
+impl<T> Write for Indent<T>
+where
+    T: Write,
+{
+    fn write_str(&mut self, s: &str) -> fmt::Result {
+        self.0.write_str(s)?;
+        // Our NewLine and SpaceOrNewline utils always print individual newlines as a single-character string.
+        if s == "\n" {
+            self.0.write_str(INDENT)?;
+        }
+        Ok(())
+    }
+}
+
+/// A value that inserts a newline when displayed with {:#}, but not when displayed with {}.
+pub(crate) struct NewLine;
+
+impl Display for NewLine {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if f.alternate() {
+            f.write_char('\n')
+        } else {
+            Ok(())
+        }
+    }
+}
+
+/// A value that inserts a space when displayed with {}, but a newline when displayed with {:#}.
+pub(crate) struct SpaceOrNewline;
+
+impl Display for SpaceOrNewline {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        if f.alternate() {
+            f.write_char('\n')
+        } else {
+            f.write_char(' ')
+        }
+    }
+}
+
+/// A value that displays a comma-separated list of values.
+/// When pretty-printed (using {:#}), it displays each value on a new line.
+pub(crate) struct DisplayCommaSeparated<'a, T: fmt::Display>(pub(crate) &'a [T]);
+
+impl<T: fmt::Display> fmt::Display for DisplayCommaSeparated<'_, T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let mut first = true;
+        for t in self.0 {
+            if !first {
+                f.write_char(',')?;
+                SpaceOrNewline.fmt(f)?;
+            }
+            first = false;
+            t.fmt(f)?;
+        }
+        Ok(())
+    }
+}
+
+/// Displays a whitespace, followed by a comma-separated list that is indented when pretty-printed.
+pub(crate) fn indented_list<T: fmt::Display>(f: &mut fmt::Formatter, items: &[T]) -> fmt::Result {
+    SpaceOrNewline.fmt(f)?;
+    Indent(DisplayCommaSeparated(items)).fmt(f)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_indent() {
+        struct TwoLines;
+
+        impl Display for TwoLines {
+            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+                f.write_str("line 1")?;
+                SpaceOrNewline.fmt(f)?;
+                f.write_str("line 2")
+            }
+        }
+
+        let indent = Indent(TwoLines);
+        assert_eq!(
+            indent.to_string(),
+            TwoLines.to_string(),
+            "Only the alternate form should be indented"
+        );
+        assert_eq!(format!("{:#}", indent), "  line 1\n  line 2");
+    }
+}
diff --git a/src/keywords.rs b/src/keywords.rs
index fc2a2927c..a729a525f 100644
--- a/src/keywords.rs
+++ b/src/keywords.rs
@@ -18,14 +18,14 @@
 //! This module defines
 //! 1) a list of constants for every keyword
 //! 2) an `ALL_KEYWORDS` array with every keyword in it
-//!     This is not a list of *reserved* keywords: some of these can be
-//!     parsed as identifiers if the parser decides so. This means that
-//!     new keywords can be added here without affecting the parse result.
+//!    This is not a list of *reserved* keywords: some of these can be
+//!    parsed as identifiers if the parser decides so. This means that
+//!    new keywords can be added here without affecting the parse result.
 //!
-//!     As a matter of fact, most of these keywords are not used at all
-//!     and could be removed.
+//!    As a matter of fact, most of these keywords are not used at all
+//!    and could be removed.
 //! 3) a `RESERVED_FOR_TABLE_ALIAS` array with keywords reserved in a
-//!     "table alias" context.
+//!    "table alias" context.
 
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
@@ -83,7 +83,10 @@ define_keywords!(
     ADMIN,
     AFTER,
     AGAINST,
+    AGGREGATE,
     AGGREGATION,
+    ALERT,
+    ALGORITHM,
     ALIAS,
     ALL,
     ALLOCATE,
@@ -95,6 +98,7 @@ define_keywords!(
     ANY,
     APPLICATION,
     APPLY,
+    APPLYBUDGET,
     ARCHIVE,
     ARE,
     ARRAY,
@@ -108,31 +112,44 @@ define_keywords!(
     AT,
     ATOMIC,
     ATTACH,
+    AUDIT,
+    AUTHENTICATION,
     AUTHORIZATION,
     AUTO,
+    AUTOEXTEND_SIZE,
     AUTOINCREMENT,
     AUTO_INCREMENT,
     AVG,
+    AVG_ROW_LENGTH,
     AVRO,
     BACKWARD,
     BASE64,
+    BASE_LOCATION,
     BEFORE,
     BEGIN,
     BEGIN_FRAME,
     BEGIN_PARTITION,
+    BERNOULLI,
     BETWEEN,
     BIGDECIMAL,
     BIGINT,
     BIGNUMERIC,
     BINARY,
+    BIND,
     BINDING,
+    BIT,
     BLOB,
+    BLOCK,
+    BLOOM,
     BLOOMFILTER,
     BOOL,
     BOOLEAN,
     BOTH,
+    BOX,
+    BRIN,
     BROWSE,
     BTREE,
+    BUCKET,
     BUCKETS,
     BY,
     BYPASSRLS,
@@ -145,8 +162,13 @@ define_keywords!(
     CASCADE,
     CASCADED,
     CASE,
+    CASES,
     CAST,
     CATALOG,
+    CATALOG_SYNC,
+    CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER,
+    CATALOG_SYNC_NAMESPACE_MODE,
+    CATCH,
     CEIL,
     CEILING,
     CENTURY,
@@ -156,17 +178,21 @@ define_keywords!(
     CHANNEL,
     CHAR,
     CHARACTER,
+    CHARACTERISTICS,
     CHARACTERS,
     CHARACTER_LENGTH,
     CHARSET,
     CHAR_LENGTH,
     CHECK,
+    CHECKSUM,
+    CIRCLE,
     CLEAR,
     CLOB,
     CLONE,
     CLOSE,
     CLUSTER,
     CLUSTERED,
+    CLUSTERING,
     COALESCE,
     COLLATE,
     COLLATION,
@@ -178,6 +204,7 @@ define_keywords!(
     COMMENT,
     COMMIT,
     COMMITTED,
+    COMPATIBLE,
     COMPRESSION,
     COMPUTE,
     CONCURRENTLY,
@@ -185,7 +212,10 @@ define_keywords!(
     CONFLICT,
     CONNECT,
     CONNECTION,
+    CONNECTOR,
+    CONNECT_BY_ROOT,
     CONSTRAINT,
+    CONTACT,
     CONTAINS,
     CONTINUE,
     CONVERT,
@@ -229,6 +259,8 @@ define_keywords!(
     DAY,
     DAYOFWEEK,
     DAYOFYEAR,
+    DAYS,
+    DCPROPERTIES,
     DEALLOCATE,
     DEC,
     DECADE,
@@ -241,12 +273,15 @@ define_keywords!(
     DEFERRED,
     DEFINE,
     DEFINED,
+    DEFINER,
     DELAYED,
+    DELAY_KEY_WRITE,
     DELETE,
     DELIMITED,
     DELIMITER,
     DELTA,
     DENSE_RANK,
+    DENY,
     DEREF,
     DESC,
     DESCRIBE,
@@ -261,6 +296,7 @@ define_keywords!(
     DISTRIBUTE,
     DIV,
     DO,
+    DOMAIN,
     DOUBLE,
     DOW,
     DOY,
@@ -272,6 +308,7 @@ define_keywords!(
     ELEMENT,
     ELEMENTS,
     ELSE,
+    ELSEIF,
     EMPTY,
     ENABLE,
     ENABLE_SCHEMA_EVOLUTION,
@@ -284,32 +321,42 @@ define_keywords!(
     END_PARTITION,
     ENFORCED,
     ENGINE,
+    ENGINE_ATTRIBUTE,
     ENUM,
+    ENUM16,
+    ENUM8,
     EPHEMERAL,
     EPOCH,
     EQUALS,
     ERROR,
     ESCAPE,
     ESCAPED,
+    ESTIMATE,
     EVENT,
     EVERY,
+    EVOLVE,
     EXCEPT,
     EXCEPTION,
+    EXCHANGE,
     EXCLUDE,
     EXCLUSIVE,
     EXEC,
     EXECUTE,
+    EXECUTION,
     EXISTS,
     EXP,
     EXPANSION,
     EXPLAIN,
     EXPLICIT,
     EXPORT,
+    EXTEND,
     EXTENDED,
     EXTENSION,
     EXTERNAL,
+    EXTERNAL_VOLUME,
     EXTRACT,
     FAIL,
+    FAILOVER,
     FALSE,
     FETCH,
     FIELDS,
@@ -322,6 +369,7 @@ define_keywords!(
     FIRST,
     FIRST_VALUE,
     FIXEDSTRING,
+    FLATTEN,
     FLOAT,
     FLOAT32,
     FLOAT4,
@@ -329,6 +377,7 @@ define_keywords!(
     FLOAT8,
     FLOOR,
     FLUSH,
+    FN,
     FOLLOWING,
     FOR,
     FORCE,
@@ -344,16 +393,20 @@ define_keywords!(
     FREEZE,
     FROM,
     FSCK,
+    FULFILLMENT,
     FULL,
     FULLTEXT,
     FUNCTION,
     FUNCTIONS,
     FUSION,
+    FUTURE,
     GENERAL,
     GENERATE,
     GENERATED,
     GEOGRAPHY,
     GET,
+    GIN,
+    GIST,
     GLOBAL,
     GRANT,
     GRANTED,
@@ -373,13 +426,18 @@ define_keywords!(
     HOSTS,
     HOUR,
     HOURS,
+    HUGEINT,
+    ICEBERG,
     ID,
     IDENTITY,
+    IDENTITY_INSERT,
     IF,
     IGNORE,
     ILIKE,
     IMMEDIATE,
     IMMUTABLE,
+    IMPORT,
+    IMPORTED,
     IN,
     INCLUDE,
     INCLUDE_NULL_VALUES,
@@ -387,15 +445,19 @@ define_keywords!(
     INDEX,
     INDICATOR,
     INHERIT,
+    INHERITS,
     INITIALLY,
     INNER,
     INOUT,
     INPATH,
+    INPLACE,
     INPUT,
     INPUTFORMAT,
     INSENSITIVE,
     INSERT,
+    INSERT_METHOD,
     INSTALL,
+    INSTANT,
     INSTEAD,
     INT,
     INT128,
@@ -407,11 +469,14 @@ define_keywords!(
     INT64,
     INT8,
     INTEGER,
+    INTEGRATION,
     INTERPOLATE,
     INTERSECT,
     INTERSECTION,
     INTERVAL,
     INTO,
+    INVOKER,
+    IO,
     IS,
     ISODOW,
     ISOLATION,
@@ -427,6 +492,7 @@ define_keywords!(
     JULIAN,
     KEY,
     KEYS,
+    KEY_BLOCK_SIZE,
     KILL,
     LAG,
     LANGUAGE,
@@ -441,8 +507,11 @@ define_keywords!(
     LIKE,
     LIKE_REGEX,
     LIMIT,
+    LINE,
     LINES,
+    LIST,
     LISTEN,
+    LISTING,
     LN,
     LOAD,
     LOCAL,
@@ -451,12 +520,19 @@ define_keywords!(
     LOCATION,
     LOCK,
     LOCKED,
+    LOG,
     LOGIN,
     LOGS,
+    LONGBLOB,
+    LONGTEXT,
     LOWCARDINALITY,
     LOWER,
     LOW_PRIORITY,
+    LS,
+    LSEG,
     MACRO,
+    MANAGE,
+    MANAGED,
     MANAGEDLOCATION,
     MAP,
     MASKING,
@@ -470,12 +546,17 @@ define_keywords!(
     MAX,
     MAXVALUE,
     MAX_DATA_EXTENSION_TIME_IN_DAYS,
+    MAX_ROWS,
     MEASURES,
+    MEDIUMBLOB,
     MEDIUMINT,
+    MEDIUMTEXT,
     MEMBER,
     MERGE,
+    MESSAGE,
     METADATA,
     METHOD,
+    METRIC,
     MICROSECOND,
     MICROSECONDS,
     MILLENIUM,
@@ -483,27 +564,39 @@ define_keywords!(
     MILLISECOND,
     MILLISECONDS,
     MIN,
+    MINUS,
     MINUTE,
+    MINUTES,
     MINVALUE,
+    MIN_ROWS,
     MOD,
     MODE,
     MODIFIES,
     MODIFY,
     MODULE,
+    MONITOR,
     MONTH,
+    MONTHS,
     MSCK,
     MULTISET,
     MUTATION,
     NAME,
+    NAMES,
     NANOSECOND,
     NANOSECONDS,
     NATIONAL,
     NATURAL,
     NCHAR,
     NCLOB,
+    NEST,
     NESTED,
+    NETWORK,
     NEW,
     NEXT,
+    NFC,
+    NFD,
+    NFKC,
+    NFKD,
     NO,
     NOBYPASSRLS,
     NOCREATEDB,
@@ -514,11 +607,13 @@ define_keywords!(
     NOORDER,
     NOREPLICATION,
     NORMALIZE,
+    NORMALIZED,
     NOSCAN,
     NOSUPERUSER,
     NOT,
     NOTHING,
     NOTIFY,
+    NOTNULL,
     NOWAIT,
     NO_WRITE_TO_BINLOG,
     NTH_VALUE,
@@ -530,11 +625,14 @@ define_keywords!(
     NUMERIC,
     NVARCHAR,
     OBJECT,
+    OBJECTS,
     OCCURRENCES_REGEX,
     OCTETS,
     OCTET_LENGTH,
     OF,
+    OFF,
     OFFSET,
+    OFFSETS,
     OLD,
     OMIT,
     ON,
@@ -542,8 +640,11 @@ define_keywords!(
     ONLY,
     OPEN,
     OPENJSON,
+    OPERATE,
     OPERATOR,
+    OPTIMIZATION,
     OPTIMIZE,
+    OPTIMIZED,
     OPTIMIZER_COSTS,
     OPTION,
     OPTIONS,
@@ -551,16 +652,24 @@ define_keywords!(
     ORC,
     ORDER,
     ORDINALITY,
+    ORGANIZATION,
+    OTHER,
     OUT,
     OUTER,
+    OUTPUT,
     OUTPUTFORMAT,
     OVER,
     OVERFLOW,
     OVERLAPS,
     OVERLAY,
+    OVERRIDE,
     OVERWRITE,
     OWNED,
     OWNER,
+    OWNERSHIP,
+    PACKAGE,
+    PACKAGES,
+    PACK_KEYS,
     PARALLEL,
     PARAMETER,
     PARQUET,
@@ -568,6 +677,7 @@ define_keywords!(
     PARTITION,
     PARTITIONED,
     PARTITIONS,
+    PASSING,
     PASSWORD,
     PAST,
     PATH,
@@ -584,7 +694,10 @@ define_keywords!(
     PLACING,
     PLAN,
     PLANS,
+    POINT,
     POLICY,
+    POLYGON,
+    POOL,
     PORTION,
     POSITION,
     POSITION_REGEX,
@@ -597,16 +710,22 @@ define_keywords!(
     PRESERVE,
     PREWHERE,
     PRIMARY,
+    PRINT,
     PRIOR,
     PRIVILEGES,
     PROCEDURE,
+    PROFILE,
     PROGRAM,
     PROJECTION,
+    PUBLIC,
+    PURCHASE,
     PURGE,
     QUALIFY,
     QUARTER,
     QUERY,
     QUOTE,
+    RAISE,
+    RAISERROR,
     RANGE,
     RANK,
     RAW,
@@ -615,6 +734,7 @@ define_keywords!(
     READS,
     READ_ONLY,
     REAL,
+    RECLUSTER,
     RECURSIVE,
     REF,
     REFERENCES,
@@ -633,22 +753,30 @@ define_keywords!(
     RELATIVE,
     RELAY,
     RELEASE,
+    RELEASES,
     REMOTE,
+    REMOVE,
     RENAME,
     REORG,
     REPAIR,
     REPEATABLE,
     REPLACE,
+    REPLACE_INVALID_CHARACTERS,
     REPLICA,
+    REPLICATE,
     REPLICATION,
     RESET,
+    RESOLVE,
+    RESOURCE,
     RESPECT,
     RESTART,
     RESTRICT,
     RESTRICTED,
+    RESTRICTIONS,
     RESTRICTIVE,
     RESULT,
     RESULTSET,
+    RESUME,
     RETAIN,
     RETURN,
     RETURNING,
@@ -656,18 +784,22 @@ define_keywords!(
     REVOKE,
     RIGHT,
     RLIKE,
+    RM,
     ROLE,
+    ROLES,
     ROLLBACK,
     ROLLUP,
     ROOT,
     ROW,
     ROWID,
     ROWS,
+    ROW_FORMAT,
     ROW_NUMBER,
     RULE,
     RUN,
     SAFE,
     SAFE_CAST,
+    SAMPLE,
     SAVEPOINT,
     SCHEMA,
     SCHEMAS,
@@ -675,8 +807,12 @@ define_keywords!(
     SCROLL,
     SEARCH,
     SECOND,
+    SECONDARY,
+    SECONDARY_ENGINE_ATTRIBUTE,
+    SECONDS,
     SECRET,
     SECURITY,
+    SEED,
     SELECT,
     SEMI,
     SENSITIVE,
@@ -687,13 +823,19 @@ define_keywords!(
     SERDE,
     SERDEPROPERTIES,
     SERIALIZABLE,
+    SERVER,
+    SERVICE,
     SESSION,
     SESSION_USER,
     SET,
+    SETERROR,
     SETS,
     SETTINGS,
     SHARE,
+    SHARED,
+    SHARING,
     SHOW,
+    SIGNED,
     SIMILAR,
     SKIP,
     SLOW,
@@ -706,11 +848,13 @@ define_keywords!(
     SPATIAL,
     SPECIFIC,
     SPECIFICTYPE,
+    SPGIST,
     SQL,
     SQLEXCEPTION,
     SQLSTATE,
     SQLWARNING,
     SQRT,
+    SRID,
     STABLE,
     STAGE,
     START,
@@ -718,24 +862,34 @@ define_keywords!(
     STATEMENT,
     STATIC,
     STATISTICS,
+    STATS_AUTO_RECALC,
+    STATS_PERSISTENT,
+    STATS_SAMPLE_PAGES,
     STATUS,
     STDDEV_POP,
     STDDEV_SAMP,
     STDIN,
     STDOUT,
     STEP,
+    STORAGE,
     STORAGE_INTEGRATION,
+    STORAGE_SERIALIZATION_POLICY,
     STORED,
+    STRAIGHT_JOIN,
+    STREAM,
     STRICT,
     STRING,
     STRUCT,
     SUBMULTISET,
+    SUBSTR,
     SUBSTRING,
     SUBSTRING_REGEX,
     SUCCEEDS,
     SUM,
     SUPER,
     SUPERUSER,
+    SUPPORT,
+    SUSPEND,
     SWAP,
     SYMMETRIC,
     SYNC,
@@ -745,11 +899,14 @@ define_keywords!(
     TABLE,
     TABLES,
     TABLESAMPLE,
+    TABLESPACE,
     TAG,
     TARGET,
+    TASK,
     TBLPROPERTIES,
     TEMP,
     TEMPORARY,
+    TEMPTABLE,
     TERMINATED,
     TERSE,
     TEXT,
@@ -759,16 +916,20 @@ define_keywords!(
     TIME,
     TIMESTAMP,
     TIMESTAMPTZ,
+    TIMESTAMP_NTZ,
     TIMETZ,
     TIMEZONE,
     TIMEZONE_ABBR,
     TIMEZONE_HOUR,
     TIMEZONE_MINUTE,
     TIMEZONE_REGION,
+    TINYBLOB,
     TINYINT,
+    TINYTEXT,
     TO,
     TOP,
     TOTALS,
+    TRACE,
     TRAILING,
     TRANSACTION,
     TRANSIENT,
@@ -781,11 +942,16 @@ define_keywords!(
     TRIM_ARRAY,
     TRUE,
     TRUNCATE,
+    TRY,
     TRY_CAST,
     TRY_CONVERT,
+    TSQUERY,
+    TSVECTOR,
     TUPLE,
     TYPE,
+    UBIGINT,
     UESCAPE,
+    UHUGEINT,
     UINT128,
     UINT16,
     UINT256,
@@ -795,6 +961,7 @@ define_keywords!(
     UNBOUNDED,
     UNCACHE,
     UNCOMMITTED,
+    UNDEFINED,
     UNFREEZE,
     UNION,
     UNIQUE,
@@ -807,6 +974,7 @@ define_keywords!(
     UNNEST,
     UNPIVOT,
     UNSAFE,
+    UNSET,
     UNSIGNED,
     UNTIL,
     UPDATE,
@@ -817,14 +985,18 @@ define_keywords!(
     USER,
     USER_RESOURCES,
     USING,
+    USMALLINT,
+    UTINYINT,
     UUID,
     VACUUM,
     VALID,
+    VALIDATE,
     VALIDATION_MODE,
     VALUE,
     VALUES,
     VALUE_OF,
     VARBINARY,
+    VARBIT,
     VARCHAR,
     VARIABLES,
     VARYING,
@@ -833,15 +1005,20 @@ define_keywords!(
     VERBOSE,
     VERSION,
     VERSIONING,
+    VERSIONS,
     VIEW,
     VIEWS,
     VIRTUAL,
     VOLATILE,
+    VOLUME,
     WAREHOUSE,
+    WAREHOUSES,
     WEEK,
+    WEEKS,
     WHEN,
     WHENEVER,
     WHERE,
+    WHILE,
     WIDTH_BUCKET,
     WINDOW,
     WITH,
@@ -849,10 +1026,14 @@ define_keywords!(
     WITHOUT,
     WITHOUT_ARRAY_WRAPPER,
     WORK,
+    WRAPPER,
     WRITE,
     XML,
+    XMLNAMESPACES,
+    XMLTABLE,
     XOR,
     YEAR,
+    YEARS,
     ZONE,
     ZORDER
 );
@@ -881,6 +1062,7 @@ pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
     Keyword::UNION,
     Keyword::EXCEPT,
     Keyword::INTERSECT,
+    Keyword::MINUS,
     // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
     Keyword::ON,
     Keyword::JOIN,
@@ -896,6 +1078,9 @@ pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
     Keyword::GLOBAL,
     Keyword::ANTI,
     Keyword::SEMI,
+    Keyword::RETURNING,
+    Keyword::ASOF,
+    Keyword::MATCH_CONDITION,
     // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
     Keyword::OUTER,
     Keyword::SET,
@@ -907,15 +1092,18 @@ pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
     Keyword::PARTITION,
     // for Clickhouse PREWHERE
     Keyword::PREWHERE,
-    // for ClickHouse SELECT * FROM t SETTINGS ...
     Keyword::SETTINGS,
-    // for ClickHouse SELECT * FROM t FORMAT...
     Keyword::FORMAT,
     // for Snowflake START WITH .. CONNECT BY
     Keyword::START,
     Keyword::CONNECT,
     // Reserved for snowflake MATCH_RECOGNIZE
     Keyword::MATCH_RECOGNIZE,
+    // Reserved for Snowflake table sample
+    Keyword::SAMPLE,
+    Keyword::TABLESAMPLE,
+    Keyword::FROM,
+    Keyword::OPEN,
 ];
 
 /// Can't be used as a column alias, so that `SELECT <expr> alias`
@@ -939,7 +1127,9 @@ pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
     Keyword::FETCH,
     Keyword::UNION,
     Keyword::EXCEPT,
+    Keyword::EXCLUDE,
     Keyword::INTERSECT,
+    Keyword::MINUS,
     Keyword::CLUSTER,
     Keyword::DISTRIBUTE,
     Keyword::RETURNING,
@@ -948,3 +1138,23 @@ pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
     Keyword::INTO,
     Keyword::END,
 ];
+
+// Global list of reserved keywords allowed after FROM.
+// Parser should call Dialect::get_reserved_keyword_after_from
+// to allow for each dialect to customize the list.
+pub const RESERVED_FOR_TABLE_FACTOR: &[Keyword] = &[
+    Keyword::INTO,
+    Keyword::LIMIT,
+    Keyword::HAVING,
+    Keyword::WHERE,
+];
+
+/// Global list of reserved keywords that cannot be parsed as identifiers
+/// without special handling like quoting. Parser should call `Dialect::is_reserved_for_identifier`
+/// to allow for each dialect to customize the list.
+pub const RESERVED_FOR_IDENTIFIER: &[Keyword] = &[
+    Keyword::EXISTS,
+    Keyword::INTERVAL,
+    Keyword::STRUCT,
+    Keyword::TRIM,
+];
diff --git a/src/lib.rs b/src/lib.rs
index 6c8987b63..dbfd1791a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -25,6 +25,9 @@
 //! 1. [`Parser::parse_sql`] and [`Parser::new`] for the Parsing API
 //! 2. [`ast`] for the AST structure
 //! 3. [`Dialect`] for supported SQL dialects
+//! 4. [`Spanned`] for source text locations (see "Source Spans" below for details)
+//!
+//! [`Spanned`]: ast::Spanned
 //!
 //! # Example parsing SQL text
 //!
@@ -62,15 +65,94 @@
 //! assert_eq!(ast[0].to_string(), sql);
 //! ```
 //!
+//! # Pretty Printing
+//!
+//! SQL statements can be pretty-printed with proper indentation and line breaks using the alternate flag (`{:#}`):
+//!
+//! ```
+//! # use sqlparser::dialect::GenericDialect;
+//! # use sqlparser::parser::Parser;
+//! let sql = "SELECT a, b FROM table_1";
+//! let ast = Parser::parse_sql(&GenericDialect, sql).unwrap();
+//!
+//! // Pretty print with indentation and line breaks
+//! let pretty_sql = format!("{:#}", ast[0]);
+//! assert_eq!(pretty_sql, r#"
+//! SELECT
+//!   a,
+//!   b
+//! FROM
+//!   table_1
+//! "#.trim());
+//! ```
 //! [sqlparser crates.io page]: https://crates.io/crates/sqlparser
 //! [`Parser::parse_sql`]: crate::parser::Parser::parse_sql
 //! [`Parser::new`]: crate::parser::Parser::new
 //! [`AST`]: crate::ast
 //! [`ast`]: crate::ast
 //! [`Dialect`]: crate::dialect::Dialect
+//!
+//! # Source Spans
+//!
+//! Starting with version  `0.53.0` sqlparser introduced source spans to the
+//! AST. This feature provides source information for syntax errors, enabling
+//! better error messages. See [issue #1548] for more information and the
+//! [`Spanned`] trait to access the spans.
+//!
+//! [issue #1548]: https://github.com/apache/datafusion-sqlparser-rs/issues/1548
+//! [`Spanned`]: ast::Spanned
+//!
+//! ## Migration Guide
+//!
+//! For the next few releases, we will be incrementally adding source spans to the
+//! AST nodes, trying to minimize the impact on existing users. Some breaking
+//! changes are inevitable, and the following is a summary of the changes:
+//!
+//! #### New fields for spans (must be added to any existing pattern matches)
+//!
+//! The primary change is that new fields will be added to AST nodes to store the source `Span` or `TokenWithLocation`.
+//!
+//! This will require
+//! 1. Adding new fields to existing pattern matches.
+//! 2. Filling in the proper span information when constructing AST nodes.
+//!
+//! For example, since `Ident` now stores a `Span`, to construct an `Ident` you
+//! must provide now provide one:
+//!
+//! Previously:
+//! ```text
+//! # use sqlparser::ast::Ident;
+//! Ident {
+//!     value: "name".into(),
+//!     quote_style: None,
+//! }
+//! ```
+//! Now
+//! ```rust
+//! # use sqlparser::ast::Ident;
+//! # use sqlparser::tokenizer::Span;
+//! Ident {
+//!     value: "name".into(),
+//!     quote_style: None,
+//!     span: Span::empty(),
+//! };
+//! ```
+//!
+//! Similarly, when pattern matching on `Ident`, you must now account for the
+//! `span` field.
+//!
+//! #### Misc.
+//! - [`TokenWithLocation`] stores a full `Span`, rather than just a source location.
+//!   Users relying on `token.location` should use `token.location.start` instead.
+//!
+//![`TokenWithLocation`]: tokenizer::TokenWithLocation
 
 #![cfg_attr(not(feature = "std"), no_std)]
 #![allow(clippy::upper_case_acronyms)]
+// Permit large enum variants to keep a unified, expressive AST.
+// Splitting complex nodes (expressions, statements, types) into separate types
+// would bloat the API and hide intent. Extra memory is a worthwhile tradeoff.
+#![allow(clippy::large_enum_variant)]
 
 // Allow proc-macros to find this crate
 extern crate self as sqlparser;
@@ -85,6 +167,7 @@ extern crate pretty_assertions;
 pub mod ast;
 #[macro_use]
 pub mod dialect;
+mod display_utils;
 pub mod keywords;
 pub mod parser;
 pub mod tokenizer;
diff --git a/src/parser/alter.rs b/src/parser/alter.rs
index 534105790..bff462ee0 100644
--- a/src/parser/alter.rs
+++ b/src/parser/alter.rs
@@ -18,15 +18,15 @@ use alloc::vec;
 use super::{Parser, ParserError};
 use crate::{
     ast::{
-        AlterPolicyOperation, AlterRoleOperation, Expr, Password, ResetConfig, RoleOption,
-        SetConfigValue, Statement,
+        AlterConnectorOwner, AlterPolicyOperation, AlterRoleOperation, Expr, Password, ResetConfig,
+        RoleOption, SetConfigValue, Statement,
     },
     dialect::{MsSqlDialect, PostgreSqlDialect},
     keywords::Keyword,
     tokenizer::Token,
 };
 
-impl<'a> Parser<'a> {
+impl Parser<'_> {
     pub fn parse_alter_role(&mut self) -> Result<Statement, ParserError> {
         if dialect_of!(self is PostgreSqlDialect) {
             return self.parse_pg_alter_role();
@@ -51,13 +51,13 @@ impl<'a> Parser<'a> {
     ///
     /// [PostgreSQL](https://www.postgresql.org/docs/current/sql-alterpolicy.html)
     pub fn parse_alter_policy(&mut self) -> Result<Statement, ParserError> {
-        let name = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::ON)?;
+        let name = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::ON)?;
         let table_name = self.parse_object_name(false)?;
 
         if self.parse_keyword(Keyword::RENAME) {
-            self.expect_keyword(Keyword::TO)?;
-            let new_name = self.parse_identifier(false)?;
+            self.expect_keyword_is(Keyword::TO)?;
+            let new_name = self.parse_identifier()?;
             Ok(Statement::AlterPolicy {
                 name,
                 table_name,
@@ -99,18 +99,59 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse an `ALTER CONNECTOR` statement
+    /// ```sql
+    /// ALTER CONNECTOR connector_name SET DCPROPERTIES(property_name=property_value, ...);
+    ///
+    /// ALTER CONNECTOR connector_name SET URL new_url;
+    ///
+    /// ALTER CONNECTOR connector_name SET OWNER [USER|ROLE] user_or_role;
+    /// ```
+    pub fn parse_alter_connector(&mut self) -> Result<Statement, ParserError> {
+        let name = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::SET)?;
+
+        let properties = match self.parse_options_with_keywords(&[Keyword::DCPROPERTIES])? {
+            properties if !properties.is_empty() => Some(properties),
+            _ => None,
+        };
+
+        let url = if self.parse_keyword(Keyword::URL) {
+            Some(self.parse_literal_string()?)
+        } else {
+            None
+        };
+
+        let owner = if self.parse_keywords(&[Keyword::OWNER, Keyword::USER]) {
+            let owner = self.parse_identifier()?;
+            Some(AlterConnectorOwner::User(owner))
+        } else if self.parse_keywords(&[Keyword::OWNER, Keyword::ROLE]) {
+            let owner = self.parse_identifier()?;
+            Some(AlterConnectorOwner::Role(owner))
+        } else {
+            None
+        };
+
+        Ok(Statement::AlterConnector {
+            name,
+            properties,
+            url,
+            owner,
+        })
+    }
+
     fn parse_mssql_alter_role(&mut self) -> Result<Statement, ParserError> {
-        let role_name = self.parse_identifier(false)?;
+        let role_name = self.parse_identifier()?;
 
         let operation = if self.parse_keywords(&[Keyword::ADD, Keyword::MEMBER]) {
-            let member_name = self.parse_identifier(false)?;
+            let member_name = self.parse_identifier()?;
             AlterRoleOperation::AddMember { member_name }
         } else if self.parse_keywords(&[Keyword::DROP, Keyword::MEMBER]) {
-            let member_name = self.parse_identifier(false)?;
+            let member_name = self.parse_identifier()?;
             AlterRoleOperation::DropMember { member_name }
         } else if self.parse_keywords(&[Keyword::WITH, Keyword::NAME]) {
             if self.consume_token(&Token::Eq) {
-                let role_name = self.parse_identifier(false)?;
+                let role_name = self.parse_identifier()?;
                 AlterRoleOperation::RenameRole { role_name }
             } else {
                 return self.expected("= after WITH NAME ", self.peek_token());
@@ -126,7 +167,7 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_pg_alter_role(&mut self) -> Result<Statement, ParserError> {
-        let role_name = self.parse_identifier(false)?;
+        let role_name = self.parse_identifier()?;
 
         // [ IN DATABASE _`database_name`_ ]
         let in_database = if self.parse_keywords(&[Keyword::IN, Keyword::DATABASE]) {
@@ -137,7 +178,7 @@ impl<'a> Parser<'a> {
 
         let operation = if self.parse_keyword(Keyword::RENAME) {
             if self.parse_keyword(Keyword::TO) {
-                let role_name = self.parse_identifier(false)?;
+                let role_name = self.parse_identifier()?;
                 AlterRoleOperation::RenameRole { role_name }
             } else {
                 return self.expected("TO after RENAME", self.peek_token());
@@ -232,7 +273,7 @@ impl<'a> Parser<'a> {
             Some(Keyword::BYPASSRLS) => RoleOption::BypassRLS(true),
             Some(Keyword::NOBYPASSRLS) => RoleOption::BypassRLS(false),
             Some(Keyword::CONNECTION) => {
-                self.expect_keyword(Keyword::LIMIT)?;
+                self.expect_keyword_is(Keyword::LIMIT)?;
                 RoleOption::ConnectionLimit(Expr::Value(self.parse_number_value()?))
             }
             Some(Keyword::CREATEDB) => RoleOption::CreateDB(true),
@@ -256,7 +297,7 @@ impl<'a> Parser<'a> {
             Some(Keyword::SUPERUSER) => RoleOption::SuperUser(true),
             Some(Keyword::NOSUPERUSER) => RoleOption::SuperUser(false),
             Some(Keyword::VALID) => {
-                self.expect_keyword(Keyword::UNTIL)?;
+                self.expect_keyword_is(Keyword::UNTIL)?;
                 RoleOption::ValidUntil(Expr::Value(self.parse_value()?))
             }
             _ => self.expected("option", self.peek_token())?,
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 35c763e93..d9fe7999e 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -24,6 +24,7 @@ use core::{
     fmt::{self, Display},
     str::FromStr,
 };
+use helpers::attached_token::AttachedToken;
 
 use log::debug;
 
@@ -31,12 +32,18 @@ use recursion::RecursionCounter;
 use IsLateral::*;
 use IsOptional::*;
 
-use crate::ast::helpers::stmt_create_table::{CreateTableBuilder, CreateTableConfiguration};
+use crate::ast::helpers::{
+    key_value_options::{
+        KeyValueOption, KeyValueOptionType, KeyValueOptions, KeyValueOptionsDelimiter,
+    },
+    stmt_create_table::{CreateTableBuilder, CreateTableConfiguration},
+};
 use crate::ast::Statement::CreatePolicy;
 use crate::ast::*;
 use crate::dialect::*;
 use crate::keywords::{Keyword, ALL_KEYWORDS};
 use crate::tokenizer::*;
+use sqlparser::parser::ParserState::ColumnDefinition;
 
 mod alter;
 
@@ -47,9 +54,6 @@ pub enum ParserError {
     RecursionLimitExceeded,
 }
 
-// avoid clippy type_complexity warnings
-type ParsedAction = (Keyword, Option<Vec<Ident>>);
-
 // Use `Parser::expected` instead, if possible
 macro_rules! parser_err {
     ($MSG:expr, $loc:expr) => {
@@ -72,6 +76,9 @@ mod recursion {
     /// Note: Uses an [`std::rc::Rc`] and [`std::cell::Cell`] in order to satisfy the Rust
     /// borrow checker so the automatic [`DepthGuard`] decrement a
     /// reference to the counter.
+    ///
+    /// Note: when "recursive-protection" feature is enabled, this crate uses additional stack overflow protection
+    /// for some of its recursive methods. See [`recursive::recursive`] for more information.
     pub(crate) struct RecursionCounter {
         remaining_depth: Rc<Cell<usize>>,
     }
@@ -185,6 +192,15 @@ impl std::error::Error for ParserError {}
 // By default, allow expressions up to this deep before erroring
 const DEFAULT_REMAINING_DEPTH: usize = 50;
 
+// A constant EOF token that can be referenced.
+const EOF_TOKEN: TokenWithSpan = TokenWithSpan {
+    token: Token::EOF,
+    span: Span {
+        start: Location { line: 0, column: 0 },
+        end: Location { line: 0, column: 0 },
+    },
+};
+
 /// Composite types declarations using angle brackets syntax can be arbitrary
 /// nested such that the following declaration is possible:
 ///      `ARRAY<ARRAY<INT>>`
@@ -212,6 +228,9 @@ pub struct ParserOptions {
     /// Controls how literal values are unescaped. See
     /// [`Tokenizer::with_unescape`] for more details.
     pub unescape: bool,
+    /// Controls if the parser expects a semi-colon token
+    /// between statements. Default is `true`.
+    pub require_semicolon_stmt_delimiter: bool,
 }
 
 impl Default for ParserOptions {
@@ -219,6 +238,7 @@ impl Default for ParserOptions {
         Self {
             trailing_commas: false,
             unescape: true,
+            require_semicolon_stmt_delimiter: true,
         }
     }
 }
@@ -261,21 +281,66 @@ enum ParserState {
     /// PRIOR expressions while still allowing prior as an identifier name
     /// in other contexts.
     ConnectBy,
+    /// The state when parsing column definitions.  This state prohibits
+    /// NOT NULL as an alias for IS NOT NULL.  For example:
+    /// ```sql
+    /// CREATE TABLE foo (abc BIGINT NOT NULL);
+    /// ```
+    ColumnDefinition,
 }
 
+/// A SQL Parser
+///
+/// This struct is the main entry point for parsing SQL queries.
+///
+/// # Functionality:
+/// * Parsing SQL: see examples on [`Parser::new`] and [`Parser::parse_sql`]
+/// * Controlling recursion: See [`Parser::with_recursion_limit`]
+/// * Controlling parser options: See [`Parser::with_options`]
+/// * Providing your own tokens: See [`Parser::with_tokens`]
+///
+/// # Internals
+///
+/// The parser uses a [`Tokenizer`] to tokenize the input SQL string into a
+/// `Vec` of [`TokenWithSpan`]s and maintains an `index` to the current token
+/// being processed. The token vec may contain multiple SQL statements.
+///
+/// * The "current" token is the token at `index - 1`
+/// * The "next" token is the token at `index`
+/// * The "previous" token is the token at `index - 2`
+///
+/// If `index` is equal to the length of the token stream, the 'next' token is
+/// [`Token::EOF`].
+///
+/// For example, the SQL string "SELECT * FROM foo" will be tokenized into
+/// following tokens:
+/// ```text
+///  [
+///    "SELECT", // token index 0
+///    " ",      // whitespace
+///    "*",
+///    " ",
+///    "FROM",
+///    " ",
+///    "foo"
+///   ]
+/// ```
+///
+///
 pub struct Parser<'a> {
-    tokens: Vec<TokenWithLocation>,
+    /// The tokens
+    tokens: Vec<TokenWithSpan>,
     /// The index of the first unprocessed token in [`Parser::tokens`].
     index: usize,
     /// The current state of the parser.
     state: ParserState,
-    /// The current dialect to use.
+    /// The SQL dialect to use.
     dialect: &'a dyn Dialect,
     /// Additional options that allow you to mix & match behavior
     /// otherwise constrained to certain dialects (e.g. trailing
     /// commas) and/or format of parse (e.g. unescaping).
     options: ParserOptions,
-    /// Ensure the stack does not overflow by limiting recursion depth.
+    /// Ensures the stack does not overflow by limiting recursion depth.
     recursion_counter: RecursionCounter,
 }
 
@@ -325,6 +390,9 @@ impl<'a> Parser<'a> {
     /// # Ok(())
     /// # }
     /// ```
+    ///
+    /// Note: when "recursive-protection" feature is enabled, this crate uses additional stack overflow protection
+    //  for some of its recursive methods. See [`recursive::recursive`] for more information.
     pub fn with_recursion_limit(mut self, recursion_limit: usize) -> Self {
         self.recursion_counter = RecursionCounter::new(recursion_limit);
         self
@@ -358,7 +426,7 @@ impl<'a> Parser<'a> {
     }
 
     /// Reset this parser to parse the specified token stream
-    pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithLocation>) -> Self {
+    pub fn with_tokens_with_locations(mut self, tokens: Vec<TokenWithSpan>) -> Self {
         self.tokens = tokens;
         self.index = 0;
         self
@@ -367,11 +435,11 @@ impl<'a> Parser<'a> {
     /// Reset this parser state to parse the specified tokens
     pub fn with_tokens(self, tokens: Vec<Token>) -> Self {
         // Put in dummy locations
-        let tokens_with_locations: Vec<TokenWithLocation> = tokens
+        let tokens_with_locations: Vec<TokenWithSpan> = tokens
             .into_iter()
-            .map(|token| TokenWithLocation {
+            .map(|token| TokenWithSpan {
                 token,
-                location: Location { line: 0, column: 0 },
+                span: Span::empty(),
             })
             .collect();
         self.with_tokens_with_locations(tokens_with_locations)
@@ -384,7 +452,7 @@ impl<'a> Parser<'a> {
     ///
     /// See example on [`Parser::new()`] for an example
     pub fn try_with_sql(self, sql: &str) -> Result<Self, ParserError> {
-        debug!("Parsing sql '{}'...", sql);
+        debug!("Parsing sql '{sql}'...");
         let tokens = Tokenizer::new(self.dialect, sql)
             .with_unescape(self.options.unescape)
             .tokenize_with_location()?;
@@ -415,6 +483,10 @@ impl<'a> Parser<'a> {
                 expecting_statement_delimiter = false;
             }
 
+            if !self.options.require_semicolon_stmt_delimiter {
+                expecting_statement_delimiter = false;
+            }
+
             match self.peek_token().token {
                 Token::EOF => break,
 
@@ -476,7 +548,23 @@ impl<'a> Parser<'a> {
                 Keyword::DESCRIBE => self.parse_explain(DescribeAlias::Describe),
                 Keyword::EXPLAIN => self.parse_explain(DescribeAlias::Explain),
                 Keyword::ANALYZE => self.parse_analyze(),
-                Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
+                Keyword::CASE => {
+                    self.prev_token();
+                    self.parse_case_stmt()
+                }
+                Keyword::IF => {
+                    self.prev_token();
+                    self.parse_if_stmt()
+                }
+                Keyword::WHILE => {
+                    self.prev_token();
+                    self.parse_while()
+                }
+                Keyword::RAISE => {
+                    self.prev_token();
+                    self.parse_raise_stmt()
+                }
+                Keyword::SELECT | Keyword::WITH | Keyword::VALUES | Keyword::FROM => {
                     self.prev_token();
                     self.parse_query().map(Statement::Query)
                 }
@@ -506,24 +594,27 @@ impl<'a> Parser<'a> {
                 Keyword::ALTER => self.parse_alter(),
                 Keyword::CALL => self.parse_call(),
                 Keyword::COPY => self.parse_copy(),
+                Keyword::OPEN => {
+                    self.prev_token();
+                    self.parse_open()
+                }
                 Keyword::CLOSE => self.parse_close(),
                 Keyword::SET => self.parse_set(),
                 Keyword::SHOW => self.parse_show(),
                 Keyword::USE => self.parse_use(),
                 Keyword::GRANT => self.parse_grant(),
+                Keyword::DENY => {
+                    self.prev_token();
+                    self.parse_deny()
+                }
                 Keyword::REVOKE => self.parse_revoke(),
                 Keyword::START => self.parse_start_transaction(),
-                // `BEGIN` is a nonstandard but common alias for the
-                // standard `START TRANSACTION` statement. It is supported
-                // by at least PostgreSQL and MySQL.
                 Keyword::BEGIN => self.parse_begin(),
-                // `END` is a nonstandard but common alias for the
-                // standard `COMMIT TRANSACTION` statement. It is supported
-                // by PostgreSQL.
                 Keyword::END => self.parse_end(),
                 Keyword::SAVEPOINT => self.parse_savepoint(),
                 Keyword::RELEASE => self.parse_release(),
                 Keyword::COMMIT => self.parse_commit(),
+                Keyword::RAISERROR => Ok(self.parse_raiserror()?),
                 Keyword::ROLLBACK => self.parse_rollback(),
                 Keyword::ASSERT => self.parse_assert(),
                 // `PREPARE`, `EXECUTE` and `DEALLOCATE` are Postgres-specific
@@ -540,6 +631,7 @@ impl<'a> Parser<'a> {
                 // `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html
                 Keyword::PRAGMA => self.parse_pragma(),
                 Keyword::UNLOAD => self.parse_unload(),
+                Keyword::RENAME => self.parse_rename(),
                 // `INSTALL` is duckdb specific https://duckdb.org/docs/extensions/overview
                 Keyword::INSTALL if dialect_of!(self is DuckDbDialect | GenericDialect) => {
                     self.parse_install()
@@ -551,6 +643,12 @@ impl<'a> Parser<'a> {
                 }
                 // `COMMENT` is snowflake specific https://docs.snowflake.com/en/sql-reference/sql/comment
                 Keyword::COMMENT if self.dialect.supports_comment_on() => self.parse_comment(),
+                Keyword::PRINT => self.parse_print(),
+                Keyword::RETURN => self.parse_return(),
+                Keyword::EXPORT => {
+                    self.prev_token();
+                    self.parse_export_data()
+                }
                 _ => self.expected("an SQL statement", next_token),
             },
             Token::LParen => {
@@ -561,10 +659,174 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse a `CASE` statement.
+    ///
+    /// See [Statement::Case]
+    pub fn parse_case_stmt(&mut self) -> Result<Statement, ParserError> {
+        let case_token = self.expect_keyword(Keyword::CASE)?;
+
+        let match_expr = if self.peek_keyword(Keyword::WHEN) {
+            None
+        } else {
+            Some(self.parse_expr()?)
+        };
+
+        self.expect_keyword_is(Keyword::WHEN)?;
+        let when_blocks = self.parse_keyword_separated(Keyword::WHEN, |parser| {
+            parser.parse_conditional_statement_block(&[Keyword::WHEN, Keyword::ELSE, Keyword::END])
+        })?;
+
+        let else_block = if self.parse_keyword(Keyword::ELSE) {
+            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
+        } else {
+            None
+        };
+
+        let mut end_case_token = self.expect_keyword(Keyword::END)?;
+        if self.peek_keyword(Keyword::CASE) {
+            end_case_token = self.expect_keyword(Keyword::CASE)?;
+        }
+
+        Ok(Statement::Case(CaseStatement {
+            case_token: AttachedToken(case_token),
+            match_expr,
+            when_blocks,
+            else_block,
+            end_case_token: AttachedToken(end_case_token),
+        }))
+    }
+
+    /// Parse an `IF` statement.
+    ///
+    /// See [Statement::If]
+    pub fn parse_if_stmt(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keyword_is(Keyword::IF)?;
+        let if_block = self.parse_conditional_statement_block(&[
+            Keyword::ELSE,
+            Keyword::ELSEIF,
+            Keyword::END,
+        ])?;
+
+        let elseif_blocks = if self.parse_keyword(Keyword::ELSEIF) {
+            self.parse_keyword_separated(Keyword::ELSEIF, |parser| {
+                parser.parse_conditional_statement_block(&[
+                    Keyword::ELSEIF,
+                    Keyword::ELSE,
+                    Keyword::END,
+                ])
+            })?
+        } else {
+            vec![]
+        };
+
+        let else_block = if self.parse_keyword(Keyword::ELSE) {
+            Some(self.parse_conditional_statement_block(&[Keyword::END])?)
+        } else {
+            None
+        };
+
+        self.expect_keyword_is(Keyword::END)?;
+        let end_token = self.expect_keyword(Keyword::IF)?;
+
+        Ok(Statement::If(IfStatement {
+            if_block,
+            elseif_blocks,
+            else_block,
+            end_token: Some(AttachedToken(end_token)),
+        }))
+    }
+
+    /// Parse a `WHILE` statement.
+    ///
+    /// See [Statement::While]
+    fn parse_while(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keyword_is(Keyword::WHILE)?;
+        let while_block = self.parse_conditional_statement_block(&[Keyword::END])?;
+
+        Ok(Statement::While(WhileStatement { while_block }))
+    }
+
+    /// Parses an expression and associated list of statements
+    /// belonging to a conditional statement like `IF` or `WHEN` or `WHILE`.
+    ///
+    /// Example:
+    /// ```sql
+    /// IF condition THEN statement1; statement2;
+    /// ```
+    fn parse_conditional_statement_block(
+        &mut self,
+        terminal_keywords: &[Keyword],
+    ) -> Result<ConditionalStatementBlock, ParserError> {
+        let start_token = self.get_current_token().clone(); // self.expect_keyword(keyword)?;
+        let mut then_token = None;
+
+        let condition = match &start_token.token {
+            Token::Word(w) if w.keyword == Keyword::ELSE => None,
+            Token::Word(w) if w.keyword == Keyword::WHILE => {
+                let expr = self.parse_expr()?;
+                Some(expr)
+            }
+            _ => {
+                let expr = self.parse_expr()?;
+                then_token = Some(AttachedToken(self.expect_keyword(Keyword::THEN)?));
+                Some(expr)
+            }
+        };
+
+        let conditional_statements = self.parse_conditional_statements(terminal_keywords)?;
+
+        Ok(ConditionalStatementBlock {
+            start_token: AttachedToken(start_token),
+            condition,
+            then_token,
+            conditional_statements,
+        })
+    }
+
+    /// Parse a BEGIN/END block or a sequence of statements
+    /// This could be inside of a conditional (IF, CASE, WHILE etc.) or an object body defined optionally BEGIN/END and one or more statements.
+    pub(crate) fn parse_conditional_statements(
+        &mut self,
+        terminal_keywords: &[Keyword],
+    ) -> Result<ConditionalStatements, ParserError> {
+        let conditional_statements = if self.peek_keyword(Keyword::BEGIN) {
+            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
+            let statements = self.parse_statement_list(terminal_keywords)?;
+            let end_token = self.expect_keyword(Keyword::END)?;
+
+            ConditionalStatements::BeginEnd(BeginEndStatements {
+                begin_token: AttachedToken(begin_token),
+                statements,
+                end_token: AttachedToken(end_token),
+            })
+        } else {
+            ConditionalStatements::Sequence {
+                statements: self.parse_statement_list(terminal_keywords)?,
+            }
+        };
+        Ok(conditional_statements)
+    }
+
+    /// Parse a `RAISE` statement.
+    ///
+    /// See [Statement::Raise]
+    pub fn parse_raise_stmt(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keyword_is(Keyword::RAISE)?;
+
+        let value = if self.parse_keywords(&[Keyword::USING, Keyword::MESSAGE]) {
+            self.expect_token(&Token::Eq)?;
+            Some(RaiseStatementValue::UsingMessage(self.parse_expr()?))
+        } else {
+            self.maybe_parse(|parser| parser.parse_expr().map(RaiseStatementValue::Expr))?
+        };
+
+        Ok(Statement::Raise(RaiseStatement { value }))
+    }
+
     pub fn parse_comment(&mut self) -> Result<Statement, ParserError> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
 
-        self.expect_keyword(Keyword::ON)?;
+        self.expect_keyword_is(Keyword::ON)?;
         let token = self.next_token();
 
         let (object_type, object_name) = match token.token {
@@ -592,7 +854,7 @@ impl<'a> Parser<'a> {
             _ => self.expected("comment object_type", token)?,
         };
 
-        self.expect_keyword(Keyword::IS)?;
+        self.expect_keyword_is(Keyword::IS)?;
         let comment = if self.parse_keyword(Keyword::NULL) {
             None
         } else {
@@ -613,7 +875,7 @@ impl<'a> Parser<'a> {
         let mut export = false;
 
         if !dialect_of!(self is MySqlDialect | GenericDialect) {
-            return parser_err!("Unsupported statement FLUSH", self.peek_token().location);
+            return parser_err!("Unsupported statement FLUSH", self.peek_token().span.start);
         }
 
         let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
@@ -695,7 +957,7 @@ impl<'a> Parser<'a> {
 
     pub fn parse_msck(&mut self) -> Result<Statement, ParserError> {
         let repair = self.parse_keyword(Keyword::REPAIR);
-        self.expect_keyword(Keyword::TABLE)?;
+        self.expect_keyword_is(Keyword::TABLE)?;
         let table_name = self.parse_object_name(false)?;
         let partition_action = self
             .maybe_parse(|parser| {
@@ -709,7 +971,7 @@ impl<'a> Parser<'a> {
                     Some(Keyword::SYNC) => Some(AddDropSync::SYNC),
                     _ => None,
                 };
-                parser.expect_keyword(Keyword::PARTITIONS)?;
+                parser.expect_keyword_is(Keyword::PARTITIONS)?;
                 Ok(pa)
             })?
             .unwrap_or_default();
@@ -722,12 +984,13 @@ impl<'a> Parser<'a> {
 
     pub fn parse_truncate(&mut self) -> Result<Statement, ParserError> {
         let table = self.parse_keyword(Keyword::TABLE);
-        let only = self.parse_keyword(Keyword::ONLY);
 
         let table_names = self
-            .parse_comma_separated(|p| p.parse_object_name(false))?
+            .parse_comma_separated(|p| {
+                Ok((p.parse_keyword(Keyword::ONLY), p.parse_object_name(false)?))
+            })?
             .into_iter()
-            .map(|n| TruncateTableTarget { name: n })
+            .map(|(only, name)| TruncateTableTarget { name, only })
             .collect();
 
         let mut partitions = None;
@@ -749,13 +1012,7 @@ impl<'a> Parser<'a> {
                 None
             };
 
-            cascade = if self.parse_keyword(Keyword::CASCADE) {
-                Some(TruncateCascadeOption::Cascade)
-            } else if self.parse_keyword(Keyword::RESTRICT) {
-                Some(TruncateCascadeOption::Restrict)
-            } else {
-                None
-            };
+            cascade = self.parse_cascade_option();
         };
 
         let on_cluster = self.parse_optional_on_cluster()?;
@@ -764,13 +1021,22 @@ impl<'a> Parser<'a> {
             table_names,
             partitions,
             table,
-            only,
             identity,
             cascade,
             on_cluster,
         })
     }
 
+    fn parse_cascade_option(&mut self) -> Option<CascadeOption> {
+        if self.parse_keyword(Keyword::CASCADE) {
+            Some(CascadeOption::Cascade)
+        } else if self.parse_keyword(Keyword::RESTRICT) {
+            Some(CascadeOption::Restrict)
+        } else {
+            None
+        }
+    }
+
     pub fn parse_attach_duckdb_database_options(
         &mut self,
     ) -> Result<Vec<AttachDuckDBDatabaseOption>, ParserError> {
@@ -790,7 +1056,7 @@ impl<'a> Parser<'a> {
                 };
                 options.push(AttachDuckDBDatabaseOption::ReadOnly(boolean));
             } else if self.parse_keyword(Keyword::TYPE) {
-                let ident = self.parse_identifier(false)?;
+                let ident = self.parse_identifier()?;
                 options.push(AttachDuckDBDatabaseOption::Type(ident));
             } else {
                 return self.expected("expected one of: ), READ_ONLY, TYPE", self.peek_token());
@@ -809,9 +1075,9 @@ impl<'a> Parser<'a> {
     pub fn parse_attach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
         let database = self.parse_keyword(Keyword::DATABASE);
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
-        let database_path = self.parse_identifier(false)?;
+        let database_path = self.parse_identifier()?;
         let database_alias = if self.parse_keyword(Keyword::AS) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         } else {
             None
         };
@@ -829,7 +1095,7 @@ impl<'a> Parser<'a> {
     pub fn parse_detach_duckdb_database(&mut self) -> Result<Statement, ParserError> {
         let database = self.parse_keyword(Keyword::DATABASE);
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-        let database_alias = self.parse_identifier(false)?;
+        let database_alias = self.parse_identifier()?;
         Ok(Statement::DetachDuckDBDatabase {
             if_exists,
             database,
@@ -840,8 +1106,8 @@ impl<'a> Parser<'a> {
     pub fn parse_attach_database(&mut self) -> Result<Statement, ParserError> {
         let database = self.parse_keyword(Keyword::DATABASE);
         let database_file_name = self.parse_expr()?;
-        self.expect_keyword(Keyword::AS)?;
-        let schema_name = self.parse_identifier(false)?;
+        self.expect_keyword_is(Keyword::AS)?;
+        let schema_name = self.parse_identifier()?;
         Ok(Statement::AttachDatabase {
             database,
             schema_name,
@@ -850,7 +1116,7 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_analyze(&mut self) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TABLE)?;
+        let has_table_keyword = self.parse_keyword(Keyword::TABLE);
         let table_name = self.parse_object_name(false)?;
         let mut for_columns = false;
         let mut cache_metadata = false;
@@ -873,21 +1139,21 @@ impl<'a> Parser<'a> {
                 }
                 Some(Keyword::NOSCAN) => noscan = true,
                 Some(Keyword::FOR) => {
-                    self.expect_keyword(Keyword::COLUMNS)?;
+                    self.expect_keyword_is(Keyword::COLUMNS)?;
 
                     columns = self
                         .maybe_parse(|parser| {
-                            parser.parse_comma_separated(|p| p.parse_identifier(false))
+                            parser.parse_comma_separated(|p| p.parse_identifier())
                         })?
                         .unwrap_or_default();
                     for_columns = true
                 }
                 Some(Keyword::CACHE) => {
-                    self.expect_keyword(Keyword::METADATA)?;
+                    self.expect_keyword_is(Keyword::METADATA)?;
                     cache_metadata = true
                 }
                 Some(Keyword::COMPUTE) => {
-                    self.expect_keyword(Keyword::STATISTICS)?;
+                    self.expect_keyword_is(Keyword::STATISTICS)?;
                     compute_statistics = true
                 }
                 _ => break,
@@ -895,6 +1161,7 @@ impl<'a> Parser<'a> {
         }
 
         Ok(Statement::Analyze {
+            has_table_keyword,
             table_name,
             for_columns,
             columns,
@@ -914,7 +1181,7 @@ impl<'a> Parser<'a> {
             t @ (Token::Word(_) | Token::SingleQuotedString(_)) => {
                 if self.peek_token().token == Token::Period {
                     let mut id_parts: Vec<Ident> = vec![match t {
-                        Token::Word(w) => w.to_ident(),
+                        Token::Word(w) => w.into_ident(next_token.span),
                         Token::SingleQuotedString(s) => Ident::with_quote('\'', s),
                         _ => unreachable!(), // We matched above
                     }];
@@ -922,13 +1189,16 @@ impl<'a> Parser<'a> {
                     while self.consume_token(&Token::Period) {
                         let next_token = self.next_token();
                         match next_token.token {
-                            Token::Word(w) => id_parts.push(w.to_ident()),
+                            Token::Word(w) => id_parts.push(w.into_ident(next_token.span)),
                             Token::SingleQuotedString(s) => {
                                 // SQLite has single-quoted identifiers
                                 id_parts.push(Ident::with_quote('\'', s))
                             }
                             Token::Mul => {
-                                return Ok(Expr::QualifiedWildcard(ObjectName(id_parts)));
+                                return Ok(Expr::QualifiedWildcard(
+                                    ObjectName::from(id_parts),
+                                    AttachedToken(next_token),
+                                ));
                             }
                             _ => {
                                 return self
@@ -939,7 +1209,7 @@ impl<'a> Parser<'a> {
                 }
             }
             Token::Mul => {
-                return Ok(Expr::Wildcard);
+                return Ok(Expr::Wildcard(AttachedToken(next_token)));
             }
             _ => (),
         };
@@ -953,20 +1223,48 @@ impl<'a> Parser<'a> {
         self.parse_subexpr(self.dialect.prec_unknown())
     }
 
+    pub fn parse_expr_with_alias_and_order_by(
+        &mut self,
+    ) -> Result<ExprWithAliasAndOrderBy, ParserError> {
+        let expr = self.parse_expr()?;
+
+        fn validator(explicit: bool, kw: &Keyword, _parser: &mut Parser) -> bool {
+            explicit || !&[Keyword::ASC, Keyword::DESC, Keyword::GROUP].contains(kw)
+        }
+        let alias = self.parse_optional_alias_inner(None, validator)?;
+        let order_by = OrderByOptions {
+            asc: self.parse_asc_desc(),
+            nulls_first: None,
+        };
+        Ok(ExprWithAliasAndOrderBy {
+            expr: ExprWithAlias { expr, alias },
+            order_by,
+        })
+    }
+
     /// Parse tokens until the precedence changes.
     pub fn parse_subexpr(&mut self, precedence: u8) -> Result<Expr, ParserError> {
         let _guard = self.recursion_counter.try_decrease()?;
         debug!("parsing expr");
         let mut expr = self.parse_prefix()?;
-        debug!("prefix: {:?}", expr);
+
+        expr = self.parse_compound_expr(expr, vec![])?;
+
+        debug!("prefix: {expr:?}");
         loop {
             let next_precedence = self.get_next_precedence()?;
-            debug!("next precedence: {:?}", next_precedence);
+            debug!("next precedence: {next_precedence:?}");
 
             if precedence >= next_precedence {
                 break;
             }
 
+            // The period operator is handled exclusively by the
+            // compound field access parsing.
+            if Token::Period == self.peek_token_ref().token {
+                break;
+            }
+
             expr = self.parse_infix(expr, next_precedence)?;
         }
         Ok(expr)
@@ -984,27 +1282,27 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_savepoint(&mut self) -> Result<Statement, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         Ok(Statement::Savepoint { name })
     }
 
     pub fn parse_release(&mut self) -> Result<Statement, ParserError> {
         let _ = self.parse_keyword(Keyword::SAVEPOINT);
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         Ok(Statement::ReleaseSavepoint { name })
     }
 
     pub fn parse_listen(&mut self) -> Result<Statement, ParserError> {
-        let channel = self.parse_identifier(false)?;
+        let channel = self.parse_identifier()?;
         Ok(Statement::LISTEN { channel })
     }
 
     pub fn parse_unlisten(&mut self) -> Result<Statement, ParserError> {
         let channel = if self.consume_token(&Token::Mul) {
-            Ident::new(Expr::Wildcard.to_string())
+            Ident::new(Expr::Wildcard(AttachedToken::empty()).to_string())
         } else {
-            match self.parse_identifier(false) {
+            match self.parse_identifier() {
                 Ok(expr) => expr,
                 _ => {
                     self.prev_token();
@@ -1016,7 +1314,7 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_notify(&mut self) -> Result<Statement, ParserError> {
-        let channel = self.parse_identifier(false)?;
+        let channel = self.parse_identifier()?;
         let payload = if self.consume_token(&Token::Comma) {
             Some(self.parse_literal_string()?)
         } else {
@@ -1025,6 +1323,191 @@ impl<'a> Parser<'a> {
         Ok(Statement::NOTIFY { channel, payload })
     }
 
+    /// Parses a `RENAME TABLE` statement. See [Statement::RenameTable]
+    pub fn parse_rename(&mut self) -> Result<Statement, ParserError> {
+        if self.peek_keyword(Keyword::TABLE) {
+            self.expect_keyword(Keyword::TABLE)?;
+            let rename_tables = self.parse_comma_separated(|parser| {
+                let old_name = parser.parse_object_name(false)?;
+                parser.expect_keyword(Keyword::TO)?;
+                let new_name = parser.parse_object_name(false)?;
+
+                Ok(RenameTable { old_name, new_name })
+            })?;
+            Ok(Statement::RenameTable(rename_tables))
+        } else {
+            self.expected("KEYWORD `TABLE` after RENAME", self.peek_token())
+        }
+    }
+
+    /// Tries to parse an expression by matching the specified word to known keywords that have a special meaning in the dialect.
+    /// Returns `None if no match is found.
+    fn parse_expr_prefix_by_reserved_word(
+        &mut self,
+        w: &Word,
+        w_span: Span,
+    ) -> Result<Option<Expr>, ParserError> {
+        match w.keyword {
+            Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
+                self.prev_token();
+                Ok(Some(Expr::Value(self.parse_value()?)))
+            }
+            Keyword::NULL => {
+                self.prev_token();
+                Ok(Some(Expr::Value(self.parse_value()?)))
+            }
+            Keyword::CURRENT_CATALOG
+            | Keyword::CURRENT_USER
+            | Keyword::SESSION_USER
+            | Keyword::USER
+            if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
+                {
+                    Ok(Some(Expr::Function(Function {
+                        name: ObjectName::from(vec![w.clone().into_ident(w_span)]),
+                        uses_odbc_syntax: false,
+                        parameters: FunctionArguments::None,
+                        args: FunctionArguments::None,
+                        null_treatment: None,
+                        filter: None,
+                        over: None,
+                        within_group: vec![],
+                    })))
+                }
+            Keyword::CURRENT_TIMESTAMP
+            | Keyword::CURRENT_TIME
+            | Keyword::CURRENT_DATE
+            | Keyword::LOCALTIME
+            | Keyword::LOCALTIMESTAMP => {
+                Ok(Some(self.parse_time_functions(ObjectName::from(vec![w.clone().into_ident(w_span)]))?))
+            }
+            Keyword::CASE => Ok(Some(self.parse_case_expr()?)),
+            Keyword::CONVERT => Ok(Some(self.parse_convert_expr(false)?)),
+            Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => Ok(Some(self.parse_convert_expr(true)?)),
+            Keyword::CAST => Ok(Some(self.parse_cast_expr(CastKind::Cast)?)),
+            Keyword::TRY_CAST => Ok(Some(self.parse_cast_expr(CastKind::TryCast)?)),
+            Keyword::SAFE_CAST => Ok(Some(self.parse_cast_expr(CastKind::SafeCast)?)),
+            Keyword::EXISTS
+            // Support parsing Databricks has a function named `exists`.
+            if !dialect_of!(self is DatabricksDialect)
+                || matches!(
+                        self.peek_nth_token_ref(1).token,
+                        Token::Word(Word {
+                            keyword: Keyword::SELECT | Keyword::WITH,
+                            ..
+                        })
+                    ) =>
+                {
+                    Ok(Some(self.parse_exists_expr(false)?))
+                }
+            Keyword::EXTRACT => Ok(Some(self.parse_extract_expr()?)),
+            Keyword::CEIL => Ok(Some(self.parse_ceil_floor_expr(true)?)),
+            Keyword::FLOOR => Ok(Some(self.parse_ceil_floor_expr(false)?)),
+            Keyword::POSITION if self.peek_token_ref().token == Token::LParen => {
+                Ok(Some(self.parse_position_expr(w.clone().into_ident(w_span))?))
+            }
+            Keyword::SUBSTR | Keyword::SUBSTRING => {
+                self.prev_token();
+                Ok(Some(self.parse_substring()?))
+            }
+            Keyword::OVERLAY => Ok(Some(self.parse_overlay_expr()?)),
+            Keyword::TRIM => Ok(Some(self.parse_trim_expr()?)),
+            Keyword::INTERVAL => Ok(Some(self.parse_interval()?)),
+            // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
+            Keyword::ARRAY if *self.peek_token_ref() == Token::LBracket => {
+                self.expect_token(&Token::LBracket)?;
+                Ok(Some(self.parse_array_expr(true)?))
+            }
+            Keyword::ARRAY
+            if self.peek_token() == Token::LParen
+                && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
+                {
+                    self.expect_token(&Token::LParen)?;
+                    let query = self.parse_query()?;
+                    self.expect_token(&Token::RParen)?;
+                    Ok(Some(Expr::Function(Function {
+                        name: ObjectName::from(vec![w.clone().into_ident(w_span)]),
+                        uses_odbc_syntax: false,
+                        parameters: FunctionArguments::None,
+                        args: FunctionArguments::Subquery(query),
+                        filter: None,
+                        null_treatment: None,
+                        over: None,
+                        within_group: vec![],
+                    })))
+                }
+            Keyword::NOT => Ok(Some(self.parse_not()?)),
+            Keyword::MATCH if self.dialect.supports_match_against() => {
+                Ok(Some(self.parse_match_against()?))
+            }
+            Keyword::STRUCT if self.dialect.supports_struct_literal() => {
+                let struct_expr = self.parse_struct_literal()?;
+                Ok(Some(struct_expr))
+            }
+            Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
+                let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
+                Ok(Some(Expr::Prior(Box::new(expr))))
+            }
+            Keyword::MAP if *self.peek_token_ref() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
+                Ok(Some(self.parse_duckdb_map_literal()?))
+            }
+            _ if self.dialect.supports_geometric_types() => match w.keyword {
+                Keyword::CIRCLE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Circle)?)),
+                Keyword::BOX => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricBox)?)),
+                Keyword::PATH => Ok(Some(self.parse_geometric_type(GeometricTypeKind::GeometricPath)?)),
+                Keyword::LINE => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Line)?)),
+                Keyword::LSEG => Ok(Some(self.parse_geometric_type(GeometricTypeKind::LineSegment)?)),
+                Keyword::POINT => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Point)?)),
+                Keyword::POLYGON => Ok(Some(self.parse_geometric_type(GeometricTypeKind::Polygon)?)),
+                _ => Ok(None),
+            },
+            _ => Ok(None),
+        }
+    }
+
+    /// Tries to parse an expression by a word that is not known to have a special meaning in the dialect.
+    fn parse_expr_prefix_by_unreserved_word(
+        &mut self,
+        w: &Word,
+        w_span: Span,
+    ) -> Result<Expr, ParserError> {
+        match self.peek_token().token {
+            Token::LParen if !self.peek_outer_join_operator() => {
+                let id_parts = vec![w.clone().into_ident(w_span)];
+                self.parse_function(ObjectName::from(id_parts))
+            }
+            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
+            Token::SingleQuotedString(_)
+            | Token::DoubleQuotedString(_)
+            | Token::HexStringLiteral(_)
+                if w.value.starts_with('_') =>
+            {
+                Ok(Expr::Prefixed {
+                    prefix: w.clone().into_ident(w_span),
+                    value: self.parse_introduced_string_expr()?.into(),
+                })
+            }
+            // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
+            Token::SingleQuotedString(_)
+            | Token::DoubleQuotedString(_)
+            | Token::HexStringLiteral(_)
+                if w.value.starts_with('_') =>
+            {
+                Ok(Expr::Prefixed {
+                    prefix: w.clone().into_ident(w_span),
+                    value: self.parse_introduced_string_expr()?.into(),
+                })
+            }
+            Token::Arrow if self.dialect.supports_lambda_functions() => {
+                self.expect_token(&Token::Arrow)?;
+                Ok(Expr::Lambda(LambdaFunction {
+                    params: OneOrManyWithParens::One(w.clone().into_ident(w_span)),
+                    body: Box::new(self.parse_expr()?),
+                }))
+            }
+            _ => Ok(Expr::Identifier(w.clone().into_ident(w_span))),
+        }
+    }
+
     /// Parse an expression prefix.
     pub fn parse_prefix(&mut self) -> Result<Expr, ParserError> {
         // allow the dialect to override prefix parsing
@@ -1048,10 +1531,10 @@ impl<'a> Parser<'a> {
         // Note also that naively `SELECT date` looks like a syntax error because the `date` type
         // name is not followed by a string literal, but in fact in PostgreSQL it is a valid
         // expression that should parse as the column name "date".
-        let loc = self.peek_token().location;
+        let loc = self.peek_token_ref().span.start;
         let opt_expr = self.maybe_parse(|parser| {
             match parser.parse_data_type()? {
-                DataType::Interval => parser.parse_interval(),
+                DataType::Interval { .. } => parser.parse_interval(),
                 // PostgreSQL allows almost any identifier to be used as custom data type name,
                 // and we support that in `parse_data_type()`. But unlike Postgres we don't
                 // have a list of globally reserved keywords (since they vary across dialects),
@@ -1060,10 +1543,11 @@ impl<'a> Parser<'a> {
                 // an unary negation `NOT ('a' LIKE 'b')`. To solve this, we don't accept the
                 // `type 'string'` syntax for the custom data types at all.
                 DataType::Custom(..) => parser_err!("dummy", loc),
-                data_type => Ok(Expr::TypedString {
+                data_type => Ok(Expr::TypedString(TypedString {
                     data_type,
-                    value: parser.parse_literal_string()?,
-                }),
+                    value: parser.parse_value()?,
+                    uses_odbc_syntax: false,
+                })),
             }
         })?;
 
@@ -1071,182 +1555,55 @@ impl<'a> Parser<'a> {
             return Ok(expr);
         }
 
-        let next_token = self.next_token();
-        let expr = match next_token.token {
-            Token::Word(w) => match w.keyword {
-                Keyword::TRUE | Keyword::FALSE if self.dialect.supports_boolean_literals() => {
-                    self.prev_token();
-                    Ok(Expr::Value(self.parse_value()?))
-                }
-                Keyword::NULL => {
-                    self.prev_token();
-                    Ok(Expr::Value(self.parse_value()?))
-                }
-                Keyword::CURRENT_CATALOG
-                | Keyword::CURRENT_USER
-                | Keyword::SESSION_USER
-                | Keyword::USER
-                    if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
-                {
-                    Ok(Expr::Function(Function {
-                        name: ObjectName(vec![w.to_ident()]),
-                        parameters: FunctionArguments::None,
-                        args: FunctionArguments::None,
-                        null_treatment: None,
-                        filter: None,
-                        over: None,
-                        within_group: vec![],
-                    }))
-                }
-                Keyword::CURRENT_TIMESTAMP
-                | Keyword::CURRENT_TIME
-                | Keyword::CURRENT_DATE
-                | Keyword::LOCALTIME
-                | Keyword::LOCALTIMESTAMP => {
-                    self.parse_time_functions(ObjectName(vec![w.to_ident()]))
-                }
-                Keyword::CASE => self.parse_case_expr(),
-                Keyword::CONVERT => self.parse_convert_expr(false),
-                Keyword::TRY_CONVERT if self.dialect.supports_try_convert() => self.parse_convert_expr(true),
-                Keyword::CAST => self.parse_cast_expr(CastKind::Cast),
-                Keyword::TRY_CAST => self.parse_cast_expr(CastKind::TryCast),
-                Keyword::SAFE_CAST => self.parse_cast_expr(CastKind::SafeCast),
-                Keyword::EXISTS
-                    // Support parsing Databricks has a function named `exists`.
-                    if !dialect_of!(self is DatabricksDialect)
-                        || matches!(
-                            self.peek_nth_token(1).token,
-                            Token::Word(Word {
-                                keyword: Keyword::SELECT | Keyword::WITH,
-                                ..
-                            })
-                        ) =>
-                {
-                    self.parse_exists_expr(false)
-                }
-                Keyword::EXTRACT => self.parse_extract_expr(),
-                Keyword::CEIL => self.parse_ceil_floor_expr(true),
-                Keyword::FLOOR => self.parse_ceil_floor_expr(false),
-                Keyword::POSITION if self.peek_token().token == Token::LParen => {
-                    self.parse_position_expr(w.to_ident())
-                }
-                Keyword::SUBSTRING => self.parse_substring_expr(),
-                Keyword::OVERLAY => self.parse_overlay_expr(),
-                Keyword::TRIM => self.parse_trim_expr(),
-                Keyword::INTERVAL => self.parse_interval(),
-                // Treat ARRAY[1,2,3] as an array [1,2,3], otherwise try as subquery or a function call
-                Keyword::ARRAY if self.peek_token() == Token::LBracket => {
-                    self.expect_token(&Token::LBracket)?;
-                    self.parse_array_expr(true)
-                }
-                Keyword::ARRAY
-                    if self.peek_token() == Token::LParen
-                        && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) =>
-                {
-                    self.expect_token(&Token::LParen)?;
-                    let query = self.parse_query()?;
-                    self.expect_token(&Token::RParen)?;
-                    Ok(Expr::Function(Function {
-                        name: ObjectName(vec![w.to_ident()]),
-                        parameters: FunctionArguments::None,
-                        args: FunctionArguments::Subquery(query),
-                        filter: None,
-                        null_treatment: None,
-                        over: None,
-                        within_group: vec![],
-                    }))
-                }
-                Keyword::NOT => self.parse_not(),
-                Keyword::MATCH if dialect_of!(self is MySqlDialect | GenericDialect) => {
-                    self.parse_match_against()
-                }
-                Keyword::STRUCT if dialect_of!(self is BigQueryDialect | GenericDialect) => {
-                    self.prev_token();
-                    self.parse_bigquery_struct_literal()
-                }
-                Keyword::PRIOR if matches!(self.state, ParserState::ConnectBy) => {
-                    let expr = self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?;
-                    Ok(Expr::Prior(Box::new(expr)))
-                }
-                Keyword::MAP if self.peek_token() == Token::LBrace && self.dialect.support_map_literal_syntax() => {
-                    self.parse_duckdb_map_literal()
-                }
-                // Here `w` is a word, check if it's a part of a multipart
-                // identifier, a function call, or a simple identifier:
-                _ => match self.peek_token().token {
-                    Token::LParen | Token::Period => {
-                        let mut id_parts: Vec<Ident> = vec![w.to_ident()];
-                        let mut ends_with_wildcard = false;
-                        while self.consume_token(&Token::Period) {
-                            let next_token = self.next_token();
-                            match next_token.token {
-                                Token::Word(w) => id_parts.push(w.to_ident()),
-                                Token::Mul => {
-                                    // Postgres explicitly allows funcnm(tablenm.*) and the
-                                    // function array_agg traverses this control flow
-                                    if dialect_of!(self is PostgreSqlDialect) {
-                                        ends_with_wildcard = true;
-                                        break;
-                                    } else {
-                                        return self
-                                            .expected("an identifier after '.'", next_token);
-                                    }
-                                }
-                                Token::SingleQuotedString(s) => {
-                                    id_parts.push(Ident::with_quote('\'', s))
-                                }
-                                _ => {
-                                    return self
-                                        .expected("an identifier or a '*' after '.'", next_token);
-                                }
-                            }
-                        }
+        // Cache some dialect properties to avoid lifetime issues with the
+        // next_token reference.
 
-                        if ends_with_wildcard {
-                            Ok(Expr::QualifiedWildcard(ObjectName(id_parts)))
-                        } else if self.consume_token(&Token::LParen) {
-                            if dialect_of!(self is SnowflakeDialect | MsSqlDialect)
-                                && self.consume_tokens(&[Token::Plus, Token::RParen])
-                            {
-                                Ok(Expr::OuterJoin(Box::new(
-                                    match <[Ident; 1]>::try_from(id_parts) {
-                                        Ok([ident]) => Expr::Identifier(ident),
-                                        Err(parts) => Expr::CompoundIdentifier(parts),
-                                    },
-                                )))
-                            } else {
-                                self.prev_token();
-                                self.parse_function(ObjectName(id_parts))
+        let dialect = self.dialect;
+
+        self.advance_token();
+        let next_token_index = self.get_current_index();
+        let next_token = self.get_current_token();
+        let span = next_token.span;
+        let expr = match &next_token.token {
+            Token::Word(w) => {
+                // The word we consumed may fall into one of two cases: it has a special meaning, or not.
+                // For example, in Snowflake, the word `interval` may have two meanings depending on the context:
+                // `SELECT CURRENT_DATE() + INTERVAL '1 DAY', MAX(interval) FROM tbl;`
+                //                          ^^^^^^^^^^^^^^^^      ^^^^^^^^
+                //                         interval expression   identifier
+                //
+                // We first try to parse the word and following tokens as a special expression, and if that fails,
+                // we rollback and try to parse it as an identifier.
+                let w = w.clone();
+                match self.try_parse(|parser| parser.parse_expr_prefix_by_reserved_word(&w, span)) {
+                    // This word indicated an expression prefix and parsing was successful
+                    Ok(Some(expr)) => Ok(expr),
+
+                    // No expression prefix associated with this word
+                    Ok(None) => Ok(self.parse_expr_prefix_by_unreserved_word(&w, span)?),
+
+                    // If parsing of the word as a special expression failed, we are facing two options:
+                    // 1. The statement is malformed, e.g. `SELECT INTERVAL '1 DAI` (`DAI` instead of `DAY`)
+                    // 2. The word is used as an identifier, e.g. `SELECT MAX(interval) FROM tbl`
+                    // We first try to parse the word as an identifier and if that fails
+                    // we rollback and return the parsing error we got from trying to parse a
+                    // special expression (to maintain backwards compatibility of parsing errors).
+                    Err(e) => {
+                        if !self.dialect.is_reserved_for_identifier(w.keyword) {
+                            if let Ok(Some(expr)) = self.maybe_parse(|parser| {
+                                parser.parse_expr_prefix_by_unreserved_word(&w, span)
+                            }) {
+                                return Ok(expr);
                             }
-                        } else {
-                            Ok(Expr::CompoundIdentifier(id_parts))
                         }
+                        return Err(e);
                     }
-                    // string introducer https://dev.mysql.com/doc/refman/8.0/en/charset-introducer.html
-                    Token::SingleQuotedString(_)
-                    | Token::DoubleQuotedString(_)
-                    | Token::HexStringLiteral(_)
-                        if w.value.starts_with('_') =>
-                    {
-                        Ok(Expr::IntroducedString {
-                            introducer: w.value,
-                            value: self.parse_introduced_string_value()?,
-                        })
-                    }
-                    Token::Arrow if self.dialect.supports_lambda_functions() => {
-                        self.expect_token(&Token::Arrow)?;
-                        return Ok(Expr::Lambda(LambdaFunction {
-                            params: OneOrManyWithParens::One(w.to_ident()),
-                            body: Box::new(self.parse_expr()?),
-                        }));
-                    }
-                    _ => Ok(Expr::Identifier(w.to_ident())),
-                },
-            }, // End of Token::Word
+                }
+            } // End of Token::Word
             // array `[1, 2, 3]`
             Token::LBracket => self.parse_array_expr(false),
             tok @ Token::Minus | tok @ Token::Plus => {
-                let op = if tok == Token::Plus {
+                let op = if *tok == Token::Plus {
                     UnaryOperator::Plus
                 } else {
                     UnaryOperator::Minus
@@ -1258,20 +1615,16 @@ impl<'a> Parser<'a> {
                     ),
                 })
             }
-            Token::ExclamationMark if self.dialect.supports_bang_not_operator() => {
-                Ok(Expr::UnaryOp {
-                    op: UnaryOperator::BangNot,
-                    expr: Box::new(
-                        self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?,
-                    ),
-                })
-            }
+            Token::ExclamationMark if dialect.supports_bang_not_operator() => Ok(Expr::UnaryOp {
+                op: UnaryOperator::BangNot,
+                expr: Box::new(self.parse_subexpr(self.dialect.prec_value(Precedence::UnaryNot))?),
+            }),
             tok @ Token::DoubleExclamationMark
             | tok @ Token::PGSquareRoot
             | tok @ Token::PGCubeRoot
             | tok @ Token::AtSign
             | tok @ Token::Tilde
-                if dialect_of!(self is PostgreSqlDialect) =>
+                if dialect_is!(dialect is PostgreSqlDialect) =>
             {
                 let op = match tok {
                     Token::DoubleExclamationMark => UnaryOperator::PGPrefixFactorial,
@@ -1288,15 +1641,41 @@ impl<'a> Parser<'a> {
                     ),
                 })
             }
-            Token::EscapedStringLiteral(_) if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
+            tok @ Token::Sharp
+            | tok @ Token::AtDashAt
+            | tok @ Token::AtAt
+            | tok @ Token::QuestionMarkDash
+            | tok @ Token::QuestionPipe
+                if self.dialect.supports_geometric_types() =>
             {
-                self.prev_token();
-                Ok(Expr::Value(self.parse_value()?))
-            }
-            Token::UnicodeStringLiteral(_) => {
-                self.prev_token();
-                Ok(Expr::Value(self.parse_value()?))
-            }
+                let op = match tok {
+                    Token::Sharp => UnaryOperator::Hash,
+                    Token::AtDashAt => UnaryOperator::AtDashAt,
+                    Token::AtAt => UnaryOperator::DoubleAt,
+                    Token::QuestionMarkDash => UnaryOperator::QuestionDash,
+                    Token::QuestionPipe => UnaryOperator::QuestionPipe,
+                    _ => {
+                        return Err(ParserError::ParserError(format!(
+                            "Unexpected token in unary operator parsing: {tok:?}"
+                        )))
+                    }
+                };
+                Ok(Expr::UnaryOp {
+                    op,
+                    expr: Box::new(
+                        self.parse_subexpr(self.dialect.prec_value(Precedence::PlusMinus))?,
+                    ),
+                })
+            }
+            Token::EscapedStringLiteral(_) if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) =>
+            {
+                self.prev_token();
+                Ok(Expr::Value(self.parse_value()?))
+            }
+            Token::UnicodeStringLiteral(_) => {
+                self.prev_token();
+                Ok(Expr::Value(self.parse_value()?))
+            }
             Token::Number(_, _)
             | Token::SingleQuotedString(_)
             | Token::DoubleQuotedString(_)
@@ -1330,39 +1709,19 @@ impl<'a> Parser<'a> {
                     }
                 };
                 self.expect_token(&Token::RParen)?;
-                let expr = self.try_parse_method(expr)?;
-                if !self.consume_token(&Token::Period) {
-                    Ok(expr)
-                } else {
-                    let tok = self.next_token();
-                    let key = match tok.token {
-                        Token::Word(word) => word.to_ident(),
-                        _ => {
-                            return parser_err!(
-                                format!("Expected identifier, found: {tok}"),
-                                tok.location
-                            )
-                        }
-                    };
-                    Ok(Expr::CompositeAccess {
-                        expr: Box::new(expr),
-                        key,
-                    })
-                }
+                Ok(expr)
             }
             Token::Placeholder(_) | Token::Colon | Token::AtSign => {
                 self.prev_token();
                 Ok(Expr::Value(self.parse_value()?))
             }
-            Token::LBrace if self.dialect.supports_dictionary_syntax() => {
+            Token::LBrace => {
                 self.prev_token();
-                self.parse_duckdb_struct_literal()
+                self.parse_lbrace_expr()
             }
-            _ => self.expected("an expression", next_token),
+            _ => self.expected_at("an expression", next_token_index),
         }?;
 
-        let expr = self.try_parse_method(expr)?;
-
         if self.parse_keyword(Keyword::COLLATE) {
             Ok(Expr::Collate {
                 expr: Box::new(expr),
@@ -1373,6 +1732,261 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn parse_geometric_type(&mut self, kind: GeometricTypeKind) -> Result<Expr, ParserError> {
+        Ok(Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(kind),
+            value: self.parse_value()?,
+            uses_odbc_syntax: false,
+        }))
+    }
+
+    /// Try to parse an [Expr::CompoundFieldAccess] like `a.b.c` or `a.b[1].c`.
+    /// If all the fields are `Expr::Identifier`s, return an [Expr::CompoundIdentifier] instead.
+    /// If only the root exists, return the root.
+    /// Parses compound expressions which may be delimited by period
+    /// or bracket notation.
+    /// For example: `a.b.c`, `a.b[1]`.
+    pub fn parse_compound_expr(
+        &mut self,
+        root: Expr,
+        mut chain: Vec<AccessExpr>,
+    ) -> Result<Expr, ParserError> {
+        let mut ending_wildcard: Option<TokenWithSpan> = None;
+        loop {
+            if self.consume_token(&Token::Period) {
+                let next_token = self.peek_token_ref();
+                match &next_token.token {
+                    Token::Mul => {
+                        // Postgres explicitly allows funcnm(tablenm.*) and the
+                        // function array_agg traverses this control flow
+                        if dialect_of!(self is PostgreSqlDialect) {
+                            ending_wildcard = Some(self.next_token());
+                        } else {
+                            // Put back the consumed `.` tokens before exiting.
+                            // If this expression is being parsed in the
+                            // context of a projection, then the `.*` could imply
+                            // a wildcard expansion. For example:
+                            // `SELECT STRUCT('foo').* FROM T`
+                            self.prev_token(); // .
+                        }
+
+                        break;
+                    }
+                    Token::SingleQuotedString(s) => {
+                        let expr =
+                            Expr::Identifier(Ident::with_quote_and_span('\'', next_token.span, s));
+                        chain.push(AccessExpr::Dot(expr));
+                        self.advance_token(); // The consumed string
+                    }
+                    // Fallback to parsing an arbitrary expression.
+                    _ => match self.parse_subexpr(self.dialect.prec_value(Precedence::Period))? {
+                        // If we get back a compound field access or identifier,
+                        // we flatten the nested expression.
+                        // For example if the current root is `foo`
+                        // and we get back a compound identifier expression `bar.baz`
+                        // The full expression should be `foo.bar.baz` (i.e.
+                        // a root with an access chain with 2 entries) and not
+                        // `foo.(bar.baz)` (i.e. a root with an access chain with
+                        // 1 entry`).
+                        Expr::CompoundFieldAccess { root, access_chain } => {
+                            chain.push(AccessExpr::Dot(*root));
+                            chain.extend(access_chain);
+                        }
+                        Expr::CompoundIdentifier(parts) => chain
+                            .extend(parts.into_iter().map(Expr::Identifier).map(AccessExpr::Dot)),
+                        expr => {
+                            chain.push(AccessExpr::Dot(expr));
+                        }
+                    },
+                }
+            } else if !self.dialect.supports_partiql()
+                && self.peek_token_ref().token == Token::LBracket
+            {
+                self.parse_multi_dim_subscript(&mut chain)?;
+            } else {
+                break;
+            }
+        }
+
+        let tok_index = self.get_current_index();
+        if let Some(wildcard_token) = ending_wildcard {
+            if !Self::is_all_ident(&root, &chain) {
+                return self.expected("an identifier or a '*' after '.'", self.peek_token());
+            };
+            Ok(Expr::QualifiedWildcard(
+                ObjectName::from(Self::exprs_to_idents(root, chain)?),
+                AttachedToken(wildcard_token),
+            ))
+        } else if self.maybe_parse_outer_join_operator() {
+            if !Self::is_all_ident(&root, &chain) {
+                return self.expected_at("column identifier before (+)", tok_index);
+            };
+            let expr = if chain.is_empty() {
+                root
+            } else {
+                Expr::CompoundIdentifier(Self::exprs_to_idents(root, chain)?)
+            };
+            Ok(Expr::OuterJoin(expr.into()))
+        } else {
+            Self::build_compound_expr(root, chain)
+        }
+    }
+
+    /// Combines a root expression and access chain to form
+    /// a compound expression. Which may be a [Expr::CompoundFieldAccess]
+    /// or other special cased expressions like [Expr::CompoundIdentifier],
+    /// [Expr::OuterJoin].
+    fn build_compound_expr(
+        root: Expr,
+        mut access_chain: Vec<AccessExpr>,
+    ) -> Result<Expr, ParserError> {
+        if access_chain.is_empty() {
+            return Ok(root);
+        }
+
+        if Self::is_all_ident(&root, &access_chain) {
+            return Ok(Expr::CompoundIdentifier(Self::exprs_to_idents(
+                root,
+                access_chain,
+            )?));
+        }
+
+        // Flatten qualified function calls.
+        // For example, the expression `a.b.c.foo(1,2,3)` should
+        // represent a function called `a.b.c.foo`, rather than
+        // a composite expression.
+        if matches!(root, Expr::Identifier(_))
+            && matches!(
+                access_chain.last(),
+                Some(AccessExpr::Dot(Expr::Function(_)))
+            )
+            && access_chain
+                .iter()
+                .rev()
+                .skip(1) // All except the Function
+                .all(|access| matches!(access, AccessExpr::Dot(Expr::Identifier(_))))
+        {
+            let Some(AccessExpr::Dot(Expr::Function(mut func))) = access_chain.pop() else {
+                return parser_err!("expected function expression", root.span().start);
+            };
+
+            let compound_func_name = [root]
+                .into_iter()
+                .chain(access_chain.into_iter().flat_map(|access| match access {
+                    AccessExpr::Dot(expr) => Some(expr),
+                    _ => None,
+                }))
+                .flat_map(|expr| match expr {
+                    Expr::Identifier(ident) => Some(ident),
+                    _ => None,
+                })
+                .map(ObjectNamePart::Identifier)
+                .chain(func.name.0)
+                .collect::<Vec<_>>();
+            func.name = ObjectName(compound_func_name);
+
+            return Ok(Expr::Function(func));
+        }
+
+        // Flatten qualified outer join expressions.
+        // For example, the expression `T.foo(+)` should
+        // represent an outer join on the column name `T.foo`
+        // rather than a composite expression.
+        if access_chain.len() == 1
+            && matches!(
+                access_chain.last(),
+                Some(AccessExpr::Dot(Expr::OuterJoin(_)))
+            )
+        {
+            let Some(AccessExpr::Dot(Expr::OuterJoin(inner_expr))) = access_chain.pop() else {
+                return parser_err!("expected (+) expression", root.span().start);
+            };
+
+            if !Self::is_all_ident(&root, &[]) {
+                return parser_err!("column identifier before (+)", root.span().start);
+            };
+
+            let token_start = root.span().start;
+            let mut idents = Self::exprs_to_idents(root, vec![])?;
+            match *inner_expr {
+                Expr::CompoundIdentifier(suffix) => idents.extend(suffix),
+                Expr::Identifier(suffix) => idents.push(suffix),
+                _ => {
+                    return parser_err!("column identifier before (+)", token_start);
+                }
+            }
+
+            return Ok(Expr::OuterJoin(Expr::CompoundIdentifier(idents).into()));
+        }
+
+        Ok(Expr::CompoundFieldAccess {
+            root: Box::new(root),
+            access_chain,
+        })
+    }
+
+    fn keyword_to_modifier(k: Keyword) -> Option<ContextModifier> {
+        match k {
+            Keyword::LOCAL => Some(ContextModifier::Local),
+            Keyword::GLOBAL => Some(ContextModifier::Global),
+            Keyword::SESSION => Some(ContextModifier::Session),
+            _ => None,
+        }
+    }
+
+    /// Check if the root is an identifier and all fields are identifiers.
+    fn is_all_ident(root: &Expr, fields: &[AccessExpr]) -> bool {
+        if !matches!(root, Expr::Identifier(_)) {
+            return false;
+        }
+        fields
+            .iter()
+            .all(|x| matches!(x, AccessExpr::Dot(Expr::Identifier(_))))
+    }
+
+    /// Convert a root and a list of fields to a list of identifiers.
+    fn exprs_to_idents(root: Expr, fields: Vec<AccessExpr>) -> Result<Vec<Ident>, ParserError> {
+        let mut idents = vec![];
+        if let Expr::Identifier(root) = root {
+            idents.push(root);
+            for x in fields {
+                if let AccessExpr::Dot(Expr::Identifier(ident)) = x {
+                    idents.push(ident);
+                } else {
+                    return parser_err!(
+                        format!("Expected identifier, found: {}", x),
+                        x.span().start
+                    );
+                }
+            }
+            Ok(idents)
+        } else {
+            parser_err!(
+                format!("Expected identifier, found: {}", root),
+                root.span().start
+            )
+        }
+    }
+
+    /// Returns true if the next tokens indicate the outer join operator `(+)`.
+    fn peek_outer_join_operator(&mut self) -> bool {
+        if !self.dialect.supports_outer_join_operator() {
+            return false;
+        }
+
+        let [maybe_lparen, maybe_plus, maybe_rparen] = self.peek_tokens_ref();
+        Token::LParen == maybe_lparen.token
+            && Token::Plus == maybe_plus.token
+            && Token::RParen == maybe_rparen.token
+    }
+
+    /// If the next tokens indicates the outer join operator `(+)`, consume
+    /// the tokens and return true.
+    fn maybe_parse_outer_join_operator(&mut self) -> bool {
+        self.dialect.supports_outer_join_operator()
+            && self.consume_tokens(&[Token::LParen, Token::Plus, Token::RParen])
+    }
+
     pub fn parse_utility_options(&mut self) -> Result<Vec<UtilityOption>, ParserError> {
         self.expect_token(&Token::LParen)?;
         let options = self.parse_comma_separated(Self::parse_utility_option)?;
@@ -1382,7 +1996,7 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_utility_option(&mut self) -> Result<UtilityOption, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let next_token = self.peek_token();
         if next_token == Token::Comma || next_token == Token::RParen {
@@ -1409,7 +2023,7 @@ impl<'a> Parser<'a> {
             return Ok(None);
         }
         self.maybe_parse(|p| {
-            let params = p.parse_comma_separated(|p| p.parse_identifier(false))?;
+            let params = p.parse_comma_separated(|p| p.parse_identifier())?;
             p.expect_token(&Token::RParen)?;
             p.expect_token(&Token::Arrow)?;
             let expr = p.parse_expr()?;
@@ -1420,42 +2034,73 @@ impl<'a> Parser<'a> {
         })
     }
 
-    /// Parses method call expression
-    fn try_parse_method(&mut self, expr: Expr) -> Result<Expr, ParserError> {
-        if !self.dialect.supports_methods() {
-            return Ok(expr);
+    /// Tries to parse the body of an [ODBC escaping sequence]
+    /// i.e. without the enclosing braces
+    /// Currently implemented:
+    /// Scalar Function Calls
+    /// Date, Time, and Timestamp Literals
+    /// See <https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/escape-sequences-in-odbc?view=sql-server-2017>
+    fn maybe_parse_odbc_body(&mut self) -> Result<Option<Expr>, ParserError> {
+        // Attempt 1: Try to parse it as a function.
+        if let Some(expr) = self.maybe_parse_odbc_fn_body()? {
+            return Ok(Some(expr));
         }
-        let method_chain = self.maybe_parse(|p| {
-            let mut method_chain = Vec::new();
-            while p.consume_token(&Token::Period) {
-                let tok = p.next_token();
-                let name = match tok.token {
-                    Token::Word(word) => word.to_ident(),
-                    _ => return p.expected("identifier", tok),
-                };
-                let func = match p.parse_function(ObjectName(vec![name]))? {
-                    Expr::Function(func) => func,
-                    _ => return p.expected("function", p.peek_token()),
-                };
-                method_chain.push(func);
-            }
-            if !method_chain.is_empty() {
-                Ok(method_chain)
-            } else {
-                p.expected("function", p.peek_token())
-            }
-        })?;
-        if let Some(method_chain) = method_chain {
-            Ok(Expr::Method(Method {
-                expr: Box::new(expr),
-                method_chain,
+        // Attempt 2: Try to parse it as a Date, Time or Timestamp Literal
+        self.maybe_parse_odbc_body_datetime()
+    }
+
+    /// Tries to parse the body of an [ODBC Date, Time, and Timestamp Literals] call.
+    ///
+    /// ```sql
+    /// {d '2025-07-17'}
+    /// {t '14:12:01'}
+    /// {ts '2025-07-17 14:12:01'}
+    /// ```
+    ///
+    /// [ODBC Date, Time, and Timestamp Literals]:
+    /// https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/date-time-and-timestamp-literals?view=sql-server-2017
+    fn maybe_parse_odbc_body_datetime(&mut self) -> Result<Option<Expr>, ParserError> {
+        self.maybe_parse(|p| {
+            let token = p.next_token().clone();
+            let word_string = token.token.to_string();
+            let data_type = match word_string.as_str() {
+                "t" => DataType::Time(None, TimezoneInfo::None),
+                "d" => DataType::Date,
+                "ts" => DataType::Timestamp(None, TimezoneInfo::None),
+                _ => return p.expected("ODBC datetime keyword (t, d, or ts)", token),
+            };
+            let value = p.parse_value()?;
+            Ok(Expr::TypedString(TypedString {
+                data_type,
+                value,
+                uses_odbc_syntax: true,
             }))
-        } else {
-            Ok(expr)
-        }
+        })
+    }
+
+    /// Tries to parse the body of an [ODBC function] call.
+    /// i.e. without the enclosing braces
+    ///
+    /// ```sql
+    /// fn myfunc(1,2,3)
+    /// ```
+    ///
+    /// [ODBC function]: https://learn.microsoft.com/en-us/sql/odbc/reference/develop-app/scalar-function-calls?view=sql-server-2017
+    fn maybe_parse_odbc_fn_body(&mut self) -> Result<Option<Expr>, ParserError> {
+        self.maybe_parse(|p| {
+            p.expect_keyword(Keyword::FN)?;
+            let fn_name = p.parse_object_name(false)?;
+            let mut fn_call = p.parse_function_call(fn_name)?;
+            fn_call.uses_odbc_syntax = true;
+            Ok(Expr::Function(fn_call))
+        })
     }
 
     pub fn parse_function(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
+        self.parse_function_call(name).map(Expr::Function)
+    }
+
+    fn parse_function_call(&mut self, name: ObjectName) -> Result<Function, ParserError> {
         self.expect_token(&Token::LParen)?;
 
         // Snowflake permits a subquery to be passed as an argument without
@@ -1463,15 +2108,16 @@ impl<'a> Parser<'a> {
         if dialect_of!(self is SnowflakeDialect) && self.peek_sub_query() {
             let subquery = self.parse_query()?;
             self.expect_token(&Token::RParen)?;
-            return Ok(Expr::Function(Function {
+            return Ok(Function {
                 name,
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::Subquery(subquery),
                 filter: None,
                 null_treatment: None,
                 over: None,
                 within_group: vec![],
-            }));
+            });
         }
 
         let mut args = self.parse_function_argument_list()?;
@@ -1524,28 +2170,29 @@ impl<'a> Parser<'a> {
                 let window_spec = self.parse_window_spec()?;
                 Some(WindowType::WindowSpec(window_spec))
             } else {
-                Some(WindowType::NamedWindow(self.parse_identifier(false)?))
+                Some(WindowType::NamedWindow(self.parse_identifier()?))
             }
         } else {
             None
         };
 
-        Ok(Expr::Function(Function {
+        Ok(Function {
             name,
+            uses_odbc_syntax: false,
             parameters,
             args: FunctionArguments::List(args),
             null_treatment,
             filter,
             over,
             within_group,
-        }))
+        })
     }
 
     /// Optionally parses a null treatment clause.
     fn parse_null_treatment(&mut self) -> Result<Option<NullTreatment>, ParserError> {
         match self.parse_one_of_keywords(&[Keyword::RESPECT, Keyword::IGNORE]) {
             Some(keyword) => {
-                self.expect_keyword(Keyword::NULLS)?;
+                self.expect_keyword_is(Keyword::NULLS)?;
 
                 Ok(match keyword {
                     Keyword::RESPECT => Some(NullTreatment::RespectNulls),
@@ -1565,6 +2212,7 @@ impl<'a> Parser<'a> {
         };
         Ok(Expr::Function(Function {
             name,
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args,
             filter: None,
@@ -1591,7 +2239,7 @@ impl<'a> Parser<'a> {
         let units = self.parse_window_frame_units()?;
         let (start_bound, end_bound) = if self.parse_keyword(Keyword::BETWEEN) {
             let start_bound = self.parse_window_frame_bound()?;
-            self.expect_keyword(Keyword::AND)?;
+            self.expect_keyword_is(Keyword::AND)?;
             let end_bound = Some(self.parse_window_frame_bound()?);
             (start_bound, end_bound)
         } else {
@@ -1694,17 +2342,18 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_case_expr(&mut self) -> Result<Expr, ParserError> {
+        let case_token = AttachedToken(self.get_current_token().clone());
         let mut operand = None;
         if !self.parse_keyword(Keyword::WHEN) {
             operand = Some(Box::new(self.parse_expr()?));
-            self.expect_keyword(Keyword::WHEN)?;
+            self.expect_keyword_is(Keyword::WHEN)?;
         }
         let mut conditions = vec![];
-        let mut results = vec![];
         loop {
-            conditions.push(self.parse_expr()?);
-            self.expect_keyword(Keyword::THEN)?;
-            results.push(self.parse_expr()?);
+            let condition = self.parse_expr()?;
+            self.expect_keyword_is(Keyword::THEN)?;
+            let result = self.parse_expr()?;
+            conditions.push(CaseWhen { condition, result });
             if !self.parse_keyword(Keyword::WHEN) {
                 break;
             }
@@ -1714,18 +2363,19 @@ impl<'a> Parser<'a> {
         } else {
             None
         };
-        self.expect_keyword(Keyword::END)?;
+        let end_token = AttachedToken(self.expect_keyword(Keyword::END)?);
         Ok(Expr::Case {
+            case_token,
+            end_token,
             operand,
             conditions,
-            results,
             else_result,
         })
     }
 
     pub fn parse_optional_cast_format(&mut self) -> Result<Option<CastFormat>, ParserError> {
         if self.parse_keyword(Keyword::FORMAT) {
-            let value = self.parse_value()?;
+            let value = self.parse_value()?.value;
             match self.parse_optional_time_zone()? {
                 Some(tz) => Ok(Some(CastFormat::ValueAtTimeZone(value, tz))),
                 None => Ok(Some(CastFormat::Value(value))),
@@ -1737,7 +2387,7 @@ impl<'a> Parser<'a> {
 
     pub fn parse_optional_time_zone(&mut self) -> Result<Option<Value>, ParserError> {
         if self.parse_keywords(&[Keyword::AT, Keyword::TIME, Keyword::ZONE]) {
-            self.parse_value().map(Some)
+            self.parse_value().map(|v| Some(v.value))
         } else {
             Ok(None)
         }
@@ -1809,7 +2459,7 @@ impl<'a> Parser<'a> {
     pub fn parse_cast_expr(&mut self, kind: CastKind) -> Result<Expr, ParserError> {
         self.expect_token(&Token::LParen)?;
         let expr = self.parse_expr()?;
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
         let data_type = self.parse_data_type()?;
         let format = self.parse_optional_cast_format()?;
         self.expect_token(&Token::RParen)?;
@@ -1866,7 +2516,7 @@ impl<'a> Parser<'a> {
             CeilFloorKind::DateTimeField(self.parse_date_time_field()?)
         } else if self.consume_token(&Token::Comma) {
             // Parse `CEIL/FLOOR(expr, scale)`
-            match self.parse_value()? {
+            match self.parse_value()?.value {
                 Value::Number(n, s) => CeilFloorKind::Scale(Value::Number(n, s)),
                 _ => {
                     return Err(ParserError::ParserError(
@@ -1899,7 +2549,7 @@ impl<'a> Parser<'a> {
 
             // Parse the subexpr till the IN keyword
             let expr = p.parse_subexpr(between_prec)?;
-            p.expect_keyword(Keyword::IN)?;
+            p.expect_keyword_is(Keyword::IN)?;
             let from = p.parse_expr()?;
             p.expect_token(&Token::RParen)?;
             Ok(Expr::Position {
@@ -1911,12 +2561,20 @@ impl<'a> Parser<'a> {
             Some(expr) => Ok(expr),
             // Snowflake supports `position` as an ordinary function call
             // without the special `IN` syntax.
-            None => self.parse_function(ObjectName(vec![ident])),
+            None => self.parse_function(ObjectName::from(vec![ident])),
         }
     }
 
-    pub fn parse_substring_expr(&mut self) -> Result<Expr, ParserError> {
-        // PARSE SUBSTRING (EXPR [FROM 1] [FOR 3])
+    // { SUBSTRING | SUBSTR } (<EXPR> [FROM 1] [FOR 3])
+    pub fn parse_substring(&mut self) -> Result<Expr, ParserError> {
+        let shorthand = match self.expect_one_of_keywords(&[Keyword::SUBSTR, Keyword::SUBSTRING])? {
+            Keyword::SUBSTR => true,
+            Keyword::SUBSTRING => false,
+            _ => {
+                self.prev_token();
+                return self.expected("SUBSTR or SUBSTRING", self.peek_token());
+            }
+        };
         self.expect_token(&Token::LParen)?;
         let expr = self.parse_expr()?;
         let mut from_expr = None;
@@ -1936,6 +2594,7 @@ impl<'a> Parser<'a> {
             substring_from: from_expr.map(Box::new),
             substring_for: to_expr.map(Box::new),
             special,
+            shorthand,
         })
     }
 
@@ -1943,9 +2602,9 @@ impl<'a> Parser<'a> {
         // PARSE OVERLAY (EXPR PLACING EXPR FROM 1 [FOR 3])
         self.expect_token(&Token::LParen)?;
         let expr = self.parse_expr()?;
-        self.expect_keyword(Keyword::PLACING)?;
+        self.expect_keyword_is(Keyword::PLACING)?;
         let what_expr = self.parse_expr()?;
-        self.expect_keyword(Keyword::FROM)?;
+        self.expect_keyword_is(Keyword::FROM)?;
         let from_expr = self.parse_expr()?;
         let mut for_expr = None;
         if self.parse_keyword(Keyword::FOR) {
@@ -1970,10 +2629,7 @@ impl<'a> Parser<'a> {
         self.expect_token(&Token::LParen)?;
         let mut trim_where = None;
         if let Token::Word(word) = self.peek_token().token {
-            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING]
-                .iter()
-                .any(|d| word.keyword == *d)
-            {
+            if [Keyword::BOTH, Keyword::LEADING, Keyword::TRAILING].contains(&word.keyword) {
                 trim_where = Some(self.parse_trim_where()?);
             }
         }
@@ -1989,7 +2645,7 @@ impl<'a> Parser<'a> {
                 trim_characters: None,
             })
         } else if self.consume_token(&Token::Comma)
-            && dialect_of!(self is SnowflakeDialect | BigQueryDialect | GenericDialect)
+            && dialect_of!(self is DuckDbDialect | SnowflakeDialect | BigQueryDialect | GenericDialect)
         {
             let characters = self.parse_comma_separated(Parser::parse_expr)?;
             self.expect_token(&Token::RParen)?;
@@ -2036,7 +2692,7 @@ impl<'a> Parser<'a> {
             if self.parse_keyword(Keyword::ERROR) {
                 Ok(Some(ListAggOnOverflow::Error))
             } else {
-                self.expect_keyword(Keyword::TRUNCATE)?;
+                self.expect_keyword_is(Keyword::TRUNCATE)?;
                 let filler = match self.peek_token().token {
                     Token::Word(w)
                         if w.keyword == Keyword::WITH || w.keyword == Keyword::WITHOUT =>
@@ -2057,7 +2713,7 @@ impl<'a> Parser<'a> {
                 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
                     self.expected("either WITH or WITHOUT in LISTAGG", self.peek_token())?;
                 }
-                self.expect_keyword(Keyword::COUNT)?;
+                self.expect_keyword_is(Keyword::COUNT)?;
                 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
             }
         } else {
@@ -2074,12 +2730,14 @@ impl<'a> Parser<'a> {
         match &next_token.token {
             Token::Word(w) => match w.keyword {
                 Keyword::YEAR => Ok(DateTimeField::Year),
+                Keyword::YEARS => Ok(DateTimeField::Years),
                 Keyword::MONTH => Ok(DateTimeField::Month),
+                Keyword::MONTHS => Ok(DateTimeField::Months),
                 Keyword::WEEK => {
                     let week_day = if dialect_of!(self is BigQueryDialect | GenericDialect)
                         && self.consume_token(&Token::LParen)
                     {
-                        let week_day = self.parse_identifier(false)?;
+                        let week_day = self.parse_identifier()?;
                         self.expect_token(&Token::RParen)?;
                         Some(week_day)
                     } else {
@@ -2087,14 +2745,19 @@ impl<'a> Parser<'a> {
                     };
                     Ok(DateTimeField::Week(week_day))
                 }
+                Keyword::WEEKS => Ok(DateTimeField::Weeks),
                 Keyword::DAY => Ok(DateTimeField::Day),
                 Keyword::DAYOFWEEK => Ok(DateTimeField::DayOfWeek),
                 Keyword::DAYOFYEAR => Ok(DateTimeField::DayOfYear),
+                Keyword::DAYS => Ok(DateTimeField::Days),
                 Keyword::DATE => Ok(DateTimeField::Date),
                 Keyword::DATETIME => Ok(DateTimeField::Datetime),
                 Keyword::HOUR => Ok(DateTimeField::Hour),
+                Keyword::HOURS => Ok(DateTimeField::Hours),
                 Keyword::MINUTE => Ok(DateTimeField::Minute),
+                Keyword::MINUTES => Ok(DateTimeField::Minutes),
                 Keyword::SECOND => Ok(DateTimeField::Second),
+                Keyword::SECONDS => Ok(DateTimeField::Seconds),
                 Keyword::CENTURY => Ok(DateTimeField::Century),
                 Keyword::DECADE => Ok(DateTimeField::Decade),
                 Keyword::DOY => Ok(DateTimeField::Doy),
@@ -2121,14 +2784,14 @@ impl<'a> Parser<'a> {
                 Keyword::TIMEZONE_REGION => Ok(DateTimeField::TimezoneRegion),
                 _ if self.dialect.allow_extract_custom() => {
                     self.prev_token();
-                    let custom = self.parse_identifier(false)?;
+                    let custom = self.parse_identifier()?;
                     Ok(DateTimeField::Custom(custom))
                 }
                 _ => self.expected("date/time field", next_token),
             },
             Token::SingleQuotedString(_) if self.dialect.allow_extract_single_quotes() => {
                 self.prev_token();
-                let custom = self.parse_identifier(false)?;
+                let custom = self.parse_identifier()?;
                 Ok(DateTimeField::Custom(custom))
             }
             _ => self.expected("date/time field", next_token),
@@ -2157,20 +2820,45 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse expression types that start with a left brace '{'.
+    /// Examples:
+    /// ```sql
+    /// -- Dictionary expr.
+    /// {'key1': 'value1', 'key2': 'value2'}
+    ///
+    /// -- Function call using the ODBC syntax.
+    /// { fn CONCAT('foo', 'bar') }
+    /// ```
+    fn parse_lbrace_expr(&mut self) -> Result<Expr, ParserError> {
+        let token = self.expect_token(&Token::LBrace)?;
+
+        if let Some(fn_expr) = self.maybe_parse_odbc_body()? {
+            self.expect_token(&Token::RBrace)?;
+            return Ok(fn_expr);
+        }
+
+        if self.dialect.supports_dictionary_syntax() {
+            self.prev_token(); // Put back the '{'
+            return self.parse_dictionary();
+        }
+
+        self.expected("an expression", token)
+    }
+
     /// Parses fulltext expressions [`sqlparser::ast::Expr::MatchAgainst`]
     ///
     /// # Errors
     /// This method will raise an error if the column list is empty or with invalid identifiers,
     /// the match expression is not a literal string, or if the search modifier is not valid.
     pub fn parse_match_against(&mut self) -> Result<Expr, ParserError> {
-        let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+        let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
 
-        self.expect_keyword(Keyword::AGAINST)?;
+        self.expect_keyword_is(Keyword::AGAINST)?;
 
         self.expect_token(&Token::LParen)?;
 
         // MySQL is too permissive about the value, IMO we can't validate it perfectly on syntax level.
-        let match_value = self.parse_value()?;
+        let match_value = self.parse_value()?.value;
 
         let in_natural_language_mode_keywords = &[
             Keyword::IN,
@@ -2249,7 +2937,7 @@ impl<'a> Parser<'a> {
         } else if self.dialect.require_interval_qualifier() {
             return parser_err!(
                 "INTERVAL requires a unit after the literal value",
-                self.peek_token().location
+                self.peek_token().span.start
             );
         } else {
             None
@@ -2296,12 +2984,19 @@ impl<'a> Parser<'a> {
             matches!(
                 word.keyword,
                 Keyword::YEAR
+                    | Keyword::YEARS
                     | Keyword::MONTH
+                    | Keyword::MONTHS
                     | Keyword::WEEK
+                    | Keyword::WEEKS
                     | Keyword::DAY
+                    | Keyword::DAYS
                     | Keyword::HOUR
+                    | Keyword::HOURS
                     | Keyword::MINUTE
+                    | Keyword::MINUTES
                     | Keyword::SECOND
+                    | Keyword::SECONDS
                     | Keyword::CENTURY
                     | Keyword::DECADE
                     | Keyword::DOW
@@ -2328,7 +3023,6 @@ impl<'a> Parser<'a> {
         }
     }
 
-    /// Bigquery specific: Parse a struct literal
     /// Syntax
     /// ```sql
     /// -- typed
@@ -2336,13 +3030,19 @@ impl<'a> Parser<'a> {
     /// -- typeless
     /// STRUCT( expr1 [AS field_name] [, ... ])
     /// ```
-    fn parse_bigquery_struct_literal(&mut self) -> Result<Expr, ParserError> {
+    fn parse_struct_literal(&mut self) -> Result<Expr, ParserError> {
+        // Parse the fields definition if exist `<[field_name] field_type, ...>`
+        self.prev_token();
         let (fields, trailing_bracket) =
             self.parse_struct_type_def(Self::parse_struct_field_def)?;
         if trailing_bracket.0 {
-            return parser_err!("unmatched > in STRUCT literal", self.peek_token().location);
+            return parser_err!(
+                "unmatched > in STRUCT literal",
+                self.peek_token().span.start
+            );
         }
 
+        // Parse the struct values `(expr1 [, ... ])`
         self.expect_token(&Token::LParen)?;
         let values = self
             .parse_comma_separated(|parser| parser.parse_struct_field_expr(!fields.is_empty()))?;
@@ -2351,13 +3051,13 @@ impl<'a> Parser<'a> {
         Ok(Expr::Struct { values, fields })
     }
 
-    /// Parse an expression value for a bigquery struct [1]
+    /// Parse an expression value for a struct literal
     /// Syntax
     /// ```sql
     /// expr [AS name]
     /// ```
     ///
-    /// Parameter typed_syntax is set to true if the expression
+    /// For biquery [1], Parameter typed_syntax is set to true if the expression
     /// is to be parsed as a field expression declared using typed
     /// struct syntax [2], and false if using typeless struct syntax [3].
     ///
@@ -2370,10 +3070,10 @@ impl<'a> Parser<'a> {
             if typed_syntax {
                 return parser_err!("Typed syntax does not allow AS", {
                     self.prev_token();
-                    self.peek_token().location
+                    self.peek_token().span.start
                 });
             }
-            let field_name = self.parse_identifier(false)?;
+            let field_name = self.parse_identifier()?;
             Ok(Expr::Named {
                 expr: expr.into(),
                 name: field_name,
@@ -2402,8 +3102,7 @@ impl<'a> Parser<'a> {
     where
         F: FnMut(&mut Parser<'a>) -> Result<(StructField, MatchedTrailingBracket), ParserError>,
     {
-        let start_token = self.peek_token();
-        self.expect_keyword(Keyword::STRUCT)?;
+        self.expect_keyword_is(Keyword::STRUCT)?;
 
         // Nothing to do if we have no type information.
         if Token::Lt != self.peek_token() {
@@ -2415,16 +3114,10 @@ impl<'a> Parser<'a> {
         let trailing_bracket = loop {
             let (def, trailing_bracket) = elem_parser(self)?;
             field_defs.push(def);
-            if !self.consume_token(&Token::Comma) {
+            // The struct field definition is finished if it occurs `>>` or comma.
+            if trailing_bracket.0 || !self.consume_token(&Token::Comma) {
                 break trailing_bracket;
             }
-
-            // Angle brackets are balanced so we only expect the trailing `>>` after
-            // we've matched all field types for the current struct.
-            // e.g. this is invalid syntax `STRUCT<STRUCT<INT>>>, INT>(NULL)`
-            if trailing_bracket.0 {
-                return parser_err!("unmatched > in STRUCT definition", start_token.location);
-            }
         };
 
         Ok((
@@ -2435,15 +3128,16 @@ impl<'a> Parser<'a> {
 
     /// Duckdb Struct Data Type <https://duckdb.org/docs/sql/data_types/struct.html#retrieving-from-structs>
     fn parse_duckdb_struct_type_def(&mut self) -> Result<Vec<StructField>, ParserError> {
-        self.expect_keyword(Keyword::STRUCT)?;
+        self.expect_keyword_is(Keyword::STRUCT)?;
         self.expect_token(&Token::LParen)?;
         let struct_body = self.parse_comma_separated(|parser| {
-            let field_name = parser.parse_identifier(false)?;
+            let field_name = parser.parse_identifier()?;
             let field_type = parser.parse_data_type()?;
 
             Ok(StructField {
                 field_name: Some(field_name),
                 field_type,
+                options: None,
             })
         });
         self.expect_token(&Token::RParen)?;
@@ -2472,15 +3166,17 @@ impl<'a> Parser<'a> {
         let field_name = if is_anonymous_field {
             None
         } else {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         };
 
         let (field_type, trailing_bracket) = self.parse_data_type_helper()?;
 
+        let options = self.maybe_parse_options(Keyword::OPTIONS)?;
         Ok((
             StructField {
                 field_name,
                 field_type,
+                options,
             },
             trailing_bracket,
         ))
@@ -2496,13 +3192,13 @@ impl<'a> Parser<'a> {
     ///
     /// [1]: https://duckdb.org/docs/sql/data_types/union.html
     fn parse_union_type_def(&mut self) -> Result<Vec<UnionField>, ParserError> {
-        self.expect_keyword(Keyword::UNION)?;
+        self.expect_keyword_is(Keyword::UNION)?;
 
         self.expect_token(&Token::LParen)?;
 
         let fields = self.parse_comma_separated(|p| {
             Ok(UnionField {
-                field_name: p.parse_identifier(false)?,
+                field_name: p.parse_identifier()?,
                 field_type: p.parse_data_type()?,
             })
         })?;
@@ -2512,7 +3208,7 @@ impl<'a> Parser<'a> {
         Ok(fields)
     }
 
-    /// DuckDB specific: Parse a duckdb [dictionary]
+    /// DuckDB and ClickHouse specific: Parse a duckdb [dictionary] or a clickhouse [map] setting
     ///
     /// Syntax:
     ///
@@ -2521,17 +3217,18 @@ impl<'a> Parser<'a> {
     /// ```
     ///
     /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
-    fn parse_duckdb_struct_literal(&mut self) -> Result<Expr, ParserError> {
+    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
+    fn parse_dictionary(&mut self) -> Result<Expr, ParserError> {
         self.expect_token(&Token::LBrace)?;
 
-        let fields = self.parse_comma_separated(Self::parse_duckdb_dictionary_field)?;
+        let fields = self.parse_comma_separated0(Self::parse_dictionary_field, Token::RBrace)?;
 
         self.expect_token(&Token::RBrace)?;
 
         Ok(Expr::Dictionary(fields))
     }
 
-    /// Parse a field for a duckdb [dictionary]
+    /// Parse a field for a duckdb [dictionary] or a clickhouse [map] setting
     ///
     /// Syntax
     ///
@@ -2540,8 +3237,9 @@ impl<'a> Parser<'a> {
     /// ```
     ///
     /// [dictionary]: https://duckdb.org/docs/sql/data_types/struct#creating-structs
-    fn parse_duckdb_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
-        let key = self.parse_identifier(false)?;
+    /// [map]: https://clickhouse.com/docs/operations/settings/settings#additional_table_filters
+    fn parse_dictionary_field(&mut self) -> Result<DictionaryField, ParserError> {
+        let key = self.parse_identifier()?;
 
         self.expect_token(&Token::Colon)?;
 
@@ -2601,7 +3299,7 @@ impl<'a> Parser<'a> {
     ///
     /// [map]: https://clickhouse.com/docs/en/sql-reference/data-types/map
     fn parse_click_house_map_def(&mut self) -> Result<(DataType, DataType), ParserError> {
-        self.expect_keyword(Keyword::MAP)?;
+        self.expect_keyword_is(Keyword::MAP)?;
         self.expect_token(&Token::LParen)?;
         let key_data_type = self.parse_data_type()?;
         self.expect_token(&Token::Comma)?;
@@ -2621,7 +3319,7 @@ impl<'a> Parser<'a> {
     ///
     /// [tuple]: https://clickhouse.com/docs/en/sql-reference/data-types/tuple
     fn parse_click_house_tuple_def(&mut self) -> Result<Vec<StructField>, ParserError> {
-        self.expect_keyword(Keyword::TUPLE)?;
+        self.expect_keyword_is(Keyword::TUPLE)?;
         self.expect_token(&Token::LParen)?;
         let mut field_defs = vec![];
         loop {
@@ -2670,10 +3368,16 @@ impl<'a> Parser<'a> {
             return infix;
         }
 
-        let mut tok = self.next_token();
-        let regular_binary_operator = match &mut tok.token {
+        let dialect = self.dialect;
+
+        self.advance_token();
+        let tok = self.get_current_token();
+        let tok_index = self.get_current_index();
+        let span = tok.span;
+        let regular_binary_operator = match &tok.token {
             Token::Spaceship => Some(BinaryOperator::Spaceship),
             Token::DoubleEq => Some(BinaryOperator::Eq),
+            Token::Assignment => Some(BinaryOperator::Assignment),
             Token::Eq => Some(BinaryOperator::Eq),
             Token::Neq => Some(BinaryOperator::NotEq),
             Token::Gt => Some(BinaryOperator::Gt),
@@ -2689,7 +3393,7 @@ impl<'a> Parser<'a> {
             Token::Caret => {
                 // In PostgreSQL, ^ stands for the exponentiation operation,
                 // and # stands for XOR. See https://www.postgresql.org/docs/current/functions-math.html
-                if dialect_of!(self is PostgreSqlDialect) {
+                if dialect_is!(dialect is PostgreSqlDialect) {
                     Some(BinaryOperator::PGExp)
                 } else {
                     Some(BinaryOperator::BitwiseXor)
@@ -2697,22 +3401,25 @@ impl<'a> Parser<'a> {
             }
             Token::Ampersand => Some(BinaryOperator::BitwiseAnd),
             Token::Div => Some(BinaryOperator::Divide),
-            Token::DuckIntDiv if dialect_of!(self is DuckDbDialect | GenericDialect) => {
+            Token::DuckIntDiv if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
                 Some(BinaryOperator::DuckIntegerDivide)
             }
-            Token::ShiftLeft if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
+            Token::ShiftLeft if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect) => {
                 Some(BinaryOperator::PGBitwiseShiftLeft)
             }
-            Token::ShiftRight if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) => {
+            Token::ShiftRight if dialect_is!(dialect is PostgreSqlDialect | DuckDbDialect | GenericDialect | RedshiftSqlDialect) => {
                 Some(BinaryOperator::PGBitwiseShiftRight)
             }
-            Token::Sharp if dialect_of!(self is PostgreSqlDialect) => {
+            Token::Sharp if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
                 Some(BinaryOperator::PGBitwiseXor)
             }
-            Token::Overlap if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
+            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | RedshiftSqlDialect) => {
+                Some(BinaryOperator::PGOverlap)
+            }
+            Token::Overlap if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
                 Some(BinaryOperator::PGOverlap)
             }
-            Token::CaretAt if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
+            Token::CaretAt if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
                 Some(BinaryOperator::PGStartsWith)
             }
             Token::Tilde => Some(BinaryOperator::PGRegexMatch),
@@ -2735,13 +3442,65 @@ impl<'a> Parser<'a> {
             Token::Question => Some(BinaryOperator::Question),
             Token::QuestionAnd => Some(BinaryOperator::QuestionAnd),
             Token::QuestionPipe => Some(BinaryOperator::QuestionPipe),
-            Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(core::mem::take(s))),
+            Token::CustomBinaryOperator(s) => Some(BinaryOperator::Custom(s.clone())),
+            Token::DoubleSharp if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::DoubleHash)
+            }
+
+            Token::AmpersandLeftAngleBracket if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::AndLt)
+            }
+            Token::AmpersandRightAngleBracket if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::AndGt)
+            }
+            Token::QuestionMarkDash if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::QuestionDash)
+            }
+            Token::AmpersandLeftAngleBracketVerticalBar
+                if self.dialect.supports_geometric_types() =>
+            {
+                Some(BinaryOperator::AndLtPipe)
+            }
+            Token::VerticalBarAmpersandRightAngleBracket
+                if self.dialect.supports_geometric_types() =>
+            {
+                Some(BinaryOperator::PipeAndGt)
+            }
+            Token::TwoWayArrow if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::LtDashGt)
+            }
+            Token::LeftAngleBracketCaret if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::LtCaret)
+            }
+            Token::RightAngleBracketCaret if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::GtCaret)
+            }
+            Token::QuestionMarkSharp if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::QuestionHash)
+            }
+            Token::QuestionMarkDoubleVerticalBar if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::QuestionDoublePipe)
+            }
+            Token::QuestionMarkDashVerticalBar if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::QuestionDashPipe)
+            }
+            Token::TildeEqual if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::TildeEq)
+            }
+            Token::ShiftLeftVerticalBar if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::LtLtPipe)
+            }
+            Token::VerticalBarShiftRight if self.dialect.supports_geometric_types() => {
+                Some(BinaryOperator::PipeGtGt)
+            }
+            Token::AtSign if self.dialect.supports_geometric_types() => Some(BinaryOperator::At),
 
             Token::Word(w) => match w.keyword {
                 Keyword::AND => Some(BinaryOperator::And),
                 Keyword::OR => Some(BinaryOperator::Or),
                 Keyword::XOR => Some(BinaryOperator::Xor),
-                Keyword::OPERATOR if dialect_of!(self is PostgreSqlDialect | GenericDialect) => {
+                Keyword::OVERLAPS => Some(BinaryOperator::Overlaps),
+                Keyword::OPERATOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
                     self.expect_token(&Token::LParen)?;
                     // there are special rules for operator names in
                     // postgres so we can not use 'parse_object'
@@ -2749,7 +3508,8 @@ impl<'a> Parser<'a> {
                     // See https://www.postgresql.org/docs/current/sql-createoperator.html
                     let mut idents = vec![];
                     loop {
-                        idents.push(self.next_token().to_string());
+                        self.advance_token();
+                        idents.push(self.get_current_token().to_string());
                         if !self.consume_token(&Token::Period) {
                             break;
                         }
@@ -2762,6 +3522,7 @@ impl<'a> Parser<'a> {
             _ => None,
         };
 
+        let tok = self.token_at(tok_index);
         if let Some(op) = regular_binary_operator {
             if let Some(keyword) =
                 self.parse_one_of_keywords(&[Keyword::ANY, Keyword::ALL, Keyword::SOME])
@@ -2787,12 +3548,20 @@ impl<'a> Parser<'a> {
                         | BinaryOperator::LtEq
                         | BinaryOperator::Eq
                         | BinaryOperator::NotEq
+                        | BinaryOperator::PGRegexMatch
+                        | BinaryOperator::PGRegexIMatch
+                        | BinaryOperator::PGRegexNotMatch
+                        | BinaryOperator::PGRegexNotIMatch
+                        | BinaryOperator::PGLikeMatch
+                        | BinaryOperator::PGILikeMatch
+                        | BinaryOperator::PGNotLikeMatch
+                        | BinaryOperator::PGNotILikeMatch
                 ) {
                     return parser_err!(
                         format!(
-                        "Expected one of [=, >, <, =>, =<, !=] as comparison operator, found: {op}"
+                        "Expected one of [=, >, <, =>, =<, !=, ~, ~*, !~, !~*, ~~, ~~*, !~~, !~~*] as comparison operator, found: {op}"
                     ),
-                        tok.location
+                        span.start
                     );
                 };
 
@@ -2843,9 +3612,11 @@ impl<'a> Parser<'a> {
                     {
                         let expr2 = self.parse_expr()?;
                         Ok(Expr::IsNotDistinctFrom(Box::new(expr), Box::new(expr2)))
+                    } else if let Ok(is_normalized) = self.parse_unicode_is_normalized(expr) {
+                        Ok(is_normalized)
                     } else {
                         self.expected(
-                            "[NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS",
+                            "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS",
                             self.peek_token(),
                         )
                     }
@@ -2869,6 +3640,11 @@ impl<'a> Parser<'a> {
                     let negated = self.parse_keyword(Keyword::NOT);
                     let regexp = self.parse_keyword(Keyword::REGEXP);
                     let rlike = self.parse_keyword(Keyword::RLIKE);
+                    let null = if !self.in_column_definition_state() {
+                        self.parse_keyword(Keyword::NULL)
+                    } else {
+                        false
+                    };
                     if regexp || rlike {
                         Ok(Expr::RLike {
                             negated,
@@ -2878,6 +3654,8 @@ impl<'a> Parser<'a> {
                             ),
                             regexp,
                         })
+                    } else if negated && null {
+                        Ok(Expr::IsNotNull(Box::new(expr)))
                     } else if self.parse_keyword(Keyword::IN) {
                         self.parse_in(expr, negated)
                     } else if self.parse_keyword(Keyword::BETWEEN) {
@@ -2915,49 +3693,58 @@ impl<'a> Parser<'a> {
                         self.expected("IN or BETWEEN after NOT", self.peek_token())
                     }
                 }
+                Keyword::NOTNULL if dialect.supports_notnull_operator() => {
+                    Ok(Expr::IsNotNull(Box::new(expr)))
+                }
+                Keyword::MEMBER => {
+                    if self.parse_keyword(Keyword::OF) {
+                        self.expect_token(&Token::LParen)?;
+                        let array = self.parse_expr()?;
+                        self.expect_token(&Token::RParen)?;
+                        Ok(Expr::MemberOf(MemberOf {
+                            value: Box::new(expr),
+                            array: Box::new(array),
+                        }))
+                    } else {
+                        self.expected("OF after MEMBER", self.peek_token())
+                    }
+                }
                 // Can only happen if `get_next_precedence` got out of sync with this function
                 _ => parser_err!(
                     format!("No infix parser for token {:?}", tok.token),
-                    tok.location
+                    tok.span.start
                 ),
             }
-        } else if Token::DoubleColon == tok {
+        } else if Token::DoubleColon == *tok {
             Ok(Expr::Cast {
                 kind: CastKind::DoubleColon,
                 expr: Box::new(expr),
                 data_type: self.parse_data_type()?,
                 format: None,
             })
-        } else if Token::ExclamationMark == tok && self.dialect.supports_factorial_operator() {
+        } else if Token::ExclamationMark == *tok && self.dialect.supports_factorial_operator() {
             Ok(Expr::UnaryOp {
                 op: UnaryOperator::PGPostfixFactorial,
                 expr: Box::new(expr),
             })
-        } else if Token::LBracket == tok {
-            if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) {
-                self.parse_subscript(expr)
-            } else if dialect_of!(self is SnowflakeDialect) {
-                self.prev_token();
-                self.parse_json_access(expr)
-            } else {
-                self.parse_map_access(expr)
-            }
-        } else if dialect_of!(self is SnowflakeDialect | GenericDialect) && Token::Colon == tok {
+        } else if Token::LBracket == *tok && self.dialect.supports_partiql()
+            || (dialect_of!(self is SnowflakeDialect | GenericDialect) && Token::Colon == *tok)
+        {
             self.prev_token();
             self.parse_json_access(expr)
         } else {
             // Can only happen if `get_next_precedence` got out of sync with this function
             parser_err!(
                 format!("No infix parser for token {:?}", tok.token),
-                tok.location
+                tok.span.start
             )
         }
     }
 
     /// Parse the `ESCAPE CHAR` portion of `LIKE`, `ILIKE`, and `SIMILAR TO`
-    pub fn parse_escape_char(&mut self) -> Result<Option<String>, ParserError> {
+    pub fn parse_escape_char(&mut self) -> Result<Option<Value>, ParserError> {
         if self.parse_keyword(Keyword::ESCAPE) {
-            Ok(Some(self.parse_literal_string()?))
+            Ok(Some(self.parse_value()?.into()))
         } else {
             Ok(None)
         }
@@ -3036,15 +3823,24 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// Parse a multi-dimension array accessing like `[1:3][1][1]`
+    pub fn parse_multi_dim_subscript(
+        &mut self,
+        chain: &mut Vec<AccessExpr>,
+    ) -> Result<(), ParserError> {
+        while self.consume_token(&Token::LBracket) {
+            self.parse_subscript(chain)?;
+        }
+        Ok(())
+    }
+
     /// Parses an array subscript like `[1:3]`
     ///
     /// Parser is right after `[`
-    pub fn parse_subscript(&mut self, expr: Expr) -> Result<Expr, ParserError> {
+    fn parse_subscript(&mut self, chain: &mut Vec<AccessExpr>) -> Result<(), ParserError> {
         let subscript = self.parse_subscript_inner()?;
-        Ok(Expr::Subscript {
-            expr: Box::new(expr),
-            subscript: Box::new(subscript),
-        })
+        chain.push(AccessExpr::Subscript(subscript));
+        Ok(())
     }
 
     fn parse_json_path_object_key(&mut self) -> Result<JsonPathElem, ParserError> {
@@ -3072,6 +3868,14 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_json_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
+        let path = self.parse_json_path()?;
+        Ok(Expr::JsonAccess {
+            value: Box::new(expr),
+            path,
+        })
+    }
+
+    fn parse_json_path(&mut self) -> Result<JsonPath, ParserError> {
         let mut path = Vec::new();
         loop {
             match self.next_token().token {
@@ -3095,50 +3899,7 @@ impl<'a> Parser<'a> {
         }
 
         debug_assert!(!path.is_empty());
-        Ok(Expr::JsonAccess {
-            value: Box::new(expr),
-            path: JsonPath { path },
-        })
-    }
-
-    pub fn parse_map_access(&mut self, expr: Expr) -> Result<Expr, ParserError> {
-        let key = self.parse_expr()?;
-        self.expect_token(&Token::RBracket)?;
-
-        let mut keys = vec![MapAccessKey {
-            key,
-            syntax: MapAccessSyntax::Bracket,
-        }];
-        loop {
-            let key = match self.peek_token().token {
-                Token::LBracket => {
-                    self.next_token(); // consume `[`
-                    let key = self.parse_expr()?;
-                    self.expect_token(&Token::RBracket)?;
-                    MapAccessKey {
-                        key,
-                        syntax: MapAccessSyntax::Bracket,
-                    }
-                }
-                // Access on BigQuery nested and repeated expressions can
-                // mix notations in the same expression.
-                // https://cloud.google.com/bigquery/docs/nested-repeated#query_nested_and_repeated_columns
-                Token::Period if dialect_of!(self is BigQueryDialect) => {
-                    self.next_token(); // consume `.`
-                    MapAccessKey {
-                        key: self.parse_expr()?,
-                        syntax: MapAccessSyntax::Period,
-                    }
-                }
-                _ => break,
-            };
-            keys.push(key);
-        }
-
-        Ok(Expr::MapAccess {
-            column: Box::new(expr),
-            keys,
-        })
+        Ok(JsonPath { path })
     }
 
     /// Parses the parens following the `[ NOT ] IN` operator.
@@ -3156,15 +3917,13 @@ impl<'a> Parser<'a> {
             });
         }
         self.expect_token(&Token::LParen)?;
-        let in_op = if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
-            self.prev_token();
-            Expr::InSubquery {
+        let in_op = match self.maybe_parse(|p| p.parse_query())? {
+            Some(subquery) => Expr::InSubquery {
                 expr: Box::new(expr),
-                subquery: self.parse_query()?,
+                subquery,
                 negated,
-            }
-        } else {
-            Expr::InList {
+            },
+            None => Expr::InList {
                 expr: Box::new(expr),
                 list: if self.dialect.supports_in_empty_list() {
                     self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
@@ -3172,7 +3931,7 @@ impl<'a> Parser<'a> {
                     self.parse_comma_separated(Parser::parse_expr)?
                 },
                 negated,
-            }
+            },
         };
         self.expect_token(&Token::RParen)?;
         Ok(in_op)
@@ -3183,7 +3942,7 @@ impl<'a> Parser<'a> {
         // Stop parsing subexpressions for <low> and <high> on tokens with
         // precedence lower than that of `BETWEEN`, such as `AND`, `IS`, etc.
         let low = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
-        self.expect_keyword(Keyword::AND)?;
+        self.expect_keyword_is(Keyword::AND)?;
         let high = self.parse_subexpr(self.dialect.prec_value(Precedence::Between))?;
         Ok(Expr::Between {
             expr: Box::new(expr),
@@ -3193,7 +3952,7 @@ impl<'a> Parser<'a> {
         })
     }
 
-    /// Parse a postgresql casting style which is in the form of `expr::datatype`.
+    /// Parse a PostgreSQL casting style which is in the form of `expr::datatype`.
     pub fn parse_pg_cast(&mut self, expr: Expr) -> Result<Expr, ParserError> {
         Ok(Expr::Cast {
             kind: CastKind::DoubleColon,
@@ -3208,12 +3967,26 @@ impl<'a> Parser<'a> {
         self.dialect.get_next_precedence_default(self)
     }
 
+    /// Return the token at the given location, or EOF if the index is beyond
+    /// the length of the current set of tokens.
+    pub fn token_at(&self, index: usize) -> &TokenWithSpan {
+        self.tokens.get(index).unwrap_or(&EOF_TOKEN)
+    }
+
     /// Return the first non-whitespace token that has not yet been processed
-    /// (or None if reached end-of-file)
-    pub fn peek_token(&self) -> TokenWithLocation {
+    /// or Token::EOF
+    ///
+    /// See [`Self::peek_token_ref`] to avoid the copy.
+    pub fn peek_token(&self) -> TokenWithSpan {
         self.peek_nth_token(0)
     }
 
+    /// Return a reference to the first non-whitespace token that has not yet
+    /// been processed or Token::EOF
+    pub fn peek_token_ref(&self) -> &TokenWithSpan {
+        self.peek_nth_token_ref(0)
+    }
+
     /// Returns the `N` next non-whitespace tokens that have not yet been
     /// processed.
     ///
@@ -3245,41 +4018,63 @@ impl<'a> Parser<'a> {
     /// yet been processed.
     ///
     /// See [`Self::peek_token`] for an example.
-    pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithLocation; N] {
+    pub fn peek_tokens_with_location<const N: usize>(&self) -> [TokenWithSpan; N] {
         let mut index = self.index;
         core::array::from_fn(|_| loop {
             let token = self.tokens.get(index);
             index += 1;
-            if let Some(TokenWithLocation {
+            if let Some(TokenWithSpan {
                 token: Token::Whitespace(_),
-                location: _,
+                span: _,
             }) = token
             {
                 continue;
             }
-            break token.cloned().unwrap_or(TokenWithLocation {
+            break token.cloned().unwrap_or(TokenWithSpan {
                 token: Token::EOF,
-                location: Location { line: 0, column: 0 },
+                span: Span::empty(),
             });
         })
     }
 
+    /// Returns references to the `N` next non-whitespace tokens
+    /// that have not yet been processed.
+    ///
+    /// See [`Self::peek_tokens`] for an example.
+    pub fn peek_tokens_ref<const N: usize>(&self) -> [&TokenWithSpan; N] {
+        let mut index = self.index;
+        core::array::from_fn(|_| loop {
+            let token = self.tokens.get(index);
+            index += 1;
+            if let Some(TokenWithSpan {
+                token: Token::Whitespace(_),
+                span: _,
+            }) = token
+            {
+                continue;
+            }
+            break token.unwrap_or(&EOF_TOKEN);
+        })
+    }
+
+    /// Return nth non-whitespace token that has not yet been processed
+    pub fn peek_nth_token(&self, n: usize) -> TokenWithSpan {
+        self.peek_nth_token_ref(n).clone()
+    }
+
     /// Return nth non-whitespace token that has not yet been processed
-    pub fn peek_nth_token(&self, mut n: usize) -> TokenWithLocation {
+    pub fn peek_nth_token_ref(&self, mut n: usize) -> &TokenWithSpan {
         let mut index = self.index;
         loop {
             index += 1;
             match self.tokens.get(index - 1) {
-                Some(TokenWithLocation {
+                Some(TokenWithSpan {
                     token: Token::Whitespace(_),
-                    location: _,
+                    span: _,
                 }) => continue,
                 non_whitespace => {
                     if n == 0 {
-                        return non_whitespace.cloned().unwrap_or(TokenWithLocation {
-                            token: Token::EOF,
-                            location: Location { line: 0, column: 0 },
-                        });
+                        return non_whitespace.unwrap_or(&EOF_TOKEN);
                     }
                     n -= 1;
                 }
@@ -3289,30 +4084,24 @@ impl<'a> Parser<'a> {
 
     /// Return the first token, possibly whitespace, that has not yet been processed
     /// (or None if reached end-of-file).
-    pub fn peek_token_no_skip(&self) -> TokenWithLocation {
+    pub fn peek_token_no_skip(&self) -> TokenWithSpan {
         self.peek_nth_token_no_skip(0)
     }
 
     /// Return nth token, possibly whitespace, that has not yet been processed.
-    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithLocation {
+    pub fn peek_nth_token_no_skip(&self, n: usize) -> TokenWithSpan {
         self.tokens
             .get(self.index + n)
             .cloned()
-            .unwrap_or(TokenWithLocation {
+            .unwrap_or(TokenWithSpan {
                 token: Token::EOF,
-                location: Location { line: 0, column: 0 },
+                span: Span::empty(),
             })
     }
 
-    /// Look for all of the expected keywords in sequence, without consuming them
-    fn peek_keyword(&mut self, expected: Keyword) -> bool {
-        let index = self.index;
-        let matched = self.parse_keyword(expected);
-        self.index = index;
-        matched
-    }
-
-    /// Look for all of the expected keywords in sequence, without consuming them
+    /// Return true if the next tokens exactly `expected`
+    ///
+    /// Does not advance the current token.
     fn peek_keywords(&mut self, expected: &[Keyword]) -> bool {
         let index = self.index;
         let matched = self.parse_keywords(expected);
@@ -3320,42 +4109,79 @@ impl<'a> Parser<'a> {
         matched
     }
 
-    /// Return the first non-whitespace token that has not yet been processed
-    /// (or None if reached end-of-file) and mark it as processed. OK to call
-    /// repeatedly after reaching EOF.
-    pub fn next_token(&mut self) -> TokenWithLocation {
+    /// Advances to the next non-whitespace token and returns a copy.
+    ///
+    /// Please use [`Self::advance_token`] and [`Self::get_current_token`] to
+    /// avoid the copy.
+    pub fn next_token(&mut self) -> TokenWithSpan {
+        self.advance_token();
+        self.get_current_token().clone()
+    }
+
+    /// Returns the index of the current token
+    ///
+    /// This can be used with APIs that expect an index, such as
+    /// [`Self::token_at`]
+    pub fn get_current_index(&self) -> usize {
+        self.index.saturating_sub(1)
+    }
+
+    /// Return the next unprocessed token, possibly whitespace.
+    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithSpan> {
+        self.index += 1;
+        self.tokens.get(self.index - 1)
+    }
+
+    /// Advances the current token to the next non-whitespace token
+    ///
+    /// See [`Self::get_current_token`] to get the current token after advancing
+    pub fn advance_token(&mut self) {
         loop {
             self.index += 1;
             match self.tokens.get(self.index - 1) {
-                Some(TokenWithLocation {
+                Some(TokenWithSpan {
                     token: Token::Whitespace(_),
-                    location: _,
+                    span: _,
                 }) => continue,
-                token => {
-                    return token
-                        .cloned()
-                        .unwrap_or_else(|| TokenWithLocation::wrap(Token::EOF))
-                }
+                _ => break,
             }
         }
     }
 
-    /// Return the first unprocessed token, possibly whitespace.
-    pub fn next_token_no_skip(&mut self) -> Option<&TokenWithLocation> {
-        self.index += 1;
-        self.tokens.get(self.index - 1)
+    /// Returns a reference to the current token
+    ///
+    /// Does not advance the current token.
+    pub fn get_current_token(&self) -> &TokenWithSpan {
+        self.token_at(self.index.saturating_sub(1))
+    }
+
+    /// Returns a reference to the previous token
+    ///
+    /// Does not advance the current token.
+    pub fn get_previous_token(&self) -> &TokenWithSpan {
+        self.token_at(self.index.saturating_sub(2))
     }
 
-    /// Push back the last one non-whitespace token. Must be called after
-    /// `next_token()`, otherwise might panic. OK to call after
-    /// `next_token()` indicates an EOF.
+    /// Returns a reference to the next token
+    ///
+    /// Does not advance the current token.
+    pub fn get_next_token(&self) -> &TokenWithSpan {
+        self.token_at(self.index)
+    }
+
+    /// Seek back the last one non-whitespace token.
+    ///
+    /// Must be called after `next_token()`, otherwise might panic. OK to call
+    /// after `next_token()` indicates an EOF.
+    ///
+    // TODO rename to backup_token and deprecate prev_token?
     pub fn prev_token(&mut self) {
         loop {
             assert!(self.index > 0);
             self.index -= 1;
-            if let Some(TokenWithLocation {
+            if let Some(TokenWithSpan {
                 token: Token::Whitespace(_),
-                location: _,
+                span: _,
             }) = self.tokens.get(self.index)
             {
                 continue;
@@ -3365,10 +4191,27 @@ impl<'a> Parser<'a> {
     }
 
     /// Report `found` was encountered instead of `expected`
-    pub fn expected<T>(&self, expected: &str, found: TokenWithLocation) -> Result<T, ParserError> {
+    pub fn expected<T>(&self, expected: &str, found: TokenWithSpan) -> Result<T, ParserError> {
+        parser_err!(
+            format!("Expected: {expected}, found: {found}"),
+            found.span.start
+        )
+    }
+
+    /// report `found` was encountered instead of `expected`
+    pub fn expected_ref<T>(&self, expected: &str, found: &TokenWithSpan) -> Result<T, ParserError> {
+        parser_err!(
+            format!("Expected: {expected}, found: {found}"),
+            found.span.start
+        )
+    }
+
+    /// Report that the token at `index` was found instead of `expected`.
+    pub fn expected_at<T>(&self, expected: &str, index: usize) -> Result<T, ParserError> {
+        let found = self.tokens.get(index).unwrap_or(&EOF_TOKEN);
         parser_err!(
             format!("Expected: {expected}, found: {found}"),
-            found.location
+            found.span.start
         )
     }
 
@@ -3376,15 +4219,19 @@ impl<'a> Parser<'a> {
     /// true. Otherwise, no tokens are consumed and returns false.
     #[must_use]
     pub fn parse_keyword(&mut self, expected: Keyword) -> bool {
-        match self.peek_token().token {
-            Token::Word(w) if expected == w.keyword => {
-                self.next_token();
-                true
-            }
-            _ => false,
+        if self.peek_keyword(expected) {
+            self.advance_token();
+            true
+        } else {
+            false
         }
     }
 
+    #[must_use]
+    pub fn peek_keyword(&self, expected: Keyword) -> bool {
+        matches!(&self.peek_token_ref().token, Token::Word(w) if expected == w.keyword)
+    }
+
     /// If the current token is the `expected` keyword followed by
     /// specified tokens, consume them and returns true.
     /// Otherwise, no tokens are consumed and returns false.
@@ -3393,16 +4240,16 @@ impl<'a> Parser<'a> {
     /// not be efficient as it does a loop on the tokens with `peek_nth_token`
     /// each time.
     pub fn parse_keyword_with_tokens(&mut self, expected: Keyword, tokens: &[Token]) -> bool {
-        match self.peek_token().token {
+        match &self.peek_token_ref().token {
             Token::Word(w) if expected == w.keyword => {
                 for (idx, token) in tokens.iter().enumerate() {
-                    if self.peek_nth_token(idx + 1).token != *token {
+                    if self.peek_nth_token_ref(idx + 1).token != *token {
                         return false;
                     }
                 }
                 // consume all tokens
                 for _ in 0..(tokens.len() + 1) {
-                    self.next_token();
+                    self.advance_token();
                 }
                 true
             }
@@ -3427,18 +4274,30 @@ impl<'a> Parser<'a> {
         true
     }
 
+    /// If the current token is one of the given `keywords`, returns the keyword
+    /// that matches, without consuming the token. Otherwise, returns [`None`].
+    #[must_use]
+    pub fn peek_one_of_keywords(&self, keywords: &[Keyword]) -> Option<Keyword> {
+        for keyword in keywords {
+            if self.peek_keyword(*keyword) {
+                return Some(*keyword);
+            }
+        }
+        None
+    }
+
     /// If the current token is one of the given `keywords`, consume the token
     /// and return the keyword that matches. Otherwise, no tokens are consumed
     /// and returns [`None`].
     #[must_use]
     pub fn parse_one_of_keywords(&mut self, keywords: &[Keyword]) -> Option<Keyword> {
-        match self.peek_token().token {
+        match &self.peek_token_ref().token {
             Token::Word(w) => {
                 keywords
                     .iter()
                     .find(|keyword| **keyword == w.keyword)
                     .map(|keyword| {
-                        self.next_token();
+                        self.advance_token();
                         *keyword
                     })
             }
@@ -3453,20 +4312,35 @@ impl<'a> Parser<'a> {
             Ok(keyword)
         } else {
             let keywords: Vec<String> = keywords.iter().map(|x| format!("{x:?}")).collect();
-            self.expected(
+            self.expected_ref(
                 &format!("one of {}", keywords.join(" or ")),
-                self.peek_token(),
+                self.peek_token_ref(),
             )
         }
     }
 
     /// If the current token is the `expected` keyword, consume the token.
     /// Otherwise, return an error.
-    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<(), ParserError> {
+    ///
+    // todo deprecate in favor of expected_keyword_is
+    pub fn expect_keyword(&mut self, expected: Keyword) -> Result<TokenWithSpan, ParserError> {
+        if self.parse_keyword(expected) {
+            Ok(self.get_current_token().clone())
+        } else {
+            self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
+        }
+    }
+
+    /// If the current token is the `expected` keyword, consume the token.
+    /// Otherwise, return an error.
+    ///
+    /// This differs from expect_keyword only in that the matched keyword
+    /// token is not returned.
+    pub fn expect_keyword_is(&mut self, expected: Keyword) -> Result<(), ParserError> {
         if self.parse_keyword(expected) {
             Ok(())
         } else {
-            self.expected(format!("{:?}", &expected).as_str(), self.peek_token())
+            self.expected_ref(format!("{:?}", &expected).as_str(), self.peek_token_ref())
         }
     }
 
@@ -3474,16 +4348,18 @@ impl<'a> Parser<'a> {
     /// sequence, consume them and returns Ok. Otherwise, return an Error.
     pub fn expect_keywords(&mut self, expected: &[Keyword]) -> Result<(), ParserError> {
         for &kw in expected {
-            self.expect_keyword(kw)?;
+            self.expect_keyword_is(kw)?;
         }
         Ok(())
     }
 
     /// Consume the next token if it matches the expected token, otherwise return false
+    ///
+    /// See [Self::advance_token] to consume the token unconditionally
     #[must_use]
     pub fn consume_token(&mut self, expected: &Token) -> bool {
-        if self.peek_token() == *expected {
-            self.next_token();
+        if self.peek_token_ref() == expected {
+            self.advance_token();
             true
         } else {
             false
@@ -3506,11 +4382,11 @@ impl<'a> Parser<'a> {
     }
 
     /// Bail out if the current token is not an expected keyword, or consume it if it is
-    pub fn expect_token(&mut self, expected: &Token) -> Result<(), ParserError> {
-        if self.consume_token(expected) {
-            Ok(())
+    pub fn expect_token(&mut self, expected: &Token) -> Result<TokenWithSpan, ParserError> {
+        if self.peek_token_ref() == expected {
+            Ok(self.next_token())
         } else {
-            self.expected(&expected.to_string(), self.peek_token())
+            self.expected_ref(&expected.to_string(), self.peek_token_ref())
         }
     }
 
@@ -3532,19 +4408,18 @@ impl<'a> Parser<'a> {
         // e.g. `SELECT 1, 2, FROM t`
         // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#trailing_commas
         // https://docs.snowflake.com/en/release-notes/2024/8_11#select-supports-trailing-commas
-        //
-        // This pattern could be captured better with RAII type semantics, but it's quite a bit of
-        // code to add for just one case, so we'll just do it manually here.
-        let old_value = self.options.trailing_commas;
-        self.options.trailing_commas |= self.dialect.supports_projection_trailing_commas();
 
-        let ret = self.parse_comma_separated(|p| p.parse_select_item());
-        self.options.trailing_commas = old_value;
+        let trailing_commas =
+            self.options.trailing_commas | self.dialect.supports_projection_trailing_commas();
 
-        ret
+        self.parse_comma_separated_with_trailing_commas(
+            |p| p.parse_select_item(),
+            trailing_commas,
+            Self::is_reserved_for_column_alias,
+        )
     }
 
-    pub fn parse_actions_list(&mut self) -> Result<Vec<ParsedAction>, ParserError> {
+    pub fn parse_actions_list(&mut self) -> Result<Vec<Action>, ParserError> {
         let mut values = vec![];
         loop {
             values.push(self.parse_grant_permission()?);
@@ -3567,38 +4442,107 @@ impl<'a> Parser<'a> {
         Ok(values)
     }
 
+    /// Parse a list of [TableWithJoins]
+    fn parse_table_with_joins(&mut self) -> Result<Vec<TableWithJoins>, ParserError> {
+        let trailing_commas = self.dialect.supports_from_trailing_commas();
+
+        self.parse_comma_separated_with_trailing_commas(
+            Parser::parse_table_and_joins,
+            trailing_commas,
+            |kw, parser| !self.dialect.is_table_factor(kw, parser),
+        )
+    }
+
     /// Parse the comma of a comma-separated syntax element.
+    /// `R` is a predicate that should return true if the next
+    /// keyword is a reserved keyword.
+    /// Allows for control over trailing commas
+    ///
     /// Returns true if there is a next element
-    fn is_parse_comma_separated_end(&mut self) -> bool {
+    fn is_parse_comma_separated_end_with_trailing_commas<R>(
+        &mut self,
+        trailing_commas: bool,
+        is_reserved_keyword: &R,
+    ) -> bool
+    where
+        R: Fn(&Keyword, &mut Parser) -> bool,
+    {
         if !self.consume_token(&Token::Comma) {
             true
-        } else if self.options.trailing_commas {
-            let token = self.peek_token().token;
-            match token {
-                Token::Word(ref kw)
-                    if keywords::RESERVED_FOR_COLUMN_ALIAS.contains(&kw.keyword) =>
-                {
-                    true
-                }
+        } else if trailing_commas {
+            let token = self.next_token().token;
+            let is_end = match token {
+                Token::Word(ref kw) if is_reserved_keyword(&kw.keyword, self) => true,
                 Token::RParen | Token::SemiColon | Token::EOF | Token::RBracket | Token::RBrace => {
                     true
                 }
                 _ => false,
-            }
+            };
+            self.prev_token();
+
+            is_end
         } else {
             false
         }
     }
 
+    /// Parse the comma of a comma-separated syntax element.
+    /// Returns true if there is a next element
+    fn is_parse_comma_separated_end(&mut self) -> bool {
+        self.is_parse_comma_separated_end_with_trailing_commas(
+            self.options.trailing_commas,
+            &Self::is_reserved_for_column_alias,
+        )
+    }
+
     /// Parse a comma-separated list of 1+ items accepted by `F`
-    pub fn parse_comma_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
+    pub fn parse_comma_separated<T, F>(&mut self, f: F) -> Result<Vec<T>, ParserError>
+    where
+        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
+    {
+        self.parse_comma_separated_with_trailing_commas(
+            f,
+            self.options.trailing_commas,
+            Self::is_reserved_for_column_alias,
+        )
+    }
+
+    /// Parse a comma-separated list of 1+ items accepted by `F`.
+    /// `R` is a predicate that should return true if the next
+    /// keyword is a reserved keyword.
+    /// Allows for control over trailing commas.
+    fn parse_comma_separated_with_trailing_commas<T, F, R>(
+        &mut self,
+        mut f: F,
+        trailing_commas: bool,
+        is_reserved_keyword: R,
+    ) -> Result<Vec<T>, ParserError>
     where
         F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
+        R: Fn(&Keyword, &mut Parser) -> bool,
     {
         let mut values = vec![];
         loop {
             values.push(f(self)?);
-            if self.is_parse_comma_separated_end() {
+            if self.is_parse_comma_separated_end_with_trailing_commas(
+                trailing_commas,
+                &is_reserved_keyword,
+            ) {
+                break;
+            }
+        }
+        Ok(values)
+    }
+
+    /// Parse a period-separated list of 1+ items accepted by `F`
+    fn parse_period_separated<T, F>(&mut self, mut f: F) -> Result<Vec<T>, ParserError>
+    where
+        F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
+    {
+        let mut values = vec![];
+        loop {
+            values.push(f(self)?);
+            if !self.consume_token(&Token::Period) {
                 break;
             }
         }
@@ -3656,19 +4600,64 @@ impl<'a> Parser<'a> {
         self.parse_comma_separated(f)
     }
 
+    /// Parses 0 or more statements, each followed by a semicolon.
+    /// If the next token is any of `terminal_keywords` then no more
+    /// statements will be parsed.
+    pub(crate) fn parse_statement_list(
+        &mut self,
+        terminal_keywords: &[Keyword],
+    ) -> Result<Vec<Statement>, ParserError> {
+        let mut values = vec![];
+        loop {
+            match &self.peek_nth_token_ref(0).token {
+                Token::EOF => break,
+                Token::Word(w) => {
+                    if w.quote_style.is_none() && terminal_keywords.contains(&w.keyword) {
+                        break;
+                    }
+                }
+                _ => {}
+            }
+
+            values.push(self.parse_statement()?);
+            self.expect_token(&Token::SemiColon)?;
+        }
+        Ok(values)
+    }
+
+    /// Default implementation of a predicate that returns true if
+    /// the specified keyword is reserved for column alias.
+    /// See [Dialect::is_column_alias]
+    fn is_reserved_for_column_alias(kw: &Keyword, parser: &mut Parser) -> bool {
+        !parser.dialect.is_column_alias(kw, parser)
+    }
+
     /// Run a parser method `f`, reverting back to the current position if unsuccessful.
-    pub fn maybe_parse<T, F>(&mut self, mut f: F) -> Result<Option<T>, ParserError>
+    /// Returns `ParserError::RecursionLimitExceeded` if `f` returns a `RecursionLimitExceeded`.
+    /// Returns `Ok(None)` if `f` returns any other error.
+    pub fn maybe_parse<T, F>(&mut self, f: F) -> Result<Option<T>, ParserError>
     where
         F: FnMut(&mut Parser) -> Result<T, ParserError>,
     {
-        let index = self.index;
-        match f(self) {
+        match self.try_parse(f) {
             Ok(t) => Ok(Some(t)),
-            // Unwind stack if limit exceeded
             Err(ParserError::RecursionLimitExceeded) => Err(ParserError::RecursionLimitExceeded),
-            Err(_) => {
+            _ => Ok(None),
+        }
+    }
+
+    /// Run a parser method `f`, reverting back to the current position if unsuccessful.
+    pub fn try_parse<T, F>(&mut self, mut f: F) -> Result<T, ParserError>
+    where
+        F: FnMut(&mut Parser) -> Result<T, ParserError>,
+    {
+        let index = self.index;
+        match f(self) {
+            Ok(t) => Ok(t),
+            Err(e) => {
+                // Unwind stack if limit exceeded
                 self.index = index;
-                Ok(None)
+                Err(e)
             }
         }
     }
@@ -3676,7 +4665,7 @@ impl<'a> Parser<'a> {
     /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns [`None`] if `ALL` is parsed
     /// and results in a [`ParserError`] if both `ALL` and `DISTINCT` are found.
     pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, ParserError> {
-        let loc = self.peek_token().location;
+        let loc = self.peek_token().span.start;
         let all = self.parse_keyword(Keyword::ALL);
         let distinct = self.parse_keyword(Keyword::DISTINCT);
         if !distinct {
@@ -3720,25 +4709,30 @@ impl<'a> Parser<'a> {
             .is_some();
         let persistent = dialect_of!(self is DuckDbDialect)
             && self.parse_one_of_keywords(&[Keyword::PERSISTENT]).is_some();
+        let create_view_params = self.parse_create_view_params()?;
         if self.parse_keyword(Keyword::TABLE) {
             self.parse_create_table(or_replace, temporary, global, transient)
         } else if self.parse_keyword(Keyword::MATERIALIZED) || self.parse_keyword(Keyword::VIEW) {
             self.prev_token();
-            self.parse_create_view(or_replace, temporary)
+            self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
         } else if self.parse_keyword(Keyword::POLICY) {
             self.parse_create_policy()
         } else if self.parse_keyword(Keyword::EXTERNAL) {
             self.parse_create_external_table(or_replace)
         } else if self.parse_keyword(Keyword::FUNCTION) {
-            self.parse_create_function(or_replace, temporary)
+            self.parse_create_function(or_alter, or_replace, temporary)
+        } else if self.parse_keyword(Keyword::DOMAIN) {
+            self.parse_create_domain()
         } else if self.parse_keyword(Keyword::TRIGGER) {
-            self.parse_create_trigger(or_replace, false)
+            self.parse_create_trigger(or_alter, or_replace, false)
         } else if self.parse_keywords(&[Keyword::CONSTRAINT, Keyword::TRIGGER]) {
-            self.parse_create_trigger(or_replace, true)
+            self.parse_create_trigger(or_alter, or_replace, true)
         } else if self.parse_keyword(Keyword::MACRO) {
             self.parse_create_macro(or_replace, temporary)
         } else if self.parse_keyword(Keyword::SECRET) {
             self.parse_create_secret(or_replace, temporary, persistent)
+        } else if self.parse_keyword(Keyword::USER) {
+            self.parse_create_user(or_replace)
         } else if or_replace {
             self.expected(
                 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after CREATE OR REPLACE",
@@ -3764,11 +4758,41 @@ impl<'a> Parser<'a> {
             self.parse_create_type()
         } else if self.parse_keyword(Keyword::PROCEDURE) {
             self.parse_create_procedure(or_alter)
+        } else if self.parse_keyword(Keyword::CONNECTOR) {
+            self.parse_create_connector()
+        } else if self.parse_keyword(Keyword::SERVER) {
+            self.parse_pg_create_server()
         } else {
             self.expected("an object type after CREATE", self.peek_token())
         }
     }
 
+    fn parse_create_user(&mut self, or_replace: bool) -> Result<Statement, ParserError> {
+        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+        let name = self.parse_identifier()?;
+        let options = self.parse_key_value_options(false, &[Keyword::WITH, Keyword::TAG])?;
+        let with_tags = self.parse_keyword(Keyword::WITH);
+        let tags = if self.parse_keyword(Keyword::TAG) {
+            self.parse_key_value_options(true, &[])?
+        } else {
+            vec![]
+        };
+        Ok(Statement::CreateUser(CreateUser {
+            or_replace,
+            if_not_exists,
+            name,
+            options: KeyValueOptions {
+                options,
+                delimiter: KeyValueOptionsDelimiter::Space,
+            },
+            with_tags,
+            tags: KeyValueOptions {
+                options: tags,
+                delimiter: KeyValueOptionsDelimiter::Comma,
+            },
+        }))
+    }
+
     /// See [DuckDB Docs](https://duckdb.org/docs/sql/statements/create_secret.html) for more details.
     pub fn parse_create_secret(
         &mut self,
@@ -3782,9 +4806,9 @@ impl<'a> Parser<'a> {
         let mut name = None;
         if self.peek_token() != Token::LParen {
             if self.parse_keyword(Keyword::IN) {
-                storage_specifier = self.parse_identifier(false).ok()
+                storage_specifier = self.parse_identifier().ok()
             } else {
-                name = self.parse_identifier(false).ok();
+                name = self.parse_identifier().ok();
             }
 
             // Storage specifier may follow the name
@@ -3792,19 +4816,19 @@ impl<'a> Parser<'a> {
                 && self.peek_token() != Token::LParen
                 && self.parse_keyword(Keyword::IN)
             {
-                storage_specifier = self.parse_identifier(false).ok();
+                storage_specifier = self.parse_identifier().ok();
             }
         }
 
         self.expect_token(&Token::LParen)?;
-        self.expect_keyword(Keyword::TYPE)?;
-        let secret_type = self.parse_identifier(false)?;
+        self.expect_keyword_is(Keyword::TYPE)?;
+        let secret_type = self.parse_identifier()?;
 
         let mut options = Vec::new();
         if self.consume_token(&Token::Comma) {
             options.append(&mut self.parse_comma_separated(|p| {
-                let key = p.parse_identifier(false)?;
-                let value = p.parse_identifier(false)?;
+                let key = p.parse_identifier()?;
+                let value = p.parse_identifier()?;
                 Ok(SecretOption { key, value })
             })?);
         }
@@ -3920,7 +4944,7 @@ impl<'a> Parser<'a> {
 
     /// Parse a UNCACHE TABLE statement
     pub fn parse_uncache_table(&mut self) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TABLE)?;
+        self.expect_keyword_is(Keyword::TABLE)?;
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let table_name = self.parse_object_name(false)?;
         Ok(Statement::UNCache {
@@ -3931,11 +4955,11 @@ impl<'a> Parser<'a> {
 
     /// SQLite-specific `CREATE VIRTUAL TABLE`
     pub fn parse_create_virtual_table(&mut self) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TABLE)?;
+        self.expect_keyword_is(Keyword::TABLE)?;
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
         let table_name = self.parse_object_name(false)?;
-        self.expect_keyword(Keyword::USING)?;
-        let module_name = self.parse_identifier(false)?;
+        self.expect_keyword_is(Keyword::USING)?;
+        let module_name = self.parse_identifier()?;
         // SQLite docs note that module "arguments syntax is sufficiently
         // general that the arguments can be made to appear as column
         // definitions in a traditional CREATE TABLE statement", but
@@ -3954,24 +4978,50 @@ impl<'a> Parser<'a> {
 
         let schema_name = self.parse_schema_name()?;
 
+        let default_collate_spec = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
+            Some(self.parse_expr()?)
+        } else {
+            None
+        };
+
+        let with = if self.peek_keyword(Keyword::WITH) {
+            Some(self.parse_options(Keyword::WITH)?)
+        } else {
+            None
+        };
+
+        let options = if self.peek_keyword(Keyword::OPTIONS) {
+            Some(self.parse_options(Keyword::OPTIONS)?)
+        } else {
+            None
+        };
+
+        let clone = if self.parse_keyword(Keyword::CLONE) {
+            Some(self.parse_object_name(false)?)
+        } else {
+            None
+        };
+
         Ok(Statement::CreateSchema {
             schema_name,
             if_not_exists,
+            with,
+            options,
+            default_collate_spec,
+            clone,
         })
     }
 
     fn parse_schema_name(&mut self) -> Result<SchemaName, ParserError> {
         if self.parse_keyword(Keyword::AUTHORIZATION) {
-            Ok(SchemaName::UnnamedAuthorization(
-                self.parse_identifier(false)?,
-            ))
+            Ok(SchemaName::UnnamedAuthorization(self.parse_identifier()?))
         } else {
             let name = self.parse_object_name(false)?;
 
             if self.parse_keyword(Keyword::AUTHORIZATION) {
                 Ok(SchemaName::NamedAuthorization(
                     name,
-                    self.parse_identifier(false)?,
+                    self.parse_identifier()?,
                 ))
             } else {
                 Ok(SchemaName::Simple(name))
@@ -3993,11 +5043,33 @@ impl<'a> Parser<'a> {
                 _ => break,
             }
         }
+        let clone = if self.parse_keyword(Keyword::CLONE) {
+            Some(self.parse_object_name(false)?)
+        } else {
+            None
+        };
+
         Ok(Statement::CreateDatabase {
             db_name,
             if_not_exists: ine,
             location,
             managed_location,
+            or_replace: false,
+            transient: false,
+            clone,
+            data_retention_time_in_days: None,
+            max_data_extension_time_in_days: None,
+            external_volume: None,
+            catalog: None,
+            replace_invalid_characters: None,
+            default_ddl_collation: None,
+            storage_serialization_policy: None,
+            comment: None,
+            catalog_sync: None,
+            catalog_sync_namespace_mode: None,
+            catalog_sync_namespace_flatten_delimiter: None,
+            with_tags: None,
+            with_contacts: None,
         })
     }
 
@@ -4018,13 +5090,14 @@ impl<'a> Parser<'a> {
             Keyword::ARCHIVE => Ok(Some(CreateFunctionUsing::Archive(uri))),
             _ => self.expected(
                 "JAR, FILE or ARCHIVE, got {:?}",
-                TokenWithLocation::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
+                TokenWithSpan::wrap(Token::make_keyword(format!("{keyword:?}").as_str())),
             ),
         }
     }
 
     pub fn parse_create_function(
         &mut self,
+        or_alter: bool,
         or_replace: bool,
         temporary: bool,
     ) -> Result<Statement, ParserError> {
@@ -4036,29 +5109,30 @@ impl<'a> Parser<'a> {
             self.parse_create_macro(or_replace, temporary)
         } else if dialect_of!(self is BigQueryDialect) {
             self.parse_bigquery_create_function(or_replace, temporary)
+        } else if dialect_of!(self is MsSqlDialect) {
+            self.parse_mssql_create_function(or_alter, or_replace, temporary)
         } else {
             self.prev_token();
             self.expected("an object type after CREATE", self.peek_token())
         }
     }
 
-    /// Parse `CREATE FUNCTION` for [Postgres]
+    /// Parse `CREATE FUNCTION` for [PostgreSQL]
     ///
-    /// [Postgres]: https://www.postgresql.org/docs/15/sql-createfunction.html
+    /// [PostgreSQL]: https://www.postgresql.org/docs/15/sql-createfunction.html
     fn parse_postgres_create_function(
         &mut self,
         or_replace: bool,
         temporary: bool,
     ) -> Result<Statement, ParserError> {
         let name = self.parse_object_name(false)?;
+
         self.expect_token(&Token::LParen)?;
-        let args = if self.consume_token(&Token::RParen) {
-            self.prev_token();
-            None
+        let args = if Token::RParen != self.peek_token_ref().token {
+            self.parse_comma_separated(Parser::parse_function_arg)?
         } else {
-            Some(self.parse_comma_separated(Parser::parse_function_arg)?)
+            vec![]
         };
-
         self.expect_token(&Token::RParen)?;
 
         let return_type = if self.parse_keyword(Keyword::RETURNS) {
@@ -4092,7 +5166,7 @@ impl<'a> Parser<'a> {
                 ));
             } else if self.parse_keyword(Keyword::LANGUAGE) {
                 ensure_not_set(&body.language, "LANGUAGE")?;
-                body.language = Some(self.parse_identifier(false)?);
+                body.language = Some(self.parse_identifier()?);
             } else if self.parse_keyword(Keyword::IMMUTABLE) {
                 ensure_not_set(&body.behavior, "IMMUTABLE | STABLE | VOLATILE")?;
                 body.behavior = Some(FunctionBehavior::Immutable);
@@ -4150,11 +5224,12 @@ impl<'a> Parser<'a> {
             }
         }
 
-        Ok(Statement::CreateFunction {
+        Ok(Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace,
             temporary,
             name,
-            args,
+            args: Some(args),
             return_type,
             behavior: body.behavior,
             called_on_null: body.called_on_null,
@@ -4166,7 +5241,7 @@ impl<'a> Parser<'a> {
             determinism_specifier: None,
             options: None,
             remote_connection: None,
-        })
+        }))
     }
 
     /// Parse `CREATE FUNCTION` for [Hive]
@@ -4178,12 +5253,13 @@ impl<'a> Parser<'a> {
         temporary: bool,
     ) -> Result<Statement, ParserError> {
         let name = self.parse_object_name(false)?;
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
 
         let as_ = self.parse_create_function_body_string()?;
         let using = self.parse_optional_create_function_using()?;
 
-        Ok(Statement::CreateFunction {
+        Ok(Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace,
             temporary,
             name,
@@ -4199,7 +5275,7 @@ impl<'a> Parser<'a> {
             determinism_specifier: None,
             options: None,
             remote_connection: None,
-        })
+        }))
     }
 
     /// Parse `CREATE FUNCTION` for [BigQuery]
@@ -4211,22 +5287,7 @@ impl<'a> Parser<'a> {
         temporary: bool,
     ) -> Result<Statement, ParserError> {
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
-        let name = self.parse_object_name(false)?;
-
-        let parse_function_param =
-            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
-                let name = parser.parse_identifier(false)?;
-                let data_type = parser.parse_data_type()?;
-                Ok(OperateFunctionArg {
-                    mode: None,
-                    name: Some(name),
-                    data_type,
-                    default_expr: None,
-                })
-            };
-        self.expect_token(&Token::LParen)?;
-        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
-        self.expect_token(&Token::RParen)?;
+        let (name, args) = self.parse_create_function_name_and_params()?;
 
         let return_type = if self.parse_keyword(Keyword::RETURNS) {
             Some(self.parse_data_type()?)
@@ -4243,7 +5304,7 @@ impl<'a> Parser<'a> {
         };
 
         let language = if self.parse_keyword(Keyword::LANGUAGE) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         } else {
             None
         };
@@ -4260,7 +5321,7 @@ impl<'a> Parser<'a> {
         let mut options = self.maybe_parse_options(Keyword::OPTIONS)?;
 
         let function_body = if remote_connection.is_none() {
-            self.expect_keyword(Keyword::AS)?;
+            self.expect_keyword_is(Keyword::AS)?;
             let expr = self.parse_expr()?;
             if options.is_none() {
                 options = self.maybe_parse_options(Keyword::OPTIONS)?;
@@ -4272,7 +5333,8 @@ impl<'a> Parser<'a> {
             None
         };
 
-        Ok(Statement::CreateFunction {
+        Ok(Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace,
             temporary,
             if_not_exists,
@@ -4288,12 +5350,128 @@ impl<'a> Parser<'a> {
             behavior: None,
             called_on_null: None,
             parallel: None,
-        })
+        }))
     }
 
-    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
-        let mode = if self.parse_keyword(Keyword::IN) {
-            Some(ArgMode::In)
+    /// Parse `CREATE FUNCTION` for [MsSql]
+    ///
+    /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql
+    fn parse_mssql_create_function(
+        &mut self,
+        or_alter: bool,
+        or_replace: bool,
+        temporary: bool,
+    ) -> Result<Statement, ParserError> {
+        let (name, args) = self.parse_create_function_name_and_params()?;
+
+        self.expect_keyword(Keyword::RETURNS)?;
+
+        let return_table = self.maybe_parse(|p| {
+            let return_table_name = p.parse_identifier()?;
+
+            p.expect_keyword_is(Keyword::TABLE)?;
+            p.prev_token();
+
+            let table_column_defs = match p.parse_data_type()? {
+                DataType::Table(Some(table_column_defs)) if !table_column_defs.is_empty() => {
+                    table_column_defs
+                }
+                _ => parser_err!(
+                    "Expected table column definitions after TABLE keyword",
+                    p.peek_token().span.start
+                )?,
+            };
+
+            Ok(DataType::NamedTable {
+                name: ObjectName(vec![ObjectNamePart::Identifier(return_table_name)]),
+                columns: table_column_defs,
+            })
+        })?;
+
+        let return_type = if return_table.is_some() {
+            return_table
+        } else {
+            Some(self.parse_data_type()?)
+        };
+
+        let _ = self.parse_keyword(Keyword::AS);
+
+        let function_body = if self.peek_keyword(Keyword::BEGIN) {
+            let begin_token = self.expect_keyword(Keyword::BEGIN)?;
+            let statements = self.parse_statement_list(&[Keyword::END])?;
+            let end_token = self.expect_keyword(Keyword::END)?;
+
+            Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
+                begin_token: AttachedToken(begin_token),
+                statements,
+                end_token: AttachedToken(end_token),
+            }))
+        } else if self.parse_keyword(Keyword::RETURN) {
+            if self.peek_token() == Token::LParen {
+                Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
+            } else if self.peek_keyword(Keyword::SELECT) {
+                let select = self.parse_select()?;
+                Some(CreateFunctionBody::AsReturnSelect(select))
+            } else {
+                parser_err!(
+                    "Expected a subquery (or bare SELECT statement) after RETURN",
+                    self.peek_token().span.start
+                )?
+            }
+        } else {
+            parser_err!("Unparsable function body", self.peek_token().span.start)?
+        };
+
+        Ok(Statement::CreateFunction(CreateFunction {
+            or_alter,
+            or_replace,
+            temporary,
+            if_not_exists: false,
+            name,
+            args: Some(args),
+            return_type,
+            function_body,
+            language: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+            using: None,
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+        }))
+    }
+
+    fn parse_create_function_name_and_params(
+        &mut self,
+    ) -> Result<(ObjectName, Vec<OperateFunctionArg>), ParserError> {
+        let name = self.parse_object_name(false)?;
+        let parse_function_param =
+            |parser: &mut Parser| -> Result<OperateFunctionArg, ParserError> {
+                let name = parser.parse_identifier()?;
+                let data_type = parser.parse_data_type()?;
+                let default_expr = if parser.consume_token(&Token::Eq) {
+                    Some(parser.parse_expr()?)
+                } else {
+                    None
+                };
+
+                Ok(OperateFunctionArg {
+                    mode: None,
+                    name: Some(name),
+                    data_type,
+                    default_expr,
+                })
+            };
+        self.expect_token(&Token::LParen)?;
+        let args = self.parse_comma_separated0(parse_function_param, Token::RParen)?;
+        self.expect_token(&Token::RParen)?;
+        Ok((name, args))
+    }
+
+    fn parse_function_arg(&mut self) -> Result<OperateFunctionArg, ParserError> {
+        let mode = if self.parse_keyword(Keyword::IN) {
+            Some(ArgMode::In)
         } else if self.parse_keyword(Keyword::OUT) {
             Some(ArgMode::Out)
         } else if self.parse_keyword(Keyword::INOUT) {
@@ -4305,10 +5483,21 @@ impl<'a> Parser<'a> {
         // parse: [ argname ] argtype
         let mut name = None;
         let mut data_type = self.parse_data_type()?;
-        if let DataType::Custom(n, _) = &data_type {
-            // the first token is actually a name
-            name = Some(n.0[0].clone());
-            data_type = self.parse_data_type()?;
+
+        // To check whether the first token is a name or a type, we need to
+        // peek the next token, which if it is another type keyword, then the
+        // first token is a name and not a type in itself.
+        let data_type_idx = self.get_current_index();
+        if let Some(next_data_type) = self.maybe_parse(|parser| parser.parse_data_type())? {
+            let token = self.token_at(data_type_idx);
+
+            // We ensure that the token is a `Word` token, and not other special tokens.
+            if !matches!(token.token, Token::Word(_)) {
+                return self.expected("a name or type", token.clone());
+            }
+
+            name = Some(Ident::new(token.to_string()));
+            data_type = next_data_type;
         }
 
         let default_expr = if self.parse_keyword(Keyword::DEFAULT) || self.consume_token(&Token::Eq)
@@ -4331,14 +5520,17 @@ impl<'a> Parser<'a> {
     /// DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]
     /// ```
     pub fn parse_drop_trigger(&mut self) -> Result<Statement, ParserError> {
-        if !dialect_of!(self is PostgreSqlDialect | GenericDialect) {
+        if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect | MsSqlDialect) {
             self.prev_token();
             return self.expected("an object type after DROP", self.peek_token());
         }
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let trigger_name = self.parse_object_name(false)?;
-        self.expect_keyword(Keyword::ON)?;
-        let table_name = self.parse_object_name(false)?;
+        let table_name = if self.parse_keyword(Keyword::ON) {
+            Some(self.parse_object_name(false)?)
+        } else {
+            None
+        };
         let option = self
             .parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT])
             .map(|keyword| match keyword {
@@ -4356,10 +5548,11 @@ impl<'a> Parser<'a> {
 
     pub fn parse_create_trigger(
         &mut self,
+        or_alter: bool,
         or_replace: bool,
         is_constraint: bool,
     ) -> Result<Statement, ParserError> {
-        if !dialect_of!(self is PostgreSqlDialect | GenericDialect) {
+        if !dialect_of!(self is PostgreSqlDialect | GenericDialect | MySqlDialect | MsSqlDialect) {
             self.prev_token();
             return self.expected("an object type after CREATE", self.peek_token());
         }
@@ -4368,7 +5561,7 @@ impl<'a> Parser<'a> {
         let period = self.parse_trigger_period()?;
 
         let events = self.parse_keyword_separated(Keyword::OR, Parser::parse_trigger_event)?;
-        self.expect_keyword(Keyword::ON)?;
+        self.expect_keyword_is(Keyword::ON)?;
         let table_name = self.parse_object_name(false)?;
 
         let referenced_table_name = if self.parse_keyword(Keyword::FROM) {
@@ -4386,7 +5579,7 @@ impl<'a> Parser<'a> {
             }
         }
 
-        self.expect_keyword(Keyword::FOR)?;
+        self.expect_keyword_is(Keyword::FOR)?;
         let include_each = self.parse_keyword(Keyword::EACH);
         let trigger_object =
             match self.expect_one_of_keywords(&[Keyword::ROW, Keyword::STATEMENT])? {
@@ -4400,11 +5593,12 @@ impl<'a> Parser<'a> {
             .then(|| self.parse_expr())
             .transpose()?;
 
-        self.expect_keyword(Keyword::EXECUTE)?;
+        self.expect_keyword_is(Keyword::EXECUTE)?;
 
         let exec_body = self.parse_trigger_exec_body()?;
 
         Ok(Statement::CreateTrigger {
+            or_alter,
             or_replace,
             is_constraint,
             name,
@@ -4416,7 +5610,8 @@ impl<'a> Parser<'a> {
             trigger_object,
             include_each,
             condition,
-            exec_body,
+            exec_body: Some(exec_body),
+            statements: None,
             characteristics,
         })
     }
@@ -4424,14 +5619,16 @@ impl<'a> Parser<'a> {
     pub fn parse_trigger_period(&mut self) -> Result<TriggerPeriod, ParserError> {
         Ok(
             match self.expect_one_of_keywords(&[
+                Keyword::FOR,
                 Keyword::BEFORE,
                 Keyword::AFTER,
                 Keyword::INSTEAD,
             ])? {
+                Keyword::FOR => TriggerPeriod::For,
                 Keyword::BEFORE => TriggerPeriod::Before,
                 Keyword::AFTER => TriggerPeriod::After,
                 Keyword::INSTEAD => self
-                    .expect_keyword(Keyword::OF)
+                    .expect_keyword_is(Keyword::OF)
                     .map(|_| TriggerPeriod::InsteadOf)?,
                 _ => unreachable!(),
             },
@@ -4449,9 +5646,7 @@ impl<'a> Parser<'a> {
                 Keyword::INSERT => TriggerEvent::Insert,
                 Keyword::UPDATE => {
                     if self.parse_keyword(Keyword::OF) {
-                        let cols = self.parse_comma_separated(|ident| {
-                            Parser::parse_identifier(ident, false)
-                        })?;
+                        let cols = self.parse_comma_separated(Parser::parse_identifier)?;
                         TriggerEvent::Update(cols)
                     } else {
                         TriggerEvent::Update(vec![])
@@ -4515,7 +5710,7 @@ impl<'a> Parser<'a> {
             };
 
             self.expect_token(&Token::RParen)?;
-            self.expect_keyword(Keyword::AS)?;
+            self.expect_keyword_is(Keyword::AS)?;
 
             Ok(Statement::CreateMacro {
                 or_replace,
@@ -4535,7 +5730,7 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_macro_arg(&mut self) -> Result<MacroArg, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let default_expr =
             if self.consume_token(&Token::Assignment) || self.consume_token(&Token::RArrow) {
@@ -4550,7 +5745,7 @@ impl<'a> Parser<'a> {
         &mut self,
         or_replace: bool,
     ) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TABLE)?;
+        self.expect_keyword_is(Keyword::TABLE)?;
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
         let table_name = self.parse_object_name(false)?;
         let (columns, constraints) = self.parse_columns()?;
@@ -4568,12 +5763,17 @@ impl<'a> Parser<'a> {
         };
         let location = hive_formats.location.clone();
         let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
+        let table_options = if !table_properties.is_empty() {
+            CreateTableOptions::TableProperties(table_properties)
+        } else {
+            CreateTableOptions::None
+        };
         Ok(CreateTableBuilder::new(table_name)
             .columns(columns)
             .constraints(constraints)
             .hive_distribution(hive_distribution)
             .hive_formats(Some(hive_formats))
-            .table_properties(table_properties)
+            .table_options(table_options)
             .or_replace(or_replace)
             .if_not_exists(if_not_exists)
             .external(true)
@@ -4599,6 +5799,14 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn parse_analyze_format_kind(&mut self) -> Result<AnalyzeFormatKind, ParserError> {
+        if self.consume_token(&Token::Eq) {
+            Ok(AnalyzeFormatKind::Assignment(self.parse_analyze_format()?))
+        } else {
+            Ok(AnalyzeFormatKind::Keyword(self.parse_analyze_format()?))
+        }
+    }
+
     pub fn parse_analyze_format(&mut self) -> Result<AnalyzeFormat, ParserError> {
         let next_token = self.next_token();
         match &next_token.token {
@@ -4614,17 +5822,24 @@ impl<'a> Parser<'a> {
 
     pub fn parse_create_view(
         &mut self,
+        or_alter: bool,
         or_replace: bool,
         temporary: bool,
+        create_view_params: Option<CreateViewParams>,
     ) -> Result<Statement, ParserError> {
         let materialized = self.parse_keyword(Keyword::MATERIALIZED);
-        self.expect_keyword(Keyword::VIEW)?;
-        let if_not_exists = dialect_of!(self is BigQueryDialect|SQLiteDialect|GenericDialect)
+        self.expect_keyword_is(Keyword::VIEW)?;
+        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
+        // Tries to parse IF NOT EXISTS either before name or after name
+        // Name before IF NOT EXISTS is supported by snowflake but undocumented
+        let if_not_exists_first =
+            self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+        let name = self.parse_object_name(allow_unquoted_hyphen)?;
+        let name_before_not_exists = !if_not_exists_first
             && self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+        let if_not_exists = if_not_exists_first || name_before_not_exists;
         // Many dialects support `OR ALTER` right after `CREATE`, but we don't (yet).
         // ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
-        let allow_unquoted_hyphen = dialect_of!(self is BigQueryDialect);
-        let name = self.parse_object_name(allow_unquoted_hyphen)?;
         let columns = self.parse_view_columns()?;
         let mut options = CreateTableOptions::None;
         let with_options = self.parse_options(Keyword::WITH)?;
@@ -4633,7 +5848,7 @@ impl<'a> Parser<'a> {
         }
 
         let cluster_by = if self.parse_keyword(Keyword::CLUSTER) {
-            self.expect_keyword(Keyword::BY)?;
+            self.expect_keyword_is(Keyword::BY)?;
             self.parse_parenthesized_column_list(Optional, false)?
         } else {
             vec![]
@@ -4659,16 +5874,12 @@ impl<'a> Parser<'a> {
             && self.parse_keyword(Keyword::COMMENT)
         {
             self.expect_token(&Token::Eq)?;
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::SingleQuotedString(str) => Some(str),
-                _ => self.expected("string literal", next_token)?,
-            }
+            Some(self.parse_comment_value()?)
         } else {
             None
         };
 
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
         let query = self.parse_query()?;
         // Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
 
@@ -4681,6 +5892,7 @@ impl<'a> Parser<'a> {
             ]);
 
         Ok(Statement::CreateView {
+            or_alter,
             name,
             columns,
             query,
@@ -4693,9 +5905,69 @@ impl<'a> Parser<'a> {
             if_not_exists,
             temporary,
             to,
+            params: create_view_params,
+            name_before_not_exists,
         })
     }
 
+    /// Parse optional parameters for the `CREATE VIEW` statement supported by [MySQL].
+    ///
+    /// [MySQL]: https://dev.mysql.com/doc/refman/9.1/en/create-view.html
+    fn parse_create_view_params(&mut self) -> Result<Option<CreateViewParams>, ParserError> {
+        let algorithm = if self.parse_keyword(Keyword::ALGORITHM) {
+            self.expect_token(&Token::Eq)?;
+            Some(
+                match self.expect_one_of_keywords(&[
+                    Keyword::UNDEFINED,
+                    Keyword::MERGE,
+                    Keyword::TEMPTABLE,
+                ])? {
+                    Keyword::UNDEFINED => CreateViewAlgorithm::Undefined,
+                    Keyword::MERGE => CreateViewAlgorithm::Merge,
+                    Keyword::TEMPTABLE => CreateViewAlgorithm::TempTable,
+                    _ => {
+                        self.prev_token();
+                        let found = self.next_token();
+                        return self
+                            .expected("UNDEFINED or MERGE or TEMPTABLE after ALGORITHM =", found);
+                    }
+                },
+            )
+        } else {
+            None
+        };
+        let definer = if self.parse_keyword(Keyword::DEFINER) {
+            self.expect_token(&Token::Eq)?;
+            Some(self.parse_grantee_name()?)
+        } else {
+            None
+        };
+        let security = if self.parse_keywords(&[Keyword::SQL, Keyword::SECURITY]) {
+            Some(
+                match self.expect_one_of_keywords(&[Keyword::DEFINER, Keyword::INVOKER])? {
+                    Keyword::DEFINER => CreateViewSecurity::Definer,
+                    Keyword::INVOKER => CreateViewSecurity::Invoker,
+                    _ => {
+                        self.prev_token();
+                        let found = self.next_token();
+                        return self.expected("DEFINER or INVOKER after SQL SECURITY", found);
+                    }
+                },
+            )
+        } else {
+            None
+        };
+        if algorithm.is_some() || definer.is_some() || security.is_some() {
+            Ok(Some(CreateViewParams {
+                algorithm,
+                definer,
+                security,
+            }))
+        } else {
+            Ok(None)
+        }
+    }
+
     pub fn parse_create_role(&mut self) -> Result<Statement, ParserError> {
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
         let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
@@ -4755,7 +6027,7 @@ impl<'a> Parser<'a> {
             let loc = self
                 .tokens
                 .get(self.index - 1)
-                .map_or(Location { line: 0, column: 0 }, |t| t.location);
+                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
             match keyword {
                 Keyword::AUTHORIZATION => {
                     if authorization_owner.is_some() {
@@ -4834,7 +6106,7 @@ impl<'a> Parser<'a> {
                     }
                 }
                 Keyword::CONNECTION => {
-                    self.expect_keyword(Keyword::LIMIT)?;
+                    self.expect_keyword_is(Keyword::LIMIT)?;
                     if connection_limit.is_some() {
                         parser_err!("Found multiple CONNECTION LIMIT", loc)
                     } else {
@@ -4843,7 +6115,7 @@ impl<'a> Parser<'a> {
                     }
                 }
                 Keyword::VALID => {
-                    self.expect_keyword(Keyword::UNTIL)?;
+                    self.expect_keyword_is(Keyword::UNTIL)?;
                     if valid_until.is_some() {
                         parser_err!("Found multiple VALID UNTIL", loc)
                     } else {
@@ -4856,14 +6128,14 @@ impl<'a> Parser<'a> {
                         if !in_role.is_empty() {
                             parser_err!("Found multiple IN ROLE", loc)
                         } else {
-                            in_role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                            in_role = self.parse_comma_separated(|p| p.parse_identifier())?;
                             Ok(())
                         }
                     } else if self.parse_keyword(Keyword::GROUP) {
                         if !in_group.is_empty() {
                             parser_err!("Found multiple IN GROUP", loc)
                         } else {
-                            in_group = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                            in_group = self.parse_comma_separated(|p| p.parse_identifier())?;
                             Ok(())
                         }
                     } else {
@@ -4874,7 +6146,7 @@ impl<'a> Parser<'a> {
                     if !role.is_empty() {
                         parser_err!("Found multiple ROLE", loc)
                     } else {
-                        role = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                        role = self.parse_comma_separated(|p| p.parse_identifier())?;
                         Ok(())
                     }
                 }
@@ -4882,7 +6154,7 @@ impl<'a> Parser<'a> {
                     if !user.is_empty() {
                         parser_err!("Found multiple USER", loc)
                     } else {
-                        user = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                        user = self.parse_comma_separated(|p| p.parse_identifier())?;
                         Ok(())
                     }
                 }
@@ -4890,7 +6162,7 @@ impl<'a> Parser<'a> {
                     if !admin.is_empty() {
                         parser_err!("Found multiple ADMIN", loc)
                     } else {
-                        admin = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                        admin = self.parse_comma_separated(|p| p.parse_identifier())?;
                         Ok(())
                     }
                 }
@@ -4927,17 +6199,46 @@ impl<'a> Parser<'a> {
             Some(Keyword::SESSION_USER) => Owner::SessionUser,
             Some(_) => unreachable!(),
             None => {
-                match self.parse_identifier(false) {
+                match self.parse_identifier() {
                     Ok(ident) => Owner::Ident(ident),
                     Err(e) => {
                         return Err(ParserError::ParserError(format!("Expected: CURRENT_USER, CURRENT_ROLE, SESSION_USER or identifier after OWNER TO. {e}")))
                     }
                 }
-            },
+            }
         };
         Ok(owner)
     }
 
+    /// Parses a [Statement::CreateDomain] statement.
+    fn parse_create_domain(&mut self) -> Result<Statement, ParserError> {
+        let name = self.parse_object_name(false)?;
+        self.expect_keyword_is(Keyword::AS)?;
+        let data_type = self.parse_data_type()?;
+        let collation = if self.parse_keyword(Keyword::COLLATE) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+        let default = if self.parse_keyword(Keyword::DEFAULT) {
+            Some(self.parse_expr()?)
+        } else {
+            None
+        };
+        let mut constraints = Vec::new();
+        while let Some(constraint) = self.parse_optional_table_constraint()? {
+            constraints.push(constraint);
+        }
+
+        Ok(Statement::CreateDomain(CreateDomain {
+            name,
+            data_type,
+            collation,
+            default,
+            constraints,
+        }))
+    }
+
     /// ```sql
     ///     CREATE POLICY name ON table_name [ AS { PERMISSIVE | RESTRICTIVE } ]
     ///     [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]
@@ -4948,8 +6249,8 @@ impl<'a> Parser<'a> {
     ///
     /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-createpolicy.html)
     pub fn parse_create_policy(&mut self) -> Result<Statement, ParserError> {
-        let name = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::ON)?;
+        let name = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::ON)?;
         let table_name = self.parse_object_name(false)?;
 
         let policy_type = if self.parse_keyword(Keyword::AS) {
@@ -5019,6 +6320,49 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// ```sql
+    /// CREATE CONNECTOR [IF NOT EXISTS] connector_name
+    /// [TYPE datasource_type]
+    /// [URL datasource_url]
+    /// [COMMENT connector_comment]
+    /// [WITH DCPROPERTIES(property_name=property_value, ...)]
+    /// ```
+    ///
+    /// [Hive Documentation](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-CreateDataConnectorCreateConnector)
+    pub fn parse_create_connector(&mut self) -> Result<Statement, ParserError> {
+        let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+        let name = self.parse_identifier()?;
+
+        let connector_type = if self.parse_keyword(Keyword::TYPE) {
+            Some(self.parse_literal_string()?)
+        } else {
+            None
+        };
+
+        let url = if self.parse_keyword(Keyword::URL) {
+            Some(self.parse_literal_string()?)
+        } else {
+            None
+        };
+
+        let comment = self.parse_optional_inline_comment()?;
+
+        let with_dcproperties =
+            match self.parse_options_with_keywords(&[Keyword::WITH, Keyword::DCPROPERTIES])? {
+                properties if !properties.is_empty() => Some(properties),
+                _ => None,
+            };
+
+        Ok(Statement::CreateConnector(CreateConnector {
+            name,
+            if_not_exists,
+            connector_type,
+            url,
+            comment,
+            with_dcproperties,
+        }))
+    }
+
     pub fn parse_drop(&mut self) -> Result<Statement, ParserError> {
         // MySQL dialect supports `TEMPORARY`
         let temporary = dialect_of!(self is MySqlDialect | GenericDialect | DuckDbDialect)
@@ -5030,6 +6374,8 @@ impl<'a> Parser<'a> {
             ObjectType::Table
         } else if self.parse_keyword(Keyword::VIEW) {
             ObjectType::View
+        } else if self.parse_keywords(&[Keyword::MATERIALIZED, Keyword::VIEW]) {
+            ObjectType::MaterializedView
         } else if self.parse_keyword(Keyword::INDEX) {
             ObjectType::Index
         } else if self.parse_keyword(Keyword::ROLE) {
@@ -5044,19 +6390,29 @@ impl<'a> Parser<'a> {
             ObjectType::Stage
         } else if self.parse_keyword(Keyword::TYPE) {
             ObjectType::Type
+        } else if self.parse_keyword(Keyword::USER) {
+            ObjectType::User
+        } else if self.parse_keyword(Keyword::STREAM) {
+            ObjectType::Stream
         } else if self.parse_keyword(Keyword::FUNCTION) {
             return self.parse_drop_function();
         } else if self.parse_keyword(Keyword::POLICY) {
             return self.parse_drop_policy();
+        } else if self.parse_keyword(Keyword::CONNECTOR) {
+            return self.parse_drop_connector();
+        } else if self.parse_keyword(Keyword::DOMAIN) {
+            return self.parse_drop_domain();
         } else if self.parse_keyword(Keyword::PROCEDURE) {
             return self.parse_drop_procedure();
         } else if self.parse_keyword(Keyword::SECRET) {
             return self.parse_drop_secret(temporary, persistent);
         } else if self.parse_keyword(Keyword::TRIGGER) {
             return self.parse_drop_trigger();
+        } else if self.parse_keyword(Keyword::EXTENSION) {
+            return self.parse_drop_extension();
         } else {
             return self.expected(
-                "TABLE, VIEW, INDEX, ROLE, SCHEMA, DATABASE, FUNCTION, PROCEDURE, STAGE, TRIGGER, SECRET, SEQUENCE, or TYPE after DROP",
+                "CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, VIEW, MATERIALIZED VIEW or USER after DROP",
                 self.peek_token(),
             );
         };
@@ -5065,7 +6421,7 @@ impl<'a> Parser<'a> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let names = self.parse_comma_separated(|p| p.parse_object_name(false))?;
 
-        let loc = self.peek_token().location;
+        let loc = self.peek_token().span.start;
         let cascade = self.parse_keyword(Keyword::CASCADE);
         let restrict = self.parse_keyword(Keyword::RESTRICT);
         let purge = self.parse_keyword(Keyword::PURGE);
@@ -5078,6 +6434,11 @@ impl<'a> Parser<'a> {
                 loc
             );
         }
+        let table = if self.parse_keyword(Keyword::ON) {
+            Some(self.parse_object_name(false)?)
+        } else {
+            None
+        };
         Ok(Statement::Drop {
             object_type,
             if_exists,
@@ -5086,13 +6447,14 @@ impl<'a> Parser<'a> {
             restrict,
             purge,
             temporary,
+            table,
         })
     }
 
-    fn parse_optional_referential_action(&mut self) -> Option<ReferentialAction> {
+    fn parse_optional_drop_behavior(&mut self) -> Option<DropBehavior> {
         match self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]) {
-            Some(Keyword::CASCADE) => Some(ReferentialAction::Cascade),
-            Some(Keyword::RESTRICT) => Some(ReferentialAction::Restrict),
+            Some(Keyword::CASCADE) => Some(DropBehavior::Cascade),
+            Some(Keyword::RESTRICT) => Some(DropBehavior::Restrict),
             _ => None,
         }
     }
@@ -5104,11 +6466,11 @@ impl<'a> Parser<'a> {
     fn parse_drop_function(&mut self) -> Result<Statement, ParserError> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let func_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
-        let option = self.parse_optional_referential_action();
+        let drop_behavior = self.parse_optional_drop_behavior();
         Ok(Statement::DropFunction {
             if_exists,
             func_desc,
-            option,
+            drop_behavior,
         })
     }
 
@@ -5119,17 +6481,41 @@ impl<'a> Parser<'a> {
     /// [PostgreSQL Documentation](https://www.postgresql.org/docs/current/sql-droppolicy.html)
     fn parse_drop_policy(&mut self) -> Result<Statement, ParserError> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-        let name = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::ON)?;
+        let name = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::ON)?;
         let table_name = self.parse_object_name(false)?;
-        let option = self.parse_optional_referential_action();
+        let drop_behavior = self.parse_optional_drop_behavior();
         Ok(Statement::DropPolicy {
             if_exists,
             name,
             table_name,
-            option,
+            drop_behavior,
         })
     }
+    /// ```sql
+    /// DROP CONNECTOR [IF EXISTS] name
+    /// ```
+    ///
+    /// See [Hive](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=27362034#LanguageManualDDL-DropConnector)
+    fn parse_drop_connector(&mut self) -> Result<Statement, ParserError> {
+        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
+        let name = self.parse_identifier()?;
+        Ok(Statement::DropConnector { if_exists, name })
+    }
+
+    /// ```sql
+    /// DROP DOMAIN [ IF EXISTS ] name [ CASCADE | RESTRICT ]
+    /// ```
+    fn parse_drop_domain(&mut self) -> Result<Statement, ParserError> {
+        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
+        let name = self.parse_object_name(false)?;
+        let drop_behavior = self.parse_optional_drop_behavior();
+        Ok(Statement::DropDomain(DropDomain {
+            if_exists,
+            name,
+            drop_behavior,
+        }))
+    }
 
     /// ```sql
     /// DROP PROCEDURE [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
@@ -5138,11 +6524,11 @@ impl<'a> Parser<'a> {
     fn parse_drop_procedure(&mut self) -> Result<Statement, ParserError> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let proc_desc = self.parse_comma_separated(Parser::parse_function_desc)?;
-        let option = self.parse_optional_referential_action();
+        let drop_behavior = self.parse_optional_drop_behavior();
         Ok(Statement::DropProcedure {
             if_exists,
             proc_desc,
-            option,
+            drop_behavior,
         })
     }
 
@@ -5171,9 +6557,9 @@ impl<'a> Parser<'a> {
         persistent: bool,
     ) -> Result<Statement, ParserError> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         let storage_specifier = if self.parse_keyword(Keyword::FROM) {
-            self.parse_identifier(false).ok()
+            self.parse_identifier().ok()
         } else {
             None
         };
@@ -5212,7 +6598,7 @@ impl<'a> Parser<'a> {
             return self.parse_mssql_declare();
         }
 
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let binary = Some(self.parse_keyword(Keyword::BINARY));
         let sensitive = if self.parse_keyword(Keyword::INSENSITIVE) {
@@ -5230,12 +6616,12 @@ impl<'a> Parser<'a> {
             None
         };
 
-        self.expect_keyword(Keyword::CURSOR)?;
+        self.expect_keyword_is(Keyword::CURSOR)?;
         let declare_type = Some(DeclareType::Cursor);
 
         let hold = match self.parse_one_of_keywords(&[Keyword::WITH, Keyword::WITHOUT]) {
             Some(keyword) => {
-                self.expect_keyword(Keyword::HOLD)?;
+                self.expect_keyword_is(Keyword::HOLD)?;
 
                 match keyword {
                     Keyword::WITH => Some(true),
@@ -5246,7 +6632,7 @@ impl<'a> Parser<'a> {
             None => None,
         };
 
-        self.expect_keyword(Keyword::FOR)?;
+        self.expect_keyword_is(Keyword::FOR)?;
 
         let query = Some(self.parse_query()?);
 
@@ -5273,7 +6659,7 @@ impl<'a> Parser<'a> {
     /// ```
     /// [BigQuery]: https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#declare
     pub fn parse_big_query_declare(&mut self) -> Result<Statement, ParserError> {
-        let names = self.parse_comma_separated(|parser| Parser::parse_identifier(parser, false))?;
+        let names = self.parse_comma_separated(Parser::parse_identifier)?;
 
         let data_type = match self.peek_token().token {
             Token::Word(w) if w.keyword == Keyword::DEFAULT => None,
@@ -5289,7 +6675,7 @@ impl<'a> Parser<'a> {
         } else {
             // If no variable type - default expression must be specified, per BQ docs.
             // i.e `DECLARE foo;` is invalid.
-            self.expect_keyword(Keyword::DEFAULT)?;
+            self.expect_keyword_is(Keyword::DEFAULT)?;
             Some(self.parse_expr()?)
         };
 
@@ -5335,10 +6721,10 @@ impl<'a> Parser<'a> {
     pub fn parse_snowflake_declare(&mut self) -> Result<Statement, ParserError> {
         let mut stmts = vec![];
         loop {
-            let name = self.parse_identifier(false)?;
+            let name = self.parse_identifier()?;
             let (declare_type, for_query, assigned_expr, data_type) =
                 if self.parse_keyword(Keyword::CURSOR) {
-                    self.expect_keyword(Keyword::FOR)?;
+                    self.expect_keyword_is(Keyword::FOR)?;
                     match self.peek_token().token {
                         Token::Word(w) if w.keyword == Keyword::SELECT => (
                             Some(DeclareType::Cursor),
@@ -5431,7 +6817,7 @@ impl<'a> Parser<'a> {
     /// DECLARE
     // {
     //   { @local_variable [AS] data_type [ = value ] }
-    //   | { @cursor_variable_name CURSOR }
+    //   | { @cursor_variable_name CURSOR [ FOR ] }
     // } [ ,...n ]
     /// ```
     /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
@@ -5447,14 +6833,19 @@ impl<'a> Parser<'a> {
     /// ```text
     // {
     //   { @local_variable [AS] data_type [ = value ] }
-    //   | { @cursor_variable_name CURSOR }
+    //   | { @cursor_variable_name CURSOR [ FOR ]}
     // } [ ,...n ]
     /// ```
     /// [MsSql]: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/declare-local-variable-transact-sql?view=sql-server-ver16
     pub fn parse_mssql_declare_stmt(&mut self) -> Result<Declare, ParserError> {
         let name = {
-            let ident = self.parse_identifier(false)?;
-            if !ident.value.starts_with('@') {
+            let ident = self.parse_identifier()?;
+            if !ident.value.starts_with('@')
+                && !matches!(
+                    self.peek_token().token,
+                    Token::Word(w) if w.keyword == Keyword::CURSOR
+                )
+            {
                 Err(ParserError::TokenizerError(
                     "Invalid MsSql variable declaration.".to_string(),
                 ))
@@ -5478,7 +6869,14 @@ impl<'a> Parser<'a> {
             _ => (None, Some(self.parse_data_type()?)),
         };
 
-        let assignment = self.parse_mssql_variable_declaration_expression()?;
+        let (for_query, assignment) = if self.peek_keyword(Keyword::FOR) {
+            self.next_token();
+            let query = Some(self.parse_query()?);
+            (query, None)
+        } else {
+            let assignment = self.parse_mssql_variable_declaration_expression()?;
+            (None, assignment)
+        };
 
         Ok(Declare {
             names: vec![name],
@@ -5489,7 +6887,7 @@ impl<'a> Parser<'a> {
             sensitive: None,
             scroll: None,
             hold: None,
-            for_query: None,
+            for_query,
         })
     }
 
@@ -5550,11 +6948,11 @@ impl<'a> Parser<'a> {
             FetchDirection::Last
         } else if self.parse_keyword(Keyword::ABSOLUTE) {
             FetchDirection::Absolute {
-                limit: self.parse_number_value()?,
+                limit: self.parse_number_value()?.value,
             }
         } else if self.parse_keyword(Keyword::RELATIVE) {
             FetchDirection::Relative {
-                limit: self.parse_number_value()?,
+                limit: self.parse_number_value()?.value,
             }
         } else if self.parse_keyword(Keyword::FORWARD) {
             if self.parse_keyword(Keyword::ALL) {
@@ -5562,7 +6960,7 @@ impl<'a> Parser<'a> {
             } else {
                 FetchDirection::Forward {
                     // TODO: Support optional
-                    limit: Some(self.parse_number_value()?),
+                    limit: Some(self.parse_number_value()?.value),
                 }
             }
         } else if self.parse_keyword(Keyword::BACKWARD) {
@@ -5571,20 +6969,28 @@ impl<'a> Parser<'a> {
             } else {
                 FetchDirection::Backward {
                     // TODO: Support optional
-                    limit: Some(self.parse_number_value()?),
+                    limit: Some(self.parse_number_value()?.value),
                 }
             }
         } else if self.parse_keyword(Keyword::ALL) {
             FetchDirection::All
         } else {
             FetchDirection::Count {
-                limit: self.parse_number_value()?,
+                limit: self.parse_number_value()?.value,
             }
         };
 
-        self.expect_one_of_keywords(&[Keyword::FROM, Keyword::IN])?;
+        let position = if self.peek_keyword(Keyword::FROM) {
+            self.expect_keyword(Keyword::FROM)?;
+            FetchPosition::From
+        } else if self.peek_keyword(Keyword::IN) {
+            self.expect_keyword(Keyword::IN)?;
+            FetchPosition::In
+        } else {
+            return parser_err!("Expected FROM or IN", self.peek_token().span.start);
+        };
 
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let into = if self.parse_keyword(Keyword::INTO) {
             Some(self.parse_object_name(false)?)
@@ -5595,6 +7001,7 @@ impl<'a> Parser<'a> {
         Ok(Statement::Fetch {
             name,
             direction,
+            position,
             into,
         })
     }
@@ -5622,24 +7029,23 @@ impl<'a> Parser<'a> {
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
         let index_name = if if_not_exists || !self.parse_keyword(Keyword::ON) {
             let index_name = self.parse_object_name(false)?;
-            self.expect_keyword(Keyword::ON)?;
+            self.expect_keyword_is(Keyword::ON)?;
             Some(index_name)
         } else {
             None
         };
         let table_name = self.parse_object_name(false)?;
         let using = if self.parse_keyword(Keyword::USING) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_index_type()?)
         } else {
             None
         };
-        self.expect_token(&Token::LParen)?;
-        let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
-        self.expect_token(&Token::RParen)?;
+
+        let columns = self.parse_parenthesized_index_column_list()?;
 
         let include = if self.parse_keyword(Keyword::INCLUDE) {
             self.expect_token(&Token::LParen)?;
-            let columns = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+            let columns = self.parse_comma_separated(|p| p.parse_identifier())?;
             self.expect_token(&Token::RParen)?;
             columns
         } else {
@@ -5648,7 +7054,7 @@ impl<'a> Parser<'a> {
 
         let nulls_distinct = if self.parse_keyword(Keyword::NULLS) {
             let not = self.parse_keyword(Keyword::NOT);
-            self.expect_keyword(Keyword::DISTINCT)?;
+            self.expect_keyword_is(Keyword::DISTINCT)?;
             Some(!not)
         } else {
             None
@@ -5688,17 +7094,17 @@ impl<'a> Parser<'a> {
 
     pub fn parse_create_extension(&mut self) -> Result<Statement, ParserError> {
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let (schema, version, cascade) = if self.parse_keyword(Keyword::WITH) {
             let schema = if self.parse_keyword(Keyword::SCHEMA) {
-                Some(self.parse_identifier(false)?)
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
 
             let version = if self.parse_keyword(Keyword::VERSION) {
-                Some(self.parse_identifier(false)?)
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
@@ -5719,6 +7125,25 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// Parse a PostgreSQL-specific [Statement::DropExtension] statement.
+    pub fn parse_drop_extension(&mut self) -> Result<Statement, ParserError> {
+        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
+        let names = self.parse_comma_separated(|p| p.parse_identifier())?;
+        let cascade_or_restrict =
+            self.parse_one_of_keywords(&[Keyword::CASCADE, Keyword::RESTRICT]);
+        Ok(Statement::DropExtension {
+            names,
+            if_exists,
+            cascade_or_restrict: cascade_or_restrict
+                .map(|k| match k {
+                    Keyword::CASCADE => Ok(ReferentialAction::Cascade),
+                    Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
+                    _ => self.expected("CASCADE or RESTRICT", self.peek_token()),
+                })
+                .transpose()?,
+        })
+    }
+
     //TODO: Implement parsing for Skewed
     pub fn parse_hive_distribution(&mut self) -> Result<HiveDistributionStyle, ParserError> {
         if self.parse_keywords(&[Keyword::PARTITIONED, Keyword::BY]) {
@@ -5744,10 +7169,10 @@ impl<'a> Parser<'a> {
                     hive_format.row_format = Some(self.parse_row_format()?);
                 }
                 Some(Keyword::STORED) => {
-                    self.expect_keyword(Keyword::AS)?;
+                    self.expect_keyword_is(Keyword::AS)?;
                     if self.parse_keyword(Keyword::INPUTFORMAT) {
                         let input_format = self.parse_expr()?;
-                        self.expect_keyword(Keyword::OUTPUTFORMAT)?;
+                        self.expect_keyword_is(Keyword::OUTPUTFORMAT)?;
                         let output_format = self.parse_expr()?;
                         hive_format.storage = Some(HiveIOFormat::IOF {
                             input_format,
@@ -5780,7 +7205,7 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_row_format(&mut self) -> Result<HiveRowFormat, ParserError> {
-        self.expect_keyword(Keyword::FORMAT)?;
+        self.expect_keyword_is(Keyword::FORMAT)?;
         match self.parse_one_of_keywords(&[Keyword::SERDE, Keyword::DELIMITED]) {
             Some(Keyword::SERDE) => {
                 let class = self.parse_literal_string()?;
@@ -5801,13 +7226,13 @@ impl<'a> Parser<'a> {
                             if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) {
                                 row_delimiters.push(HiveRowDelimiter {
                                     delimiter: HiveDelimiter::FieldsTerminatedBy,
-                                    char: self.parse_identifier(false)?,
+                                    char: self.parse_identifier()?,
                                 });
 
                                 if self.parse_keywords(&[Keyword::ESCAPED, Keyword::BY]) {
                                     row_delimiters.push(HiveRowDelimiter {
                                         delimiter: HiveDelimiter::FieldsEscapedBy,
-                                        char: self.parse_identifier(false)?,
+                                        char: self.parse_identifier()?,
                                     });
                                 }
                             } else {
@@ -5822,7 +7247,7 @@ impl<'a> Parser<'a> {
                             ]) {
                                 row_delimiters.push(HiveRowDelimiter {
                                     delimiter: HiveDelimiter::CollectionItemsTerminatedBy,
-                                    char: self.parse_identifier(false)?,
+                                    char: self.parse_identifier()?,
                                 });
                             } else {
                                 break;
@@ -5836,7 +7261,7 @@ impl<'a> Parser<'a> {
                             ]) {
                                 row_delimiters.push(HiveRowDelimiter {
                                     delimiter: HiveDelimiter::MapKeysTerminatedBy,
-                                    char: self.parse_identifier(false)?,
+                                    char: self.parse_identifier()?,
                                 });
                             } else {
                                 break;
@@ -5846,7 +7271,7 @@ impl<'a> Parser<'a> {
                             if self.parse_keywords(&[Keyword::TERMINATED, Keyword::BY]) {
                                 row_delimiters.push(HiveRowDelimiter {
                                     delimiter: HiveDelimiter::LinesTerminatedBy,
-                                    char: self.parse_identifier(false)?,
+                                    char: self.parse_identifier()?,
                                 });
                             } else {
                                 break;
@@ -5856,7 +7281,7 @@ impl<'a> Parser<'a> {
                             if self.parse_keywords(&[Keyword::DEFINED, Keyword::AS]) {
                                 row_delimiters.push(HiveRowDelimiter {
                                     delimiter: HiveDelimiter::NullDefinedAs,
-                                    char: self.parse_identifier(false)?,
+                                    char: self.parse_identifier()?,
                                 });
                             } else {
                                 break;
@@ -5877,7 +7302,7 @@ impl<'a> Parser<'a> {
 
     fn parse_optional_on_cluster(&mut self) -> Result<Option<Ident>, ParserError> {
         if self.parse_keywords(&[Keyword::ON, Keyword::CLUSTER]) {
-            Ok(Some(self.parse_identifier(false)?))
+            Ok(Some(self.parse_identifier()?))
         } else {
             Ok(None)
         }
@@ -5911,17 +7336,16 @@ impl<'a> Parser<'a> {
 
         // parse optional column list (schema)
         let (columns, constraints) = self.parse_columns()?;
-        let mut comment = if dialect_of!(self is HiveDialect)
-            && self.parse_keyword(Keyword::COMMENT)
-        {
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::SingleQuotedString(str) => Some(CommentDef::AfterColumnDefsWithoutEq(str)),
-                _ => self.expected("comment", next_token)?,
-            }
-        } else {
-            None
-        };
+        let comment_after_column_def =
+            if dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
+                let next_token = self.next_token();
+                match next_token.token {
+                    Token::SingleQuotedString(str) => Some(CommentDef::WithoutEq(str)),
+                    _ => self.expected("comment", next_token)?,
+                }
+            } else {
+                None
+            };
 
         // SQLite supports `WITHOUT ROWID` at the end of `CREATE TABLE`
         let without_rowid = self.parse_keywords(&[Keyword::WITHOUT, Keyword::ROWID]);
@@ -5929,39 +7353,8 @@ impl<'a> Parser<'a> {
         let hive_distribution = self.parse_hive_distribution()?;
         let clustered_by = self.parse_optional_clustered_by()?;
         let hive_formats = self.parse_hive_formats()?;
-        // PostgreSQL supports `WITH ( options )`, before `AS`
-        let with_options = self.parse_options(Keyword::WITH)?;
-        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
-
-        let engine = if self.parse_keyword(Keyword::ENGINE) {
-            self.expect_token(&Token::Eq)?;
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::Word(w) => {
-                    let name = w.value;
-                    let parameters = if self.peek_token() == Token::LParen {
-                        Some(self.parse_parenthesized_identifiers()?)
-                    } else {
-                        None
-                    };
-                    Some(TableEngine { name, parameters })
-                }
-                _ => self.expected("identifier", next_token)?,
-            }
-        } else {
-            None
-        };
 
-        let auto_increment_offset = if self.parse_keyword(Keyword::AUTO_INCREMENT) {
-            let _ = self.consume_token(&Token::Eq);
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::Number(s, _) => Some(Self::parse::<u32>(s, next_token.location)?),
-                _ => self.expected("literal int", next_token)?,
-            }
-        } else {
-            None
-        };
+        let create_table_config = self.parse_optional_create_table_config()?;
 
         // ClickHouse supports `PRIMARY KEY`, before `ORDER BY`
         // https://clickhouse.com/docs/en/sql-reference/statements/create/table#primary-key
@@ -5989,56 +7382,14 @@ impl<'a> Parser<'a> {
             None
         };
 
-        let create_table_config = self.parse_optional_create_table_config()?;
-
-        let default_charset = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
-            self.expect_token(&Token::Eq)?;
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::Word(w) => Some(w.value),
-                _ => self.expected("identifier", next_token)?,
-            }
-        } else {
-            None
-        };
-
-        let collation = if self.parse_keywords(&[Keyword::COLLATE]) {
-            self.expect_token(&Token::Eq)?;
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::Word(w) => Some(w.value),
-                _ => self.expected("identifier", next_token)?,
-            }
-        } else {
-            None
-        };
-
-        let on_commit: Option<OnCommit> =
-            if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DELETE, Keyword::ROWS])
-            {
-                Some(OnCommit::DeleteRows)
-            } else if self.parse_keywords(&[
-                Keyword::ON,
-                Keyword::COMMIT,
-                Keyword::PRESERVE,
-                Keyword::ROWS,
-            ]) {
-                Some(OnCommit::PreserveRows)
-            } else if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT, Keyword::DROP]) {
-                Some(OnCommit::Drop)
-            } else {
-                None
-            };
+        let on_commit = if self.parse_keywords(&[Keyword::ON, Keyword::COMMIT]) {
+            Some(self.parse_create_table_on_commit()?)
+        } else {
+            None
+        };
 
         let strict = self.parse_keyword(Keyword::STRICT);
 
-        // Excludes Hive dialect here since it has been handled after table column definitions.
-        if !dialect_of!(self is HiveDialect) && self.parse_keyword(Keyword::COMMENT) {
-            // rewind the COMMENT keyword
-            self.prev_token();
-            comment = self.parse_optional_inline_comment()?
-        };
-
         // Parse optional `AS ( query )`
         let query = if self.parse_keyword(Keyword::AS) {
             Some(self.parse_query()?)
@@ -6055,8 +7406,6 @@ impl<'a> Parser<'a> {
             .temporary(temporary)
             .columns(columns)
             .constraints(constraints)
-            .with_options(with_options)
-            .table_properties(table_properties)
             .or_replace(or_replace)
             .if_not_exists(if_not_exists)
             .transient(transient)
@@ -6067,30 +7416,61 @@ impl<'a> Parser<'a> {
             .without_rowid(without_rowid)
             .like(like)
             .clone_clause(clone)
-            .engine(engine)
-            .comment(comment)
-            .auto_increment_offset(auto_increment_offset)
+            .comment_after_column_def(comment_after_column_def)
             .order_by(order_by)
-            .default_charset(default_charset)
-            .collation(collation)
             .on_commit(on_commit)
             .on_cluster(on_cluster)
             .clustered_by(clustered_by)
             .partition_by(create_table_config.partition_by)
             .cluster_by(create_table_config.cluster_by)
-            .options(create_table_config.options)
+            .inherits(create_table_config.inherits)
+            .table_options(create_table_config.table_options)
             .primary_key(primary_key)
             .strict(strict)
             .build())
     }
 
-    /// Parse configuration like partitioning, clustering information during the table creation.
+    pub(crate) fn parse_create_table_on_commit(&mut self) -> Result<OnCommit, ParserError> {
+        if self.parse_keywords(&[Keyword::DELETE, Keyword::ROWS]) {
+            Ok(OnCommit::DeleteRows)
+        } else if self.parse_keywords(&[Keyword::PRESERVE, Keyword::ROWS]) {
+            Ok(OnCommit::PreserveRows)
+        } else if self.parse_keywords(&[Keyword::DROP]) {
+            Ok(OnCommit::Drop)
+        } else {
+            parser_err!(
+                "Expecting DELETE ROWS, PRESERVE ROWS or DROP",
+                self.peek_token()
+            )
+        }
+    }
+
+    /// Parse configuration like inheritance, partitioning, clustering information during the table creation.
     ///
     /// [BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#syntax_2)
     /// [PostgreSQL](https://www.postgresql.org/docs/current/ddl-partitioning.html)
+    /// [MySql](https://dev.mysql.com/doc/refman/8.4/en/create-table.html)
     fn parse_optional_create_table_config(
         &mut self,
     ) -> Result<CreateTableConfiguration, ParserError> {
+        let mut table_options = CreateTableOptions::None;
+
+        let inherits = if self.parse_keyword(Keyword::INHERITS) {
+            Some(self.parse_parenthesized_qualified_column_list(IsOptional::Mandatory, false)?)
+        } else {
+            None
+        };
+
+        // PostgreSQL supports `WITH ( options )`, before `AS`
+        let with_options = self.parse_options(Keyword::WITH)?;
+        if !with_options.is_empty() {
+            table_options = CreateTableOptions::With(with_options)
+        }
+
+        let table_properties = self.parse_options(Keyword::TBLPROPERTIES)?;
+        if !table_properties.is_empty() {
+            table_options = CreateTableOptions::TableProperties(table_properties);
+        }
         let partition_by = if dialect_of!(self is BigQueryDialect | PostgreSqlDialect | GenericDialect)
             && self.parse_keywords(&[Keyword::PARTITION, Keyword::BY])
         {
@@ -6100,46 +7480,267 @@ impl<'a> Parser<'a> {
         };
 
         let mut cluster_by = None;
-        let mut options = None;
         if dialect_of!(self is BigQueryDialect | GenericDialect) {
             if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
                 cluster_by = Some(WrappedCollection::NoWrapping(
-                    self.parse_comma_separated(|p| p.parse_identifier(false))?,
+                    self.parse_comma_separated(|p| p.parse_expr())?,
                 ));
             };
 
             if let Token::Word(word) = self.peek_token().token {
                 if word.keyword == Keyword::OPTIONS {
-                    options = Some(self.parse_options(Keyword::OPTIONS)?);
+                    table_options =
+                        CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
                 }
             };
         }
 
+        if !dialect_of!(self is HiveDialect) && table_options == CreateTableOptions::None {
+            let plain_options = self.parse_plain_options()?;
+            if !plain_options.is_empty() {
+                table_options = CreateTableOptions::Plain(plain_options)
+            }
+        };
+
         Ok(CreateTableConfiguration {
             partition_by,
             cluster_by,
-            options,
+            inherits,
+            table_options,
         })
     }
 
+    fn parse_plain_option(&mut self) -> Result<Option<SqlOption>, ParserError> {
+        // Single parameter option
+        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        if self.parse_keywords(&[Keyword::START, Keyword::TRANSACTION]) {
+            return Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION"))));
+        }
+
+        // Custom option
+        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        if self.parse_keywords(&[Keyword::COMMENT]) {
+            let has_eq = self.consume_token(&Token::Eq);
+            let value = self.next_token();
+
+            let comment = match (has_eq, value.token) {
+                (true, Token::SingleQuotedString(s)) => {
+                    Ok(Some(SqlOption::Comment(CommentDef::WithEq(s))))
+                }
+                (false, Token::SingleQuotedString(s)) => {
+                    Ok(Some(SqlOption::Comment(CommentDef::WithoutEq(s))))
+                }
+                (_, token) => {
+                    self.expected("Token::SingleQuotedString", TokenWithSpan::wrap(token))
+                }
+            };
+            return comment;
+        }
+
+        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        // <https://clickhouse.com/docs/sql-reference/statements/create/table>
+        if self.parse_keywords(&[Keyword::ENGINE]) {
+            let _ = self.consume_token(&Token::Eq);
+            let value = self.next_token();
+
+            let engine = match value.token {
+                Token::Word(w) => {
+                    let parameters = if self.peek_token() == Token::LParen {
+                        self.parse_parenthesized_identifiers()?
+                    } else {
+                        vec![]
+                    };
+
+                    Ok(Some(SqlOption::NamedParenthesizedList(
+                        NamedParenthesizedList {
+                            key: Ident::new("ENGINE"),
+                            name: Some(Ident::new(w.value)),
+                            values: parameters,
+                        },
+                    )))
+                }
+                _ => {
+                    return self.expected("Token::Word", value)?;
+                }
+            };
+
+            return engine;
+        }
+
+        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        if self.parse_keywords(&[Keyword::TABLESPACE]) {
+            let _ = self.consume_token(&Token::Eq);
+            let value = self.next_token();
+
+            let tablespace = match value.token {
+                Token::Word(Word { value: name, .. }) | Token::SingleQuotedString(name) => {
+                    let storage = match self.parse_keyword(Keyword::STORAGE) {
+                        true => {
+                            let _ = self.consume_token(&Token::Eq);
+                            let storage_token = self.next_token();
+                            match &storage_token.token {
+                                Token::Word(w) => match w.value.to_uppercase().as_str() {
+                                    "DISK" => Some(StorageType::Disk),
+                                    "MEMORY" => Some(StorageType::Memory),
+                                    _ => self
+                                        .expected("Storage type (DISK or MEMORY)", storage_token)?,
+                                },
+                                _ => self.expected("Token::Word", storage_token)?,
+                            }
+                        }
+                        false => None,
+                    };
+
+                    Ok(Some(SqlOption::TableSpace(TablespaceOption {
+                        name,
+                        storage,
+                    })))
+                }
+                _ => {
+                    return self.expected("Token::Word", value)?;
+                }
+            };
+
+            return tablespace;
+        }
+
+        // <https://dev.mysql.com/doc/refman/8.4/en/create-table.html>
+        if self.parse_keyword(Keyword::UNION) {
+            let _ = self.consume_token(&Token::Eq);
+            let value = self.next_token();
+
+            match value.token {
+                Token::LParen => {
+                    let tables: Vec<Ident> =
+                        self.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?;
+                    self.expect_token(&Token::RParen)?;
+
+                    return Ok(Some(SqlOption::NamedParenthesizedList(
+                        NamedParenthesizedList {
+                            key: Ident::new("UNION"),
+                            name: None,
+                            values: tables,
+                        },
+                    )));
+                }
+                _ => {
+                    return self.expected("Token::LParen", value)?;
+                }
+            }
+        }
+
+        // Key/Value parameter option
+        let key = if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARSET]) {
+            Ident::new("DEFAULT CHARSET")
+        } else if self.parse_keyword(Keyword::CHARSET) {
+            Ident::new("CHARSET")
+        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::CHARACTER, Keyword::SET]) {
+            Ident::new("DEFAULT CHARACTER SET")
+        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
+            Ident::new("CHARACTER SET")
+        } else if self.parse_keywords(&[Keyword::DEFAULT, Keyword::COLLATE]) {
+            Ident::new("DEFAULT COLLATE")
+        } else if self.parse_keyword(Keyword::COLLATE) {
+            Ident::new("COLLATE")
+        } else if self.parse_keywords(&[Keyword::DATA, Keyword::DIRECTORY]) {
+            Ident::new("DATA DIRECTORY")
+        } else if self.parse_keywords(&[Keyword::INDEX, Keyword::DIRECTORY]) {
+            Ident::new("INDEX DIRECTORY")
+        } else if self.parse_keyword(Keyword::KEY_BLOCK_SIZE) {
+            Ident::new("KEY_BLOCK_SIZE")
+        } else if self.parse_keyword(Keyword::ROW_FORMAT) {
+            Ident::new("ROW_FORMAT")
+        } else if self.parse_keyword(Keyword::PACK_KEYS) {
+            Ident::new("PACK_KEYS")
+        } else if self.parse_keyword(Keyword::STATS_AUTO_RECALC) {
+            Ident::new("STATS_AUTO_RECALC")
+        } else if self.parse_keyword(Keyword::STATS_PERSISTENT) {
+            Ident::new("STATS_PERSISTENT")
+        } else if self.parse_keyword(Keyword::STATS_SAMPLE_PAGES) {
+            Ident::new("STATS_SAMPLE_PAGES")
+        } else if self.parse_keyword(Keyword::DELAY_KEY_WRITE) {
+            Ident::new("DELAY_KEY_WRITE")
+        } else if self.parse_keyword(Keyword::COMPRESSION) {
+            Ident::new("COMPRESSION")
+        } else if self.parse_keyword(Keyword::ENCRYPTION) {
+            Ident::new("ENCRYPTION")
+        } else if self.parse_keyword(Keyword::MAX_ROWS) {
+            Ident::new("MAX_ROWS")
+        } else if self.parse_keyword(Keyword::MIN_ROWS) {
+            Ident::new("MIN_ROWS")
+        } else if self.parse_keyword(Keyword::AUTOEXTEND_SIZE) {
+            Ident::new("AUTOEXTEND_SIZE")
+        } else if self.parse_keyword(Keyword::AVG_ROW_LENGTH) {
+            Ident::new("AVG_ROW_LENGTH")
+        } else if self.parse_keyword(Keyword::CHECKSUM) {
+            Ident::new("CHECKSUM")
+        } else if self.parse_keyword(Keyword::CONNECTION) {
+            Ident::new("CONNECTION")
+        } else if self.parse_keyword(Keyword::ENGINE_ATTRIBUTE) {
+            Ident::new("ENGINE_ATTRIBUTE")
+        } else if self.parse_keyword(Keyword::PASSWORD) {
+            Ident::new("PASSWORD")
+        } else if self.parse_keyword(Keyword::SECONDARY_ENGINE_ATTRIBUTE) {
+            Ident::new("SECONDARY_ENGINE_ATTRIBUTE")
+        } else if self.parse_keyword(Keyword::INSERT_METHOD) {
+            Ident::new("INSERT_METHOD")
+        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
+            Ident::new("AUTO_INCREMENT")
+        } else {
+            return Ok(None);
+        };
+
+        let _ = self.consume_token(&Token::Eq);
+
+        let value = match self
+            .maybe_parse(|parser| parser.parse_value())?
+            .map(Expr::Value)
+        {
+            Some(expr) => expr,
+            None => Expr::Identifier(self.parse_identifier()?),
+        };
+
+        Ok(Some(SqlOption::KeyValue { key, value }))
+    }
+
+    pub fn parse_plain_options(&mut self) -> Result<Vec<SqlOption>, ParserError> {
+        let mut options = Vec::new();
+
+        while let Some(option) = self.parse_plain_option()? {
+            options.push(option);
+            // Some dialects support comma-separated options; it shouldn't introduce ambiguity to
+            // consume it for all dialects.
+            let _ = self.consume_token(&Token::Comma);
+        }
+
+        Ok(options)
+    }
+
     pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
         let comment = if self.parse_keyword(Keyword::COMMENT) {
             let has_eq = self.consume_token(&Token::Eq);
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::SingleQuotedString(str) => Some(if has_eq {
-                    CommentDef::WithEq(str)
-                } else {
-                    CommentDef::WithoutEq(str)
-                }),
-                _ => self.expected("comment", next_token)?,
-            }
+            let comment = self.parse_comment_value()?;
+            Some(if has_eq {
+                CommentDef::WithEq(comment)
+            } else {
+                CommentDef::WithoutEq(comment)
+            })
         } else {
             None
         };
         Ok(comment)
     }
 
+    pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
+        let next_token = self.next_token();
+        let value = match next_token.token {
+            Token::SingleQuotedString(str) => str,
+            Token::DollarQuotedString(str) => str.value,
+            _ => self.expected("string literal", next_token)?,
+        };
+        Ok(value)
+    }
+
     pub fn parse_optional_procedure_parameters(
         &mut self,
     ) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
@@ -6185,7 +7786,11 @@ impl<'a> Parser<'a> {
                 return self.expected("',' or ')' after column definition", self.peek_token());
             };
 
-            if rparen && (!comma || self.options.trailing_commas) {
+            if rparen
+                && (!comma
+                    || self.dialect.supports_column_definition_trailing_commas()
+                    || self.options.trailing_commas)
+            {
                 let _ = self.consume_token(&Token::RParen);
                 break;
             }
@@ -6195,27 +7800,35 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_procedure_param(&mut self) -> Result<ProcedureParam, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let mode = if self.parse_keyword(Keyword::IN) {
+            Some(ArgMode::In)
+        } else if self.parse_keyword(Keyword::OUT) {
+            Some(ArgMode::Out)
+        } else if self.parse_keyword(Keyword::INOUT) {
+            Some(ArgMode::InOut)
+        } else {
+            None
+        };
+        let name = self.parse_identifier()?;
         let data_type = self.parse_data_type()?;
-        Ok(ProcedureParam { name, data_type })
+        Ok(ProcedureParam {
+            name,
+            data_type,
+            mode,
+        })
     }
 
     pub fn parse_column_def(&mut self) -> Result<ColumnDef, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         let data_type = if self.is_column_type_sqlite_unspecified() {
             DataType::Unspecified
         } else {
             self.parse_data_type()?
         };
-        let mut collation = if self.parse_keyword(Keyword::COLLATE) {
-            Some(self.parse_object_name(false)?)
-        } else {
-            None
-        };
         let mut options = vec![];
         loop {
             if self.parse_keyword(Keyword::CONSTRAINT) {
-                let name = Some(self.parse_identifier(false)?);
+                let name = Some(self.parse_identifier()?);
                 if let Some(option) = self.parse_optional_column_option()? {
                     options.push(ColumnOptionDef { name, option });
                 } else {
@@ -6226,10 +7839,6 @@ impl<'a> Parser<'a> {
                 }
             } else if let Some(option) = self.parse_optional_column_option()? {
                 options.push(ColumnOptionDef { name: None, option });
-            } else if dialect_of!(self is MySqlDialect | SnowflakeDialect | GenericDialect)
-                && self.parse_keyword(Keyword::COLLATE)
-            {
-                collation = Some(self.parse_object_name(false)?);
             } else {
                 break;
             };
@@ -6237,7 +7846,6 @@ impl<'a> Parser<'a> {
         Ok(ColumnDef {
             name,
             data_type,
-            collation,
             options,
         })
     }
@@ -6270,30 +7878,43 @@ impl<'a> Parser<'a> {
             return option;
         }
 
+        self.with_state(
+            ColumnDefinition,
+            |parser| -> Result<Option<ColumnOption>, ParserError> {
+                parser.parse_optional_column_option_inner()
+            },
+        )
+    }
+
+    fn parse_optional_column_option_inner(&mut self) -> Result<Option<ColumnOption>, ParserError> {
         if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
             Ok(Some(ColumnOption::CharacterSet(
                 self.parse_object_name(false)?,
             )))
+        } else if self.parse_keywords(&[Keyword::COLLATE]) {
+            Ok(Some(ColumnOption::Collation(
+                self.parse_object_name(false)?,
+            )))
         } else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
             Ok(Some(ColumnOption::NotNull))
         } else if self.parse_keywords(&[Keyword::COMMENT]) {
-            let next_token = self.next_token();
-            match next_token.token {
-                Token::SingleQuotedString(value, ..) => Ok(Some(ColumnOption::Comment(value))),
-                _ => self.expected("string", next_token),
-            }
+            Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
         } else if self.parse_keyword(Keyword::NULL) {
             Ok(Some(ColumnOption::Null))
         } else if self.parse_keyword(Keyword::DEFAULT) {
-            Ok(Some(ColumnOption::Default(self.parse_expr()?)))
+            Ok(Some(ColumnOption::Default(
+                self.parse_column_option_expr()?,
+            )))
         } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
             && self.parse_keyword(Keyword::MATERIALIZED)
         {
-            Ok(Some(ColumnOption::Materialized(self.parse_expr()?)))
+            Ok(Some(ColumnOption::Materialized(
+                self.parse_column_option_expr()?,
+            )))
         } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
             && self.parse_keyword(Keyword::ALIAS)
         {
-            Ok(Some(ColumnOption::Alias(self.parse_expr()?)))
+            Ok(Some(ColumnOption::Alias(self.parse_column_option_expr()?)))
         } else if dialect_of!(self is ClickHouseDialect| GenericDialect)
             && self.parse_keyword(Keyword::EPHEMERAL)
         {
@@ -6302,7 +7923,9 @@ impl<'a> Parser<'a> {
             if matches!(self.peek_token().token, Token::Comma | Token::RParen) {
                 Ok(Some(ColumnOption::Ephemeral(None)))
             } else {
-                Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
+                Ok(Some(ColumnOption::Ephemeral(Some(
+                    self.parse_column_option_expr()?,
+                ))))
             }
         } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
             let characteristics = self.parse_constraint_characteristics()?;
@@ -6345,7 +7968,8 @@ impl<'a> Parser<'a> {
             }))
         } else if self.parse_keyword(Keyword::CHECK) {
             self.expect_token(&Token::LParen)?;
-            let expr = self.parse_expr()?;
+            // since `CHECK` requires parentheses, we can parse the inner expression in ParserState::Normal
+            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
             self.expect_token(&Token::RParen)?;
             Ok(Some(ColumnOption::Check(expr)))
         } else if self.parse_keyword(Keyword::AUTO_INCREMENT)
@@ -6379,7 +8003,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
             && dialect_of!(self is MySqlDialect | GenericDialect)
         {
-            let expr = self.parse_expr()?;
+            let expr = self.parse_column_option_expr()?;
             Ok(Some(ColumnOption::OnUpdate(expr)))
         } else if self.parse_keyword(Keyword::GENERATED) {
             self.parse_optional_column_option_generated()
@@ -6394,6 +8018,12 @@ impl<'a> Parser<'a> {
             && dialect_of!(self is MySqlDialect | SQLiteDialect | DuckDbDialect | GenericDialect)
         {
             self.parse_optional_column_option_as()
+        } else if self.parse_keyword(Keyword::SRID)
+            && dialect_of!(self is MySqlDialect | GenericDialect)
+        {
+            Ok(Some(ColumnOption::Srid(Box::new(
+                self.parse_column_option_expr()?,
+            ))))
         } else if self.parse_keyword(Keyword::IDENTITY)
             && dialect_of!(self is MsSqlDialect | GenericDialect)
         {
@@ -6433,8 +8063,33 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// When parsing some column option expressions we need to revert to [ParserState::Normal] since
+    /// `NOT NULL` is allowed as an alias for `IS NOT NULL`.
+    /// In those cases we use this helper instead of calling [Parser::parse_expr] directly.
+    ///
+    /// For example, consider these `CREATE TABLE` statements:
+    /// ```sql
+    /// CREATE TABLE foo (abc BOOL DEFAULT (42 NOT NULL) NOT NULL);
+    /// ```
+    /// vs
+    /// ```sql
+    /// CREATE TABLE foo (abc BOOL NOT NULL);
+    /// ```
+    ///
+    /// In the first we should parse the inner portion of `(42 NOT NULL)` as [Expr::IsNotNull],
+    /// whereas is both statements that trailing `NOT NULL` should only be parsed as a
+    /// [ColumnOption::NotNull].
+    fn parse_column_option_expr(&mut self) -> Result<Expr, ParserError> {
+        if self.peek_token_ref().token == Token::LParen {
+            let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_prefix())?;
+            Ok(expr)
+        } else {
+            Ok(self.parse_expr()?)
+        }
+    }
+
     pub(crate) fn parse_tag(&mut self) -> Result<Tag, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_object_name(false)?;
         self.expect_token(&Token::Eq)?;
         let value = self.parse_literal_string()?;
 
@@ -6477,7 +8132,7 @@ impl<'a> Parser<'a> {
             }))
         } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::AS]) {
             if self.expect_token(&Token::LParen).is_ok() {
-                let expr = self.parse_expr()?;
+                let expr: Expr = self.with_state(ParserState::Normal, |p| p.parse_expr())?;
                 self.expect_token(&Token::RParen)?;
                 let (gen_as, expr_mode) = if self.parse_keywords(&[Keyword::STORED]) {
                     Ok((
@@ -6549,9 +8204,9 @@ impl<'a> Parser<'a> {
                 None
             };
 
-            self.expect_keyword(Keyword::INTO)?;
-            let num_buckets = self.parse_number_value()?;
-            self.expect_keyword(Keyword::BUCKETS)?;
+            self.expect_keyword_is(Keyword::INTO)?;
+            let num_buckets = self.parse_number_value()?.value;
+            self.expect_keyword_is(Keyword::BUCKETS)?;
             Some(ClusteredBy {
                 columns,
                 sorted_by,
@@ -6623,7 +8278,7 @@ impl<'a> Parser<'a> {
         &mut self,
     ) -> Result<Option<TableConstraint>, ParserError> {
         let name = if self.parse_keyword(Keyword::CONSTRAINT) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         } else {
             None
         };
@@ -6639,11 +8294,13 @@ impl<'a> Parser<'a> {
                         .expected("`index_name` or `(column_name [, ...])`", self.peek_token());
                 }
 
+                let nulls_distinct = self.parse_optional_nulls_distinct()?;
+
                 // optional index name
-                let index_name = self.parse_optional_indent()?;
+                let index_name = self.parse_optional_ident()?;
                 let index_type = self.parse_optional_using_then_index_type()?;
 
-                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+                let columns = self.parse_parenthesized_index_column_list()?;
                 let index_options = self.parse_index_options()?;
                 let characteristics = self.parse_constraint_characteristics()?;
                 Ok(Some(TableConstraint::Unique {
@@ -6654,17 +8311,18 @@ impl<'a> Parser<'a> {
                     columns,
                     index_options,
                     characteristics,
+                    nulls_distinct,
                 }))
             }
             Token::Word(w) if w.keyword == Keyword::PRIMARY => {
                 // after `PRIMARY` always stay `KEY`
-                self.expect_keyword(Keyword::KEY)?;
+                self.expect_keyword_is(Keyword::KEY)?;
 
                 // optional index name
-                let index_name = self.parse_optional_indent()?;
+                let index_name = self.parse_optional_ident()?;
                 let index_type = self.parse_optional_using_then_index_type()?;
 
-                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+                let columns = self.parse_parenthesized_index_column_list()?;
                 let index_options = self.parse_index_options()?;
                 let characteristics = self.parse_constraint_characteristics()?;
                 Ok(Some(TableConstraint::PrimaryKey {
@@ -6677,11 +8335,12 @@ impl<'a> Parser<'a> {
                 }))
             }
             Token::Word(w) if w.keyword == Keyword::FOREIGN => {
-                self.expect_keyword(Keyword::KEY)?;
+                self.expect_keyword_is(Keyword::KEY)?;
+                let index_name = self.parse_optional_ident()?;
                 let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
-                self.expect_keyword(Keyword::REFERENCES)?;
+                self.expect_keyword_is(Keyword::REFERENCES)?;
                 let foreign_table = self.parse_object_name(false)?;
-                let referred_columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+                let referred_columns = self.parse_parenthesized_column_list(Optional, false)?;
                 let mut on_delete = None;
                 let mut on_update = None;
                 loop {
@@ -6700,6 +8359,7 @@ impl<'a> Parser<'a> {
 
                 Ok(Some(TableConstraint::ForeignKey {
                     name,
+                    index_name,
                     columns,
                     foreign_table,
                     referred_columns,
@@ -6712,7 +8372,20 @@ impl<'a> Parser<'a> {
                 self.expect_token(&Token::LParen)?;
                 let expr = Box::new(self.parse_expr()?);
                 self.expect_token(&Token::RParen)?;
-                Ok(Some(TableConstraint::Check { name, expr }))
+
+                let enforced = if self.parse_keyword(Keyword::ENFORCED) {
+                    Some(true)
+                } else if self.parse_keywords(&[Keyword::NOT, Keyword::ENFORCED]) {
+                    Some(false)
+                } else {
+                    None
+                };
+
+                Ok(Some(TableConstraint::Check {
+                    name,
+                    expr,
+                    enforced,
+                }))
             }
             Token::Word(w)
                 if (w.keyword == Keyword::INDEX || w.keyword == Keyword::KEY)
@@ -6723,11 +8396,11 @@ impl<'a> Parser<'a> {
 
                 let name = match self.peek_token().token {
                     Token::Word(word) if word.keyword == Keyword::USING => None,
-                    _ => self.parse_optional_indent()?,
+                    _ => self.parse_optional_ident()?,
                 };
 
                 let index_type = self.parse_optional_using_then_index_type()?;
-                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+                let columns = self.parse_parenthesized_index_column_list()?;
 
                 Ok(Some(TableConstraint::Index {
                     display_as_key,
@@ -6743,9 +8416,9 @@ impl<'a> Parser<'a> {
                 if let Some(name) = name {
                     return self.expected(
                         "FULLTEXT or SPATIAL option without constraint name",
-                        TokenWithLocation {
+                        TokenWithSpan {
                             token: Token::make_keyword(&name.to_string()),
-                            location: next_token.location,
+                            span: next_token.span,
                         },
                     );
                 }
@@ -6754,9 +8427,9 @@ impl<'a> Parser<'a> {
 
                 let index_type_display = self.parse_index_type_display();
 
-                let opt_index_name = self.parse_optional_indent()?;
+                let opt_index_name = self.parse_optional_ident()?;
 
-                let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
+                let columns = self.parse_parenthesized_index_column_list()?;
 
                 Ok(Some(TableConstraint::FulltextOrSpatial {
                     fulltext,
@@ -6776,6 +8449,20 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn parse_optional_nulls_distinct(&mut self) -> Result<NullsDistinctOption, ParserError> {
+        Ok(if self.parse_keyword(Keyword::NULLS) {
+            let not = self.parse_keyword(Keyword::NOT);
+            self.expect_keyword_is(Keyword::DISTINCT)?;
+            if not {
+                NullsDistinctOption::NotDistinct
+            } else {
+                NullsDistinctOption::Distinct
+            }
+        } else {
+            NullsDistinctOption::None
+        })
+    }
+
     pub fn maybe_parse_options(
         &mut self,
         keyword: Keyword,
@@ -6791,7 +8478,7 @@ impl<'a> Parser<'a> {
     pub fn parse_options(&mut self, keyword: Keyword) -> Result<Vec<SqlOption>, ParserError> {
         if self.parse_keyword(keyword) {
             self.expect_token(&Token::LParen)?;
-            let options = self.parse_comma_separated(Parser::parse_sql_option)?;
+            let options = self.parse_comma_separated0(Parser::parse_sql_option, Token::RParen)?;
             self.expect_token(&Token::RParen)?;
             Ok(options)
         } else {
@@ -6814,16 +8501,30 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_index_type(&mut self) -> Result<IndexType, ParserError> {
-        if self.parse_keyword(Keyword::BTREE) {
-            Ok(IndexType::BTree)
+        Ok(if self.parse_keyword(Keyword::BTREE) {
+            IndexType::BTree
         } else if self.parse_keyword(Keyword::HASH) {
-            Ok(IndexType::Hash)
+            IndexType::Hash
+        } else if self.parse_keyword(Keyword::GIN) {
+            IndexType::GIN
+        } else if self.parse_keyword(Keyword::GIST) {
+            IndexType::GiST
+        } else if self.parse_keyword(Keyword::SPGIST) {
+            IndexType::SPGiST
+        } else if self.parse_keyword(Keyword::BRIN) {
+            IndexType::BRIN
+        } else if self.parse_keyword(Keyword::BLOOM) {
+            IndexType::Bloom
         } else {
-            self.expected("index type {BTREE | HASH}", self.peek_token())
-        }
+            IndexType::Custom(self.parse_identifier()?)
+        })
     }
 
-    /// Parse [USING {BTREE | HASH}]
+    /// Optionally parse the `USING` keyword, followed by an [IndexType]
+    /// Example:
+    /// ```sql
+    //// USING BTREE (name, age DESC)
+    /// ```
     pub fn parse_optional_using_then_index_type(
         &mut self,
     ) -> Result<Option<IndexType>, ParserError> {
@@ -6836,8 +8537,8 @@ impl<'a> Parser<'a> {
 
     /// Parse `[ident]`, mostly `ident` is name, like:
     /// `window_name`, `index_name`, ...
-    pub fn parse_optional_indent(&mut self) -> Result<Option<Ident>, ParserError> {
-        self.maybe_parse(|parser| parser.parse_identifier(false))
+    pub fn parse_optional_ident(&mut self) -> Result<Option<Ident>, ParserError> {
+        self.maybe_parse(|parser| parser.parse_identifier())
     }
 
     #[must_use]
@@ -6878,7 +8579,7 @@ impl<'a> Parser<'a> {
 
         match self.peek_token().token {
             Token::Word(w) if w.keyword == Keyword::HEAP && is_mssql => {
-                Ok(SqlOption::Ident(self.parse_identifier(false)?))
+                Ok(SqlOption::Ident(self.parse_identifier()?))
             }
             Token::Word(w) if w.keyword == Keyword::PARTITION && is_mssql => {
                 self.parse_option_partition()
@@ -6887,7 +8588,7 @@ impl<'a> Parser<'a> {
                 self.parse_option_clustered()
             }
             _ => {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 self.expect_token(&Token::Eq)?;
                 let value = self.parse_expr()?;
 
@@ -6916,7 +8617,7 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::LParen)?;
 
             let columns = self.parse_comma_separated(|p| {
-                let name = p.parse_identifier(false)?;
+                let name = p.parse_identifier()?;
                 let asc = p.parse_asc_desc();
 
                 Ok(ClusteredIndex { name, asc })
@@ -6933,11 +8634,11 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_option_partition(&mut self) -> Result<SqlOption, ParserError> {
-        self.expect_keyword(Keyword::PARTITION)?;
+        self.expect_keyword_is(Keyword::PARTITION)?;
         self.expect_token(&Token::LParen)?;
-        let column_name = self.parse_identifier(false)?;
+        let column_name = self.parse_identifier()?;
 
-        self.expect_keyword(Keyword::RANGE)?;
+        self.expect_keyword_is(Keyword::RANGE)?;
         let range_direction = if self.parse_keyword(Keyword::LEFT) {
             Some(PartitionRangeDirection::Left)
         } else if self.parse_keyword(Keyword::RIGHT) {
@@ -6970,7 +8671,7 @@ impl<'a> Parser<'a> {
 
     pub fn parse_projection_select(&mut self) -> Result<ProjectionSelect, ParserError> {
         self.expect_token(&Token::LParen)?;
-        self.expect_keyword(Keyword::SELECT)?;
+        self.expect_keyword_is(Keyword::SELECT)?;
         let projection = self.parse_projection()?;
         let group_by = self.parse_optional_group_by()?;
         let order_by = self.parse_optional_order_by()?;
@@ -6983,7 +8684,7 @@ impl<'a> Parser<'a> {
     }
     pub fn parse_alter_table_add_projection(&mut self) -> Result<AlterTableOperation, ParserError> {
         let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         let query = self.parse_projection_select()?;
         Ok(AlterTableOperation::AddProjection {
             if_not_exists,
@@ -6995,7 +8696,11 @@ impl<'a> Parser<'a> {
     pub fn parse_alter_table_operation(&mut self) -> Result<AlterTableOperation, ParserError> {
         let operation = if self.parse_keyword(Keyword::ADD) {
             if let Some(constraint) = self.parse_optional_table_constraint()? {
-                AlterTableOperation::AddConstraint(constraint)
+                let not_valid = self.parse_keywords(&[Keyword::NOT, Keyword::VALID]);
+                AlterTableOperation::AddConstraint {
+                    constraint,
+                    not_valid,
+                }
             } else if dialect_of!(self is ClickHouseDialect|GenericDialect)
                 && self.parse_keyword(Keyword::PROJECTION)
             {
@@ -7041,18 +8746,25 @@ impl<'a> Parser<'a> {
             }
         } else if self.parse_keyword(Keyword::RENAME) {
             if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::CONSTRAINT) {
-                let old_name = self.parse_identifier(false)?;
-                self.expect_keyword(Keyword::TO)?;
-                let new_name = self.parse_identifier(false)?;
+                let old_name = self.parse_identifier()?;
+                self.expect_keyword_is(Keyword::TO)?;
+                let new_name = self.parse_identifier()?;
                 AlterTableOperation::RenameConstraint { old_name, new_name }
             } else if self.parse_keyword(Keyword::TO) {
                 let table_name = self.parse_object_name(false)?;
-                AlterTableOperation::RenameTable { table_name }
+                AlterTableOperation::RenameTable {
+                    table_name: RenameTableNameKind::To(table_name),
+                }
+            } else if self.parse_keyword(Keyword::AS) {
+                let table_name = self.parse_object_name(false)?;
+                AlterTableOperation::RenameTable {
+                    table_name: RenameTableNameKind::As(table_name),
+                }
             } else {
                 let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
-                let old_column_name = self.parse_identifier(false)?;
-                self.expect_keyword(Keyword::TO)?;
-                let new_column_name = self.parse_identifier(false)?;
+                let old_column_name = self.parse_identifier()?;
+                self.expect_keyword_is(Keyword::TO)?;
+                let new_column_name = self.parse_identifier()?;
                 AlterTableOperation::RenameColumn {
                     old_column_name,
                     new_column_name,
@@ -7062,10 +8774,10 @@ impl<'a> Parser<'a> {
             if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
                 AlterTableOperation::DisableRowLevelSecurity {}
             } else if self.parse_keyword(Keyword::RULE) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::DisableRule { name }
             } else if self.parse_keyword(Keyword::TRIGGER) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::DisableTrigger { name }
             } else {
                 return self.expected(
@@ -7075,24 +8787,24 @@ impl<'a> Parser<'a> {
             }
         } else if self.parse_keyword(Keyword::ENABLE) {
             if self.parse_keywords(&[Keyword::ALWAYS, Keyword::RULE]) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableAlwaysRule { name }
             } else if self.parse_keywords(&[Keyword::ALWAYS, Keyword::TRIGGER]) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableAlwaysTrigger { name }
             } else if self.parse_keywords(&[Keyword::ROW, Keyword::LEVEL, Keyword::SECURITY]) {
                 AlterTableOperation::EnableRowLevelSecurity {}
             } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::RULE]) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableReplicaRule { name }
             } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::TRIGGER]) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableReplicaTrigger { name }
             } else if self.parse_keyword(Keyword::RULE) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableRule { name }
             } else if self.parse_keyword(Keyword::TRIGGER) {
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::EnableTrigger { name }
             } else {
                 return self.expected(
@@ -7104,9 +8816,9 @@ impl<'a> Parser<'a> {
             && dialect_of!(self is ClickHouseDialect|GenericDialect)
         {
             let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-            let name = self.parse_identifier(false)?;
+            let name = self.parse_identifier()?;
             let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
-                Some(self.parse_identifier(false)?)
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
@@ -7119,9 +8831,9 @@ impl<'a> Parser<'a> {
             && dialect_of!(self is ClickHouseDialect|GenericDialect)
         {
             let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-            let name = self.parse_identifier(false)?;
+            let name = self.parse_identifier()?;
             let partition = if self.parse_keywords(&[Keyword::IN, Keyword::PARTITION]) {
-                Some(self.parse_identifier(false)?)
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
@@ -7149,39 +8861,50 @@ impl<'a> Parser<'a> {
                 }
             } else if self.parse_keyword(Keyword::CONSTRAINT) {
                 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-                let name = self.parse_identifier(false)?;
-                let cascade = self.parse_keyword(Keyword::CASCADE);
+                let name = self.parse_identifier()?;
+                let drop_behavior = self.parse_optional_drop_behavior();
                 AlterTableOperation::DropConstraint {
                     if_exists,
                     name,
-                    cascade,
+                    drop_behavior,
                 }
-            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY])
-                && dialect_of!(self is MySqlDialect | GenericDialect)
-            {
+            } else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
                 AlterTableOperation::DropPrimaryKey
+            } else if self.parse_keywords(&[Keyword::FOREIGN, Keyword::KEY]) {
+                let name = self.parse_identifier()?;
+                AlterTableOperation::DropForeignKey { name }
+            } else if self.parse_keyword(Keyword::INDEX) {
+                let name = self.parse_identifier()?;
+                AlterTableOperation::DropIndex { name }
             } else if self.parse_keyword(Keyword::PROJECTION)
                 && dialect_of!(self is ClickHouseDialect|GenericDialect)
             {
                 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-                let name = self.parse_identifier(false)?;
+                let name = self.parse_identifier()?;
                 AlterTableOperation::DropProjection { if_exists, name }
+            } else if self.parse_keywords(&[Keyword::CLUSTERING, Keyword::KEY]) {
+                AlterTableOperation::DropClusteringKey
             } else {
-                let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
+                let has_column_keyword = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
                 let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-                let column_name = self.parse_identifier(false)?;
-                let cascade = self.parse_keyword(Keyword::CASCADE);
+                let column_names = if self.dialect.supports_comma_separated_drop_column_list() {
+                    self.parse_comma_separated(Parser::parse_identifier)?
+                } else {
+                    vec![self.parse_identifier()?]
+                };
+                let drop_behavior = self.parse_optional_drop_behavior();
                 AlterTableOperation::DropColumn {
-                    column_name,
+                    has_column_keyword,
+                    column_names,
                     if_exists,
-                    cascade,
+                    drop_behavior,
                 }
             }
         } else if self.parse_keyword(Keyword::PARTITION) {
             self.expect_token(&Token::LParen)?;
             let before = self.parse_comma_separated(Parser::parse_expr)?;
             self.expect_token(&Token::RParen)?;
-            self.expect_keyword(Keyword::RENAME)?;
+            self.expect_keyword_is(Keyword::RENAME)?;
             self.expect_keywords(&[Keyword::TO, Keyword::PARTITION])?;
             self.expect_token(&Token::LParen)?;
             let renames = self.parse_comma_separated(Parser::parse_expr)?;
@@ -7192,8 +8915,8 @@ impl<'a> Parser<'a> {
             }
         } else if self.parse_keyword(Keyword::CHANGE) {
             let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
-            let old_name = self.parse_identifier(false)?;
-            let new_name = self.parse_identifier(false)?;
+            let old_name = self.parse_identifier()?;
+            let new_name = self.parse_identifier()?;
             let data_type = self.parse_data_type()?;
             let mut options = vec![];
             while let Some(option) = self.parse_optional_column_option()? {
@@ -7211,7 +8934,7 @@ impl<'a> Parser<'a> {
             }
         } else if self.parse_keyword(Keyword::MODIFY) {
             let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
-            let col_name = self.parse_identifier(false)?;
+            let col_name = self.parse_identifier()?;
             let data_type = self.parse_data_type()?;
             let mut options = vec![];
             while let Some(option) = self.parse_optional_column_option()? {
@@ -7228,7 +8951,7 @@ impl<'a> Parser<'a> {
             }
         } else if self.parse_keyword(Keyword::ALTER) {
             let _ = self.parse_keyword(Keyword::COLUMN); // [ COLUMN ]
-            let column_name = self.parse_identifier(false)?;
+            let column_name = self.parse_identifier()?;
             let is_postgresql = dialect_of!(self is PostgreSqlDialect);
 
             let op: AlterColumnOperation = if self.parse_keywords(&[
@@ -7245,16 +8968,10 @@ impl<'a> Parser<'a> {
                 }
             } else if self.parse_keywords(&[Keyword::DROP, Keyword::DEFAULT]) {
                 AlterColumnOperation::DropDefault {}
-            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE])
-                || (is_postgresql && self.parse_keyword(Keyword::TYPE))
-            {
-                let data_type = self.parse_data_type()?;
-                let using = if is_postgresql && self.parse_keyword(Keyword::USING) {
-                    Some(self.parse_expr()?)
-                } else {
-                    None
-                };
-                AlterColumnOperation::SetDataType { data_type, using }
+            } else if self.parse_keywords(&[Keyword::SET, Keyword::DATA, Keyword::TYPE]) {
+                self.parse_set_data_type(true)?
+            } else if self.parse_keyword(Keyword::TYPE) {
+                self.parse_set_data_type(false)?
             } else if self.parse_keywords(&[Keyword::ADD, Keyword::GENERATED]) {
                 let generated_as = if self.parse_keyword(Keyword::ALWAYS) {
                     Some(GeneratedAs::Always)
@@ -7289,7 +9006,7 @@ impl<'a> Parser<'a> {
             };
             AlterTableOperation::AlterColumn { column_name, op }
         } else if self.parse_keyword(Keyword::SWAP) {
-            self.expect_keyword(Keyword::WITH)?;
+            self.expect_keyword_is(Keyword::WITH)?;
             let table_name = self.parse_object_name(false)?;
             AlterTableOperation::SwapWith { table_name }
         } else if dialect_of!(self is PostgreSqlDialect | GenericDialect)
@@ -7314,8 +9031,8 @@ impl<'a> Parser<'a> {
         {
             let partition = self.parse_part_or_partition()?;
             let with_name = if self.parse_keyword(Keyword::WITH) {
-                self.expect_keyword(Keyword::NAME)?;
-                Some(self.parse_identifier(false)?)
+                self.expect_keyword_is(Keyword::NAME)?;
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
@@ -7328,8 +9045,8 @@ impl<'a> Parser<'a> {
         {
             let partition = self.parse_part_or_partition()?;
             let with_name = if self.parse_keyword(Keyword::WITH) {
-                self.expect_keyword(Keyword::NAME)?;
-                Some(self.parse_identifier(false)?)
+                self.expect_keyword_is(Keyword::NAME)?;
+                Some(self.parse_identifier()?)
             } else {
                 None
             };
@@ -7337,23 +9054,113 @@ impl<'a> Parser<'a> {
                 partition,
                 with_name,
             }
+        } else if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) {
+            self.expect_token(&Token::LParen)?;
+            let exprs = self.parse_comma_separated(|parser| parser.parse_expr())?;
+            self.expect_token(&Token::RParen)?;
+            AlterTableOperation::ClusterBy { exprs }
+        } else if self.parse_keywords(&[Keyword::SUSPEND, Keyword::RECLUSTER]) {
+            AlterTableOperation::SuspendRecluster
+        } else if self.parse_keywords(&[Keyword::RESUME, Keyword::RECLUSTER]) {
+            AlterTableOperation::ResumeRecluster
+        } else if self.parse_keyword(Keyword::LOCK) {
+            let equals = self.consume_token(&Token::Eq);
+            let lock = match self.parse_one_of_keywords(&[
+                Keyword::DEFAULT,
+                Keyword::EXCLUSIVE,
+                Keyword::NONE,
+                Keyword::SHARED,
+            ]) {
+                Some(Keyword::DEFAULT) => AlterTableLock::Default,
+                Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
+                Some(Keyword::NONE) => AlterTableLock::None,
+                Some(Keyword::SHARED) => AlterTableLock::Shared,
+                _ => self.expected(
+                    "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
+                    self.peek_token(),
+                )?,
+            };
+            AlterTableOperation::Lock { equals, lock }
+        } else if self.parse_keyword(Keyword::ALGORITHM) {
+            let equals = self.consume_token(&Token::Eq);
+            let algorithm = match self.parse_one_of_keywords(&[
+                Keyword::DEFAULT,
+                Keyword::INSTANT,
+                Keyword::INPLACE,
+                Keyword::COPY,
+            ]) {
+                Some(Keyword::DEFAULT) => AlterTableAlgorithm::Default,
+                Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
+                Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
+                Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
+                _ => self.expected(
+                    "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
+                    self.peek_token(),
+                )?,
+            };
+            AlterTableOperation::Algorithm { equals, algorithm }
+        } else if self.parse_keyword(Keyword::AUTO_INCREMENT) {
+            let equals = self.consume_token(&Token::Eq);
+            let value = self.parse_number_value()?;
+            AlterTableOperation::AutoIncrement { equals, value }
+        } else if self.parse_keywords(&[Keyword::REPLICA, Keyword::IDENTITY]) {
+            let identity = if self.parse_keyword(Keyword::NONE) {
+                ReplicaIdentity::None
+            } else if self.parse_keyword(Keyword::FULL) {
+                ReplicaIdentity::Full
+            } else if self.parse_keyword(Keyword::DEFAULT) {
+                ReplicaIdentity::Default
+            } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
+                ReplicaIdentity::Index(self.parse_identifier()?)
+            } else {
+                return self.expected(
+                    "NONE, FULL, DEFAULT, or USING INDEX index_name after REPLICA IDENTITY",
+                    self.peek_token(),
+                );
+            };
+
+            AlterTableOperation::ReplicaIdentity { identity }
+        } else if self.parse_keywords(&[Keyword::VALIDATE, Keyword::CONSTRAINT]) {
+            let name = self.parse_identifier()?;
+            AlterTableOperation::ValidateConstraint { name }
         } else {
-            let options: Vec<SqlOption> =
+            let mut options =
                 self.parse_options_with_keywords(&[Keyword::SET, Keyword::TBLPROPERTIES])?;
             if !options.is_empty() {
                 AlterTableOperation::SetTblProperties {
                     table_properties: options,
                 }
             } else {
-                return self.expected(
-                    "ADD, RENAME, PARTITION, SWAP, DROP, or SET TBLPROPERTIES after ALTER TABLE",
+                options = self.parse_options(Keyword::SET)?;
+                if !options.is_empty() {
+                    AlterTableOperation::SetOptionsParens { options }
+                } else {
+                    return self.expected(
+                    "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, SET, or SET TBLPROPERTIES after ALTER TABLE",
                     self.peek_token(),
-                );
+                  );
+                }
             }
         };
         Ok(operation)
     }
 
+    fn parse_set_data_type(&mut self, had_set: bool) -> Result<AlterColumnOperation, ParserError> {
+        let data_type = self.parse_data_type()?;
+        let using = if self.dialect.supports_alter_column_type_using()
+            && self.parse_keyword(Keyword::USING)
+        {
+            Some(self.parse_expr()?)
+        } else {
+            None
+        };
+        Ok(AlterColumnOperation::SetDataType {
+            data_type,
+            using,
+            had_set,
+        })
+    }
+
     fn parse_part_or_partition(&mut self) -> Result<Partition, ParserError> {
         let keyword = self.expect_one_of_keywords(&[Keyword::PART, Keyword::PARTITION])?;
         match keyword {
@@ -7367,41 +9174,21 @@ impl<'a> Parser<'a> {
     pub fn parse_alter(&mut self) -> Result<Statement, ParserError> {
         let object_type = self.expect_one_of_keywords(&[
             Keyword::VIEW,
+            Keyword::TYPE,
             Keyword::TABLE,
             Keyword::INDEX,
             Keyword::ROLE,
             Keyword::POLICY,
+            Keyword::CONNECTOR,
+            Keyword::ICEBERG,
         ])?;
         match object_type {
             Keyword::VIEW => self.parse_alter_view(),
-            Keyword::TABLE => {
-                let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
-                let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
-                let table_name = self.parse_object_name(false)?;
-                let on_cluster = self.parse_optional_on_cluster()?;
-                let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
-
-                let mut location = None;
-                if self.parse_keyword(Keyword::LOCATION) {
-                    location = Some(HiveSetLocation {
-                        has_set: false,
-                        location: self.parse_identifier(false)?,
-                    });
-                } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
-                    location = Some(HiveSetLocation {
-                        has_set: true,
-                        location: self.parse_identifier(false)?,
-                    });
-                }
-
-                Ok(Statement::AlterTable {
-                    name: table_name,
-                    if_exists,
-                    only,
-                    operations,
-                    location,
-                    on_cluster,
-                })
+            Keyword::TYPE => self.parse_alter_type(),
+            Keyword::TABLE => self.parse_alter_table(false),
+            Keyword::ICEBERG => {
+                self.expect_keyword(Keyword::TABLE)?;
+                self.parse_alter_table(true)
             }
             Keyword::INDEX => {
                 let index_name = self.parse_object_name(false)?;
@@ -7423,18 +9210,51 @@ impl<'a> Parser<'a> {
             }
             Keyword::ROLE => self.parse_alter_role(),
             Keyword::POLICY => self.parse_alter_policy(),
+            Keyword::CONNECTOR => self.parse_alter_connector(),
             // unreachable because expect_one_of_keywords used above
             _ => unreachable!(),
         }
     }
 
+    /// Parse a [Statement::AlterTable]
+    pub fn parse_alter_table(&mut self, iceberg: bool) -> Result<Statement, ParserError> {
+        let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
+        let only = self.parse_keyword(Keyword::ONLY); // [ ONLY ]
+        let table_name = self.parse_object_name(false)?;
+        let on_cluster = self.parse_optional_on_cluster()?;
+        let operations = self.parse_comma_separated(Parser::parse_alter_table_operation)?;
+
+        let mut location = None;
+        if self.parse_keyword(Keyword::LOCATION) {
+            location = Some(HiveSetLocation {
+                has_set: false,
+                location: self.parse_identifier()?,
+            });
+        } else if self.parse_keywords(&[Keyword::SET, Keyword::LOCATION]) {
+            location = Some(HiveSetLocation {
+                has_set: true,
+                location: self.parse_identifier()?,
+            });
+        }
+
+        Ok(Statement::AlterTable {
+            name: table_name,
+            if_exists,
+            only,
+            operations,
+            location,
+            on_cluster,
+            iceberg,
+        })
+    }
+
     pub fn parse_alter_view(&mut self) -> Result<Statement, ParserError> {
         let name = self.parse_object_name(false)?;
         let columns = self.parse_parenthesized_column_list(Optional, false)?;
 
         let with_options = self.parse_options(Keyword::WITH)?;
 
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
         let query = self.parse_query()?;
 
         Ok(Statement::AlterView {
@@ -7445,6 +9265,55 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// Parse a [Statement::AlterType]
+    pub fn parse_alter_type(&mut self) -> Result<Statement, ParserError> {
+        let name = self.parse_object_name(false)?;
+
+        if self.parse_keywords(&[Keyword::RENAME, Keyword::TO]) {
+            let new_name = self.parse_identifier()?;
+            Ok(Statement::AlterType(AlterType {
+                name,
+                operation: AlterTypeOperation::Rename(AlterTypeRename { new_name }),
+            }))
+        } else if self.parse_keywords(&[Keyword::ADD, Keyword::VALUE]) {
+            let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+            let new_enum_value = self.parse_identifier()?;
+            let position = if self.parse_keyword(Keyword::BEFORE) {
+                Some(AlterTypeAddValuePosition::Before(self.parse_identifier()?))
+            } else if self.parse_keyword(Keyword::AFTER) {
+                Some(AlterTypeAddValuePosition::After(self.parse_identifier()?))
+            } else {
+                None
+            };
+
+            Ok(Statement::AlterType(AlterType {
+                name,
+                operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                    if_not_exists,
+                    value: new_enum_value,
+                    position,
+                }),
+            }))
+        } else if self.parse_keywords(&[Keyword::RENAME, Keyword::VALUE]) {
+            let existing_enum_value = self.parse_identifier()?;
+            self.expect_keyword(Keyword::TO)?;
+            let new_enum_value = self.parse_identifier()?;
+
+            Ok(Statement::AlterType(AlterType {
+                name,
+                operation: AlterTypeOperation::RenameValue(AlterTypeRenameValue {
+                    from: existing_enum_value,
+                    to: new_enum_value,
+                }),
+            }))
+        } else {
+            return self.expected_ref(
+                "{RENAME TO | { RENAME | ADD } VALUE}",
+                self.peek_token_ref(),
+            );
+        }
+    }
+
     /// Parse a `CALL procedure_name(arg1, arg2, ...)`
     /// or `CALL procedure_name` statement
     pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
@@ -7454,12 +9323,13 @@ impl<'a> Parser<'a> {
                 Expr::Function(f) => Ok(Statement::Call(f)),
                 other => parser_err!(
                     format!("Expected a simple procedure call but found: {other}"),
-                    self.peek_token().location
+                    self.peek_token().span.start
                 ),
             }
         } else {
             Ok(Statement::Call(Function {
                 name: object_name,
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::None,
                 over: None,
@@ -7537,11 +9407,19 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// Parse [Statement::Open]
+    fn parse_open(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keyword(Keyword::OPEN)?;
+        Ok(Statement::Open(OpenStatement {
+            cursor_name: self.parse_identifier()?,
+        }))
+    }
+
     pub fn parse_close(&mut self) -> Result<Statement, ParserError> {
         let cursor = if self.parse_keyword(Keyword::ALL) {
             CloseCursor::All
         } else {
-            let name = self.parse_identifier(false)?;
+            let name = self.parse_identifier()?;
 
             CloseCursor::Specific { name }
         };
@@ -7563,7 +9441,7 @@ impl<'a> Parser<'a> {
             Keyword::FORCE_NULL,
             Keyword::ENCODING,
         ]) {
-            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier(false)?),
+            Some(Keyword::FORMAT) => CopyOption::Format(self.parse_identifier()?),
             Some(Keyword::FREEZE) => CopyOption::Freeze(!matches!(
                 self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]),
                 Some(Keyword::FALSE)
@@ -7639,12 +9517,12 @@ impl<'a> Parser<'a> {
             }
             Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) => {
                 CopyLegacyCsvOption::ForceNotNull(
-                    self.parse_comma_separated(|p| p.parse_identifier(false))?,
+                    self.parse_comma_separated(|p| p.parse_identifier())?,
                 )
             }
             Some(Keyword::FORCE) if self.parse_keywords(&[Keyword::QUOTE]) => {
                 CopyLegacyCsvOption::ForceQuote(
-                    self.parse_comma_separated(|p| p.parse_identifier(false))?,
+                    self.parse_comma_separated(|p| p.parse_identifier())?,
                 )
             }
             _ => self.expected("csv option", self.peek_token())?,
@@ -7658,7 +9536,7 @@ impl<'a> Parser<'a> {
             let loc = self
                 .tokens
                 .get(self.index - 1)
-                .map_or(Location { line: 0, column: 0 }, |t| t.location);
+                .map_or(Location { line: 0, column: 0 }, |t| t.span.start);
             return parser_err!(format!("Expect a char, found {s:?}"), loc);
         }
         Ok(s.chars().next().unwrap())
@@ -7702,106 +9580,119 @@ impl<'a> Parser<'a> {
     }
 
     /// Parse a literal value (numbers, strings, date/time, booleans)
-    pub fn parse_value(&mut self) -> Result<Value, ParserError> {
+    pub fn parse_value(&mut self) -> Result<ValueWithSpan, ParserError> {
         let next_token = self.next_token();
-        let location = next_token.location;
+        let span = next_token.span;
+        let ok_value = |value: Value| Ok(value.with_span(span));
         match next_token.token {
             Token::Word(w) => match w.keyword {
                 Keyword::TRUE if self.dialect.supports_boolean_literals() => {
-                    Ok(Value::Boolean(true))
+                    ok_value(Value::Boolean(true))
                 }
                 Keyword::FALSE if self.dialect.supports_boolean_literals() => {
-                    Ok(Value::Boolean(false))
+                    ok_value(Value::Boolean(false))
                 }
-                Keyword::NULL => Ok(Value::Null),
+                Keyword::NULL => ok_value(Value::Null),
                 Keyword::NoKeyword if w.quote_style.is_some() => match w.quote_style {
-                    Some('"') => Ok(Value::DoubleQuotedString(w.value)),
-                    Some('\'') => Ok(Value::SingleQuotedString(w.value)),
+                    Some('"') => ok_value(Value::DoubleQuotedString(w.value)),
+                    Some('\'') => ok_value(Value::SingleQuotedString(w.value)),
                     _ => self.expected(
                         "A value?",
-                        TokenWithLocation {
+                        TokenWithSpan {
                             token: Token::Word(w),
-                            location,
+                            span,
                         },
                     )?,
                 },
                 _ => self.expected(
                     "a concrete value",
-                    TokenWithLocation {
+                    TokenWithSpan {
                         token: Token::Word(w),
-                        location,
+                        span,
                     },
                 ),
             },
             // The call to n.parse() returns a bigdecimal when the
             // bigdecimal feature is enabled, and is otherwise a no-op
             // (i.e., it returns the input string).
-            Token::Number(n, l) => Ok(Value::Number(Self::parse(n, location)?, l)),
-            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
-            Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
+            Token::Number(n, l) => ok_value(Value::Number(Self::parse(n, span.start)?, l)),
+            Token::SingleQuotedString(ref s) => ok_value(Value::SingleQuotedString(s.to_string())),
+            Token::DoubleQuotedString(ref s) => ok_value(Value::DoubleQuotedString(s.to_string())),
             Token::TripleSingleQuotedString(ref s) => {
-                Ok(Value::TripleSingleQuotedString(s.to_string()))
+                ok_value(Value::TripleSingleQuotedString(s.to_string()))
             }
             Token::TripleDoubleQuotedString(ref s) => {
-                Ok(Value::TripleDoubleQuotedString(s.to_string()))
+                ok_value(Value::TripleDoubleQuotedString(s.to_string()))
             }
-            Token::DollarQuotedString(ref s) => Ok(Value::DollarQuotedString(s.clone())),
+            Token::DollarQuotedString(ref s) => ok_value(Value::DollarQuotedString(s.clone())),
             Token::SingleQuotedByteStringLiteral(ref s) => {
-                Ok(Value::SingleQuotedByteStringLiteral(s.clone()))
+                ok_value(Value::SingleQuotedByteStringLiteral(s.clone()))
             }
             Token::DoubleQuotedByteStringLiteral(ref s) => {
-                Ok(Value::DoubleQuotedByteStringLiteral(s.clone()))
+                ok_value(Value::DoubleQuotedByteStringLiteral(s.clone()))
             }
             Token::TripleSingleQuotedByteStringLiteral(ref s) => {
-                Ok(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
+                ok_value(Value::TripleSingleQuotedByteStringLiteral(s.clone()))
             }
             Token::TripleDoubleQuotedByteStringLiteral(ref s) => {
-                Ok(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
+                ok_value(Value::TripleDoubleQuotedByteStringLiteral(s.clone()))
             }
             Token::SingleQuotedRawStringLiteral(ref s) => {
-                Ok(Value::SingleQuotedRawStringLiteral(s.clone()))
+                ok_value(Value::SingleQuotedRawStringLiteral(s.clone()))
             }
             Token::DoubleQuotedRawStringLiteral(ref s) => {
-                Ok(Value::DoubleQuotedRawStringLiteral(s.clone()))
+                ok_value(Value::DoubleQuotedRawStringLiteral(s.clone()))
             }
             Token::TripleSingleQuotedRawStringLiteral(ref s) => {
-                Ok(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
+                ok_value(Value::TripleSingleQuotedRawStringLiteral(s.clone()))
             }
             Token::TripleDoubleQuotedRawStringLiteral(ref s) => {
-                Ok(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
+                ok_value(Value::TripleDoubleQuotedRawStringLiteral(s.clone()))
+            }
+            Token::NationalStringLiteral(ref s) => {
+                ok_value(Value::NationalStringLiteral(s.to_string()))
+            }
+            Token::EscapedStringLiteral(ref s) => {
+                ok_value(Value::EscapedStringLiteral(s.to_string()))
+            }
+            Token::UnicodeStringLiteral(ref s) => {
+                ok_value(Value::UnicodeStringLiteral(s.to_string()))
             }
-            Token::NationalStringLiteral(ref s) => Ok(Value::NationalStringLiteral(s.to_string())),
-            Token::EscapedStringLiteral(ref s) => Ok(Value::EscapedStringLiteral(s.to_string())),
-            Token::UnicodeStringLiteral(ref s) => Ok(Value::UnicodeStringLiteral(s.to_string())),
-            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
-            Token::Placeholder(ref s) => Ok(Value::Placeholder(s.to_string())),
+            Token::HexStringLiteral(ref s) => ok_value(Value::HexStringLiteral(s.to_string())),
+            Token::Placeholder(ref s) => ok_value(Value::Placeholder(s.to_string())),
             tok @ Token::Colon | tok @ Token::AtSign => {
-                // Not calling self.parse_identifier(false)? because only in placeholder we want to check numbers as idfentifies
-                // This because snowflake allows numbers as placeholders
-                let next_token = self.next_token();
+                // 1. Not calling self.parse_identifier(false)?
+                //    because only in placeholder we want to check
+                //    numbers as idfentifies.  This because snowflake
+                //    allows numbers as placeholders
+                // 2. Not calling self.next_token() to enforce `tok`
+                //    be followed immediately by a word/number, ie.
+                //    without any whitespace in between
+                let next_token = self.next_token_no_skip().unwrap_or(&EOF_TOKEN).clone();
                 let ident = match next_token.token {
-                    Token::Word(w) => Ok(w.to_ident()),
-                    Token::Number(w, false) => Ok(Ident::new(w)),
+                    Token::Word(w) => Ok(w.into_ident(next_token.span)),
+                    Token::Number(w, false) => Ok(Ident::with_span(next_token.span, w)),
                     _ => self.expected("placeholder", next_token),
                 }?;
-                let placeholder = tok.to_string() + &ident.value;
-                Ok(Value::Placeholder(placeholder))
+                Ok(Value::Placeholder(tok.to_string() + &ident.value)
+                    .with_span(Span::new(span.start, ident.span.end)))
             }
             unexpected => self.expected(
                 "a value",
-                TokenWithLocation {
+                TokenWithSpan {
                     token: unexpected,
-                    location,
+                    span,
                 },
             ),
         }
     }
 
     /// Parse an unsigned numeric literal
-    pub fn parse_number_value(&mut self) -> Result<Value, ParserError> {
-        match self.parse_value()? {
-            v @ Value::Number(_, _) => Ok(v),
-            v @ Value::Placeholder(_) => Ok(v),
+    pub fn parse_number_value(&mut self) -> Result<ValueWithSpan, ParserError> {
+        let value_wrapper = self.parse_value()?;
+        match &value_wrapper.value {
+            Value::Number(_, _) => Ok(value_wrapper),
+            Value::Placeholder(_) => Ok(value_wrapper),
             _ => {
                 self.prev_token();
                 self.expected("literal number", self.peek_token())
@@ -7829,18 +9720,24 @@ impl<'a> Parser<'a> {
         }
     }
 
-    fn parse_introduced_string_value(&mut self) -> Result<Value, ParserError> {
+    fn parse_introduced_string_expr(&mut self) -> Result<Expr, ParserError> {
         let next_token = self.next_token();
-        let location = next_token.location;
+        let span = next_token.span;
         match next_token.token {
-            Token::SingleQuotedString(ref s) => Ok(Value::SingleQuotedString(s.to_string())),
-            Token::DoubleQuotedString(ref s) => Ok(Value::DoubleQuotedString(s.to_string())),
-            Token::HexStringLiteral(ref s) => Ok(Value::HexStringLiteral(s.to_string())),
+            Token::SingleQuotedString(ref s) => Ok(Expr::Value(
+                Value::SingleQuotedString(s.to_string()).with_span(span),
+            )),
+            Token::DoubleQuotedString(ref s) => Ok(Expr::Value(
+                Value::DoubleQuotedString(s.to_string()).with_span(span),
+            )),
+            Token::HexStringLiteral(ref s) => Ok(Expr::Value(
+                Value::HexStringLiteral(s.to_string()).with_span(span),
+            )),
             unexpected => self.expected(
                 "a string value",
-                TokenWithLocation {
+                TokenWithSpan {
                     token: unexpected,
-                    location,
+                    span,
                 },
             ),
         }
@@ -7850,7 +9747,7 @@ impl<'a> Parser<'a> {
     pub fn parse_literal_uint(&mut self) -> Result<u64, ParserError> {
         let next_token = self.next_token();
         match next_token.token {
-            Token::Number(s, _) => Self::parse::<u64>(s, next_token.location),
+            Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start),
             _ => self.expected("literal int", next_token),
         }
     }
@@ -7859,15 +9756,16 @@ impl<'a> Parser<'a> {
     /// e.g. `CREATE FUNCTION ... AS $$ body $$`.
     fn parse_create_function_body_string(&mut self) -> Result<Expr, ParserError> {
         let peek_token = self.peek_token();
+        let span = peek_token.span;
         match peek_token.token {
             Token::DollarQuotedString(s) if dialect_of!(self is PostgreSqlDialect | GenericDialect) =>
             {
                 self.next_token();
-                Ok(Expr::Value(Value::DollarQuotedString(s)))
+                Ok(Expr::Value(Value::DollarQuotedString(s).with_span(span)))
             }
-            _ => Ok(Expr::Value(Value::SingleQuotedString(
-                self.parse_literal_string()?,
-            ))),
+            _ => Ok(Expr::Value(
+                Value::SingleQuotedString(self.parse_literal_string()?).with_span(span),
+            )),
         }
     }
 
@@ -7890,6 +9788,59 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse a boolean string
+    pub(crate) fn parse_boolean_string(&mut self) -> Result<bool, ParserError> {
+        match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
+            Some(Keyword::TRUE) => Ok(true),
+            Some(Keyword::FALSE) => Ok(false),
+            _ => self.expected("TRUE or FALSE", self.peek_token()),
+        }
+    }
+
+    /// Parse a literal unicode normalization clause
+    pub fn parse_unicode_is_normalized(&mut self, expr: Expr) -> Result<Expr, ParserError> {
+        let neg = self.parse_keyword(Keyword::NOT);
+        let normalized_form = self.maybe_parse(|parser| {
+            match parser.parse_one_of_keywords(&[
+                Keyword::NFC,
+                Keyword::NFD,
+                Keyword::NFKC,
+                Keyword::NFKD,
+            ]) {
+                Some(Keyword::NFC) => Ok(NormalizationForm::NFC),
+                Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
+                Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
+                Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
+                _ => parser.expected("unicode normalization form", parser.peek_token()),
+            }
+        })?;
+        if self.parse_keyword(Keyword::NORMALIZED) {
+            return Ok(Expr::IsNormalized {
+                expr: Box::new(expr),
+                form: normalized_form,
+                negated: neg,
+            });
+        }
+        self.expected("unicode normalization form", self.peek_token())
+    }
+
+    pub fn parse_enum_values(&mut self) -> Result<Vec<EnumMember>, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let values = self.parse_comma_separated(|parser| {
+            let name = parser.parse_literal_string()?;
+            let e = if parser.consume_token(&Token::Eq) {
+                let value = parser.parse_number()?;
+                EnumMember::NamedValue(name, value)
+            } else {
+                EnumMember::Name(name)
+            };
+            Ok(e)
+        })?;
+        self.expect_token(&Token::RParen)?;
+
+        Ok(values)
+    }
+
     /// Parse a SQL datatype (in the context of a CREATE TABLE statement for example)
     pub fn parse_data_type(&mut self) -> Result<DataType, ParserError> {
         let (ty, trailing_bracket) = self.parse_data_type_helper()?;
@@ -7906,9 +9857,13 @@ impl<'a> Parser<'a> {
     fn parse_data_type_helper(
         &mut self,
     ) -> Result<(DataType, MatchedTrailingBracket), ParserError> {
-        let next_token = self.next_token();
+        let dialect = self.dialect;
+        self.advance_token();
+        let next_token = self.get_current_token();
+        let next_token_index = self.get_current_index();
+
         let mut trailing_bracket: MatchedTrailingBracket = false.into();
-        let mut data = match next_token.token {
+        let mut data = match &next_token.token {
             Token::Word(w) => match w.keyword {
                 Keyword::BOOLEAN => Ok(DataType::Boolean),
                 Keyword::BOOL => Ok(DataType::Bool),
@@ -7922,21 +9877,26 @@ impl<'a> Parser<'a> {
                     if self.parse_keyword(Keyword::PRECISION) {
                         Ok(DataType::DoublePrecision)
                     } else {
-                        Ok(DataType::Double)
+                        Ok(DataType::Double(
+                            self.parse_exact_number_optional_precision_scale()?,
+                        ))
                     }
                 }
                 Keyword::TINYINT => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedTinyInt(optional_precision?))
+                        Ok(DataType::TinyIntUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::TinyInt(optional_precision?))
                     }
                 }
                 Keyword::INT2 => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedInt2(optional_precision?))
+                        Ok(DataType::Int2Unsigned(optional_precision?))
                     } else {
                         Ok(DataType::Int2(optional_precision?))
                     }
@@ -7944,31 +9904,40 @@ impl<'a> Parser<'a> {
                 Keyword::SMALLINT => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedSmallInt(optional_precision?))
+                        Ok(DataType::SmallIntUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::SmallInt(optional_precision?))
                     }
                 }
                 Keyword::MEDIUMINT => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedMediumInt(optional_precision?))
+                        Ok(DataType::MediumIntUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::MediumInt(optional_precision?))
                     }
                 }
                 Keyword::INT => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedInt(optional_precision?))
+                        Ok(DataType::IntUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::Int(optional_precision?))
                     }
                 }
                 Keyword::INT4 => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedInt4(optional_precision?))
+                        Ok(DataType::Int4Unsigned(optional_precision?))
                     } else {
                         Ok(DataType::Int4(optional_precision?))
                     }
@@ -7976,7 +9945,7 @@ impl<'a> Parser<'a> {
                 Keyword::INT8 => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedInt8(optional_precision?))
+                        Ok(DataType::Int8Unsigned(optional_precision?))
                     } else {
                         Ok(DataType::Int8(optional_precision?))
                     }
@@ -7989,19 +9958,30 @@ impl<'a> Parser<'a> {
                 Keyword::INTEGER => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedInteger(optional_precision?))
+                        Ok(DataType::IntegerUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::Integer(optional_precision?))
                     }
                 }
                 Keyword::BIGINT => {
                     let optional_precision = self.parse_optional_precision();
                     if self.parse_keyword(Keyword::UNSIGNED) {
-                        Ok(DataType::UnsignedBigInt(optional_precision?))
+                        Ok(DataType::BigIntUnsigned(optional_precision?))
                     } else {
+                        if dialect.supports_data_type_signed_suffix() {
+                            let _ = self.parse_keyword(Keyword::SIGNED);
+                        }
                         Ok(DataType::BigInt(optional_precision?))
                     }
                 }
+                Keyword::HUGEINT => Ok(DataType::HugeInt),
+                Keyword::UBIGINT => Ok(DataType::UBigInt),
+                Keyword::UHUGEINT => Ok(DataType::UHugeInt),
+                Keyword::USMALLINT => Ok(DataType::USmallInt),
+                Keyword::UTINYINT => Ok(DataType::UTinyInt),
                 Keyword::UINT8 => Ok(DataType::UInt8),
                 Keyword::UINT16 => Ok(DataType::UInt16),
                 Keyword::UINT32 => Ok(DataType::UInt32),
@@ -8038,9 +10018,20 @@ impl<'a> Parser<'a> {
                 }
                 Keyword::CLOB => Ok(DataType::Clob(self.parse_optional_precision()?)),
                 Keyword::BINARY => Ok(DataType::Binary(self.parse_optional_precision()?)),
-                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_precision()?)),
+                Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_optional_binary_length()?)),
                 Keyword::BLOB => Ok(DataType::Blob(self.parse_optional_precision()?)),
+                Keyword::TINYBLOB => Ok(DataType::TinyBlob),
+                Keyword::MEDIUMBLOB => Ok(DataType::MediumBlob),
+                Keyword::LONGBLOB => Ok(DataType::LongBlob),
                 Keyword::BYTES => Ok(DataType::Bytes(self.parse_optional_precision()?)),
+                Keyword::BIT => {
+                    if self.parse_keyword(Keyword::VARYING) {
+                        Ok(DataType::BitVarying(self.parse_optional_precision()?))
+                    } else {
+                        Ok(DataType::Bit(self.parse_optional_precision()?))
+                    }
+                }
+                Keyword::VARBIT => Ok(DataType::VarBit(self.parse_optional_precision()?)),
                 Keyword::UUID => Ok(DataType::Uuid),
                 Keyword::DATE => Ok(DataType::Date),
                 Keyword::DATE32 => Ok(DataType::Date32),
@@ -8067,6 +10058,7 @@ impl<'a> Parser<'a> {
                     self.parse_optional_precision()?,
                     TimezoneInfo::Tz,
                 )),
+                Keyword::TIMESTAMP_NTZ => Ok(DataType::TimestampNtz),
                 Keyword::TIME => {
                     let precision = self.parse_optional_precision()?;
                     let tz = if self.parse_keyword(Keyword::WITH) {
@@ -8084,10 +10076,18 @@ impl<'a> Parser<'a> {
                     self.parse_optional_precision()?,
                     TimezoneInfo::Tz,
                 )),
-                // Interval types can be followed by a complicated interval
-                // qualifier that we don't currently support. See
-                // parse_interval for a taste.
-                Keyword::INTERVAL => Ok(DataType::Interval),
+                Keyword::INTERVAL => {
+                    if self.dialect.supports_interval_options() {
+                        let fields = self.maybe_parse_optional_interval_fields()?;
+                        let precision = self.parse_optional_precision()?;
+                        Ok(DataType::Interval { fields, precision })
+                    } else {
+                        Ok(DataType::Interval {
+                            fields: None,
+                            precision: None,
+                        })
+                    }
+                }
                 Keyword::JSON => Ok(DataType::JSON),
                 Keyword::JSONB => Ok(DataType::JSONB),
                 Keyword::REGCLASS => Ok(DataType::Regclass),
@@ -8099,6 +10099,9 @@ impl<'a> Parser<'a> {
                     Ok(DataType::FixedString(character_length))
                 }
                 Keyword::TEXT => Ok(DataType::Text),
+                Keyword::TINYTEXT => Ok(DataType::TinyText),
+                Keyword::MEDIUMTEXT => Ok(DataType::MediumText),
+                Keyword::LONGTEXT => Ok(DataType::LongText),
                 Keyword::BYTEA => Ok(DataType::Bytea),
                 Keyword::NUMERIC => Ok(DataType::Numeric(
                     self.parse_exact_number_optional_precision_scale()?,
@@ -8115,7 +10118,9 @@ impl<'a> Parser<'a> {
                 Keyword::BIGDECIMAL => Ok(DataType::BigDecimal(
                     self.parse_exact_number_optional_precision_scale()?,
                 )),
-                Keyword::ENUM => Ok(DataType::Enum(self.parse_string_values()?)),
+                Keyword::ENUM => Ok(DataType::Enum(self.parse_enum_values()?, None)),
+                Keyword::ENUM8 => Ok(DataType::Enum(self.parse_enum_values()?, Some(8))),
+                Keyword::ENUM16 => Ok(DataType::Enum(self.parse_enum_values()?, Some(16))),
                 Keyword::SET => Ok(DataType::Set(self.parse_string_values()?)),
                 Keyword::ARRAY => {
                     if dialect_of!(self is SnowflakeDialect) {
@@ -8133,12 +10138,12 @@ impl<'a> Parser<'a> {
                         ))))
                     }
                 }
-                Keyword::STRUCT if dialect_of!(self is DuckDbDialect) => {
+                Keyword::STRUCT if dialect_is!(dialect is DuckDbDialect) => {
                     self.prev_token();
                     let field_defs = self.parse_duckdb_struct_type_def()?;
                     Ok(DataType::Struct(field_defs, StructBracketKind::Parentheses))
                 }
-                Keyword::STRUCT if dialect_of!(self is BigQueryDialect | GenericDialect) => {
+                Keyword::STRUCT if dialect_is!(dialect is BigQueryDialect | GenericDialect) => {
                     self.prev_token();
                     let (field_defs, _trailing_bracket) =
                         self.parse_struct_type_def(Self::parse_struct_field_def)?;
@@ -8148,18 +10153,18 @@ impl<'a> Parser<'a> {
                         StructBracketKind::AngleBrackets,
                     ))
                 }
-                Keyword::UNION if dialect_of!(self is DuckDbDialect | GenericDialect) => {
+                Keyword::UNION if dialect_is!(dialect is DuckDbDialect | GenericDialect) => {
                     self.prev_token();
                     let fields = self.parse_union_type_def()?;
                     Ok(DataType::Union(fields))
                 }
-                Keyword::NULLABLE if dialect_of!(self is ClickHouseDialect | GenericDialect) => {
+                Keyword::NULLABLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
                     Ok(self.parse_sub_type(DataType::Nullable)?)
                 }
-                Keyword::LOWCARDINALITY if dialect_of!(self is ClickHouseDialect | GenericDialect) => {
+                Keyword::LOWCARDINALITY if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
                     Ok(self.parse_sub_type(DataType::LowCardinality)?)
                 }
-                Keyword::MAP if dialect_of!(self is ClickHouseDialect | GenericDialect) => {
+                Keyword::MAP if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
                     self.prev_token();
                     let (key_data_type, value_data_type) = self.parse_click_house_map_def()?;
                     Ok(DataType::Map(
@@ -8167,18 +10172,52 @@ impl<'a> Parser<'a> {
                         Box::new(value_data_type),
                     ))
                 }
-                Keyword::NESTED if dialect_of!(self is ClickHouseDialect | GenericDialect) => {
+                Keyword::NESTED if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
                     self.expect_token(&Token::LParen)?;
                     let field_defs = self.parse_comma_separated(Parser::parse_column_def)?;
                     self.expect_token(&Token::RParen)?;
                     Ok(DataType::Nested(field_defs))
                 }
-                Keyword::TUPLE if dialect_of!(self is ClickHouseDialect | GenericDialect) => {
+                Keyword::TUPLE if dialect_is!(dialect is ClickHouseDialect | GenericDialect) => {
                     self.prev_token();
                     let field_defs = self.parse_click_house_tuple_def()?;
                     Ok(DataType::Tuple(field_defs))
                 }
                 Keyword::TRIGGER => Ok(DataType::Trigger),
+                Keyword::ANY if self.peek_keyword(Keyword::TYPE) => {
+                    let _ = self.parse_keyword(Keyword::TYPE);
+                    Ok(DataType::AnyType)
+                }
+                Keyword::TABLE => {
+                    // an LParen after the TABLE keyword indicates that table columns are being defined
+                    // whereas no LParen indicates an anonymous table expression will be returned
+                    if self.peek_token() == Token::LParen {
+                        let columns = self.parse_returns_table_columns()?;
+                        Ok(DataType::Table(Some(columns)))
+                    } else {
+                        Ok(DataType::Table(None))
+                    }
+                }
+                Keyword::SIGNED => {
+                    if self.parse_keyword(Keyword::INTEGER) {
+                        Ok(DataType::SignedInteger)
+                    } else {
+                        Ok(DataType::Signed)
+                    }
+                }
+                Keyword::UNSIGNED => {
+                    if self.parse_keyword(Keyword::INTEGER) {
+                        Ok(DataType::UnsignedInteger)
+                    } else {
+                        Ok(DataType::Unsigned)
+                    }
+                }
+                Keyword::TSVECTOR if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
+                    Ok(DataType::TsVector)
+                }
+                Keyword::TSQUERY if dialect_is!(dialect is PostgreSqlDialect | GenericDialect) => {
+                    Ok(DataType::TsQuery)
+                }
                 _ => {
                     self.prev_token();
                     let type_name = self.parse_object_name(false)?;
@@ -8189,23 +10228,31 @@ impl<'a> Parser<'a> {
                     }
                 }
             },
-            _ => self.expected("a data type name", next_token),
+            _ => self.expected_at("a data type name", next_token_index),
         }?;
 
-        // Parse array data types. Note: this is postgresql-specific and different from
-        // Keyword::ARRAY syntax from above
-        while self.consume_token(&Token::LBracket) {
-            let size = if dialect_of!(self is GenericDialect | DuckDbDialect | PostgreSqlDialect) {
-                self.maybe_parse(|p| p.parse_literal_uint())?
-            } else {
-                None
-            };
-            self.expect_token(&Token::RBracket)?;
-            data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
+        if self.dialect.supports_array_typedef_with_brackets() {
+            while self.consume_token(&Token::LBracket) {
+                // Parse optional array data type size
+                let size = self.maybe_parse(|p| p.parse_literal_uint())?;
+                self.expect_token(&Token::RBracket)?;
+                data = DataType::Array(ArrayElemTypeDef::SquareBracket(Box::new(data), size))
+            }
         }
         Ok((data, trailing_bracket))
     }
 
+    fn parse_returns_table_column(&mut self) -> Result<ColumnDef, ParserError> {
+        self.parse_column_def()
+    }
+
+    fn parse_returns_table_columns(&mut self) -> Result<Vec<ColumnDef>, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let columns = self.parse_comma_separated(Parser::parse_returns_table_column)?;
+        self.expect_token(&Token::RParen)?;
+        Ok(columns)
+    }
+
     pub fn parse_string_values(&mut self) -> Result<Vec<String>, ParserError> {
         self.expect_token(&Token::LParen)?;
         let mut values = Vec::new();
@@ -8227,44 +10274,182 @@ impl<'a> Parser<'a> {
 
     /// Strictly parse `identifier AS identifier`
     pub fn parse_identifier_with_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
-        let ident = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::AS)?;
-        let alias = self.parse_identifier(false)?;
+        let ident = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::AS)?;
+        let alias = self.parse_identifier()?;
+        Ok(IdentWithAlias { ident, alias })
+    }
+
+    /// Parse `identifier [AS] identifier` where the AS keyword is optional
+    fn parse_identifier_with_optional_alias(&mut self) -> Result<IdentWithAlias, ParserError> {
+        let ident = self.parse_identifier()?;
+        let _after_as = self.parse_keyword(Keyword::AS);
+        let alias = self.parse_identifier()?;
         Ok(IdentWithAlias { ident, alias })
     }
 
-    /// Parse `AS identifier` (or simply `identifier` if it's not a reserved keyword)
-    /// Some examples with aliases: `SELECT 1 foo`, `SELECT COUNT(*) AS cnt`,
-    /// `SELECT ... FROM t1 foo, t2 bar`, `SELECT ... FROM (...) AS bar`
+    /// Parse comma-separated list of parenthesized queries for pipe operators
+    fn parse_pipe_operator_queries(&mut self) -> Result<Vec<Query>, ParserError> {
+        self.parse_comma_separated(|parser| {
+            parser.expect_token(&Token::LParen)?;
+            let query = parser.parse_query()?;
+            parser.expect_token(&Token::RParen)?;
+            Ok(*query)
+        })
+    }
+
+    /// Parse set quantifier for pipe operators that require DISTINCT. E.g. INTERSECT and EXCEPT
+    fn parse_distinct_required_set_quantifier(
+        &mut self,
+        operator_name: &str,
+    ) -> Result<SetQuantifier, ParserError> {
+        let quantifier = self.parse_set_quantifier(&Some(SetOperator::Intersect));
+        match quantifier {
+            SetQuantifier::Distinct | SetQuantifier::DistinctByName => Ok(quantifier),
+            _ => Err(ParserError::ParserError(format!(
+                "{operator_name} pipe operator requires DISTINCT modifier",
+            ))),
+        }
+    }
+
+    /// Parse optional identifier alias (with or without AS keyword)
+    fn parse_identifier_optional_alias(&mut self) -> Result<Option<Ident>, ParserError> {
+        if self.parse_keyword(Keyword::AS) {
+            Ok(Some(self.parse_identifier()?))
+        } else {
+            // Check if the next token is an identifier (implicit alias)
+            self.maybe_parse(|parser| parser.parse_identifier())
+        }
+    }
+
+    /// Optionally parses an alias for a select list item
+    fn maybe_parse_select_item_alias(&mut self) -> Result<Option<Ident>, ParserError> {
+        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
+            parser.dialect.is_select_item_alias(explicit, kw, parser)
+        }
+        self.parse_optional_alias_inner(None, validator)
+    }
+
+    /// Optionally parses an alias for a table like in `... FROM generate_series(1, 10) AS t (col)`.
+    /// In this case, the alias is allowed to optionally name the columns in the table, in
+    /// addition to the table itself.
+    pub fn maybe_parse_table_alias(&mut self) -> Result<Option<TableAlias>, ParserError> {
+        fn validator(explicit: bool, kw: &Keyword, parser: &mut Parser) -> bool {
+            parser.dialect.is_table_factor_alias(explicit, kw, parser)
+        }
+        match self.parse_optional_alias_inner(None, validator)? {
+            Some(name) => {
+                let columns = self.parse_table_alias_column_defs()?;
+                Ok(Some(TableAlias { name, columns }))
+            }
+            None => Ok(None),
+        }
+    }
+
+    fn parse_table_index_hints(&mut self) -> Result<Vec<TableIndexHints>, ParserError> {
+        let mut hints = vec![];
+        while let Some(hint_type) =
+            self.parse_one_of_keywords(&[Keyword::USE, Keyword::IGNORE, Keyword::FORCE])
+        {
+            let hint_type = match hint_type {
+                Keyword::USE => TableIndexHintType::Use,
+                Keyword::IGNORE => TableIndexHintType::Ignore,
+                Keyword::FORCE => TableIndexHintType::Force,
+                _ => {
+                    return self.expected(
+                        "expected to match USE/IGNORE/FORCE keyword",
+                        self.peek_token(),
+                    )
+                }
+            };
+            let index_type = match self.parse_one_of_keywords(&[Keyword::INDEX, Keyword::KEY]) {
+                Some(Keyword::INDEX) => TableIndexType::Index,
+                Some(Keyword::KEY) => TableIndexType::Key,
+                _ => {
+                    return self.expected("expected to match INDEX/KEY keyword", self.peek_token())
+                }
+            };
+            let for_clause = if self.parse_keyword(Keyword::FOR) {
+                let clause = if self.parse_keyword(Keyword::JOIN) {
+                    TableIndexHintForClause::Join
+                } else if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
+                    TableIndexHintForClause::OrderBy
+                } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
+                    TableIndexHintForClause::GroupBy
+                } else {
+                    return self.expected(
+                        "expected to match FOR/ORDER BY/GROUP BY table hint in for clause",
+                        self.peek_token(),
+                    );
+                };
+                Some(clause)
+            } else {
+                None
+            };
+
+            self.expect_token(&Token::LParen)?;
+            let index_names = if self.peek_token().token != Token::RParen {
+                self.parse_comma_separated(Parser::parse_identifier)?
+            } else {
+                vec![]
+            };
+            self.expect_token(&Token::RParen)?;
+            hints.push(TableIndexHints {
+                hint_type,
+                index_type,
+                for_clause,
+                index_names,
+            });
+        }
+        Ok(hints)
+    }
+
+    /// Wrapper for parse_optional_alias_inner, left for backwards-compatibility
+    /// but new flows should use the context-specific methods such as `maybe_parse_select_item_alias`
+    /// and `maybe_parse_table_alias`.
     pub fn parse_optional_alias(
         &mut self,
         reserved_kwds: &[Keyword],
     ) -> Result<Option<Ident>, ParserError> {
+        fn validator(_explicit: bool, _kw: &Keyword, _parser: &mut Parser) -> bool {
+            false
+        }
+        self.parse_optional_alias_inner(Some(reserved_kwds), validator)
+    }
+
+    /// Parses an optional alias after a SQL element such as a select list item
+    /// or a table name.
+    ///
+    /// This method accepts an optional list of reserved keywords or a function
+    /// to call to validate if a keyword should be parsed as an alias, to allow
+    /// callers to customize the parsing logic based on their context.
+    fn parse_optional_alias_inner<F>(
+        &mut self,
+        reserved_kwds: Option<&[Keyword]>,
+        validator: F,
+    ) -> Result<Option<Ident>, ParserError>
+    where
+        F: Fn(bool, &Keyword, &mut Parser) -> bool,
+    {
         let after_as = self.parse_keyword(Keyword::AS);
+
         let next_token = self.next_token();
         match next_token.token {
-            // Accept any identifier after `AS` (though many dialects have restrictions on
-            // keywords that may appear here). If there's no `AS`: don't parse keywords,
-            // which may start a construct allowed in this position, to be parsed as aliases.
-            // (For example, in `FROM t1 JOIN` the `JOIN` will always be parsed as a keyword,
-            // not an alias.)
-            Token::Word(w) if after_as || !reserved_kwds.contains(&w.keyword) => {
-                Ok(Some(w.to_ident()))
-            }
-            // MSSQL supports single-quoted strings as aliases for columns
-            // We accept them as table aliases too, although MSSQL does not.
-            //
-            // Note, that this conflicts with an obscure rule from the SQL
-            // standard, which we don't implement:
-            // https://crate.io/docs/sql-99/en/latest/chapters/07.html#character-string-literal-s
-            //    "[Obscure Rule] SQL allows you to break a long <character
-            //    string literal> up into two or more smaller <character string
-            //    literal>s, split by a <separator> that includes a newline
-            //    character. When it sees such a <literal>, your DBMS will
-            //    ignore the <separator> and treat the multiple strings as
-            //    a single <literal>."
+            // By default, if a word is located after the `AS` keyword we consider it an alias
+            // as long as it's not reserved.
+            Token::Word(w)
+                if after_as || reserved_kwds.is_some_and(|x| !x.contains(&w.keyword)) =>
+            {
+                Ok(Some(w.into_ident(next_token.span)))
+            }
+            // This pattern allows for customizing the acceptance of words as aliases based on the caller's
+            // context, such as to what SQL element this word is a potential alias of (select item alias, table name
+            // alias, etc.) or dialect-specific logic that goes beyond a simple list of reserved keywords.
+            Token::Word(w) if validator(after_as, &w.keyword, self) => {
+                Ok(Some(w.into_ident(next_token.span)))
+            }
+            // For backwards-compatibility, we accept quoted strings as aliases regardless of the context.
             Token::SingleQuotedString(s) => Ok(Some(Ident::with_quote('\'', s))),
-            // Support for MySql dialect double-quoted string, `AS "HOUR"` for example
             Token::DoubleQuotedString(s) => Ok(Some(Ident::with_quote('\"', s))),
             _ => {
                 if after_as {
@@ -8276,23 +10461,6 @@ impl<'a> Parser<'a> {
         }
     }
 
-    /// Parse `AS identifier` when the AS is describing a table-valued object,
-    /// like in `... FROM generate_series(1, 10) AS t (col)`. In this case
-    /// the alias is allowed to optionally name the columns in the table, in
-    /// addition to the table itself.
-    pub fn parse_optional_table_alias(
-        &mut self,
-        reserved_kwds: &[Keyword],
-    ) -> Result<Option<TableAlias>, ParserError> {
-        match self.parse_optional_alias(reserved_kwds)? {
-            Some(name) => {
-                let columns = self.parse_table_alias_column_defs()?;
-                Ok(Some(TableAlias { name, columns }))
-            }
-            None => Ok(None),
-        }
-    }
-
     pub fn parse_optional_group_by(&mut self) -> Result<Option<GroupByExpr>, ParserError> {
         if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
             let expressions = if self.parse_keyword(Keyword::ALL) {
@@ -8302,7 +10470,7 @@ impl<'a> Parser<'a> {
             };
 
             let mut modifiers = vec![];
-            if dialect_of!(self is ClickHouseDialect | GenericDialect) {
+            if self.dialect.supports_group_by_with_modifier() {
                 loop {
                     if !self.parse_keyword(Keyword::WITH) {
                         break;
@@ -8319,12 +10487,26 @@ impl<'a> Parser<'a> {
                         _ => {
                             return parser_err!(
                                 "BUG: expected to match GroupBy modifier keyword",
-                                self.peek_token().location
+                                self.peek_token().span.start
                             )
                         }
                     });
                 }
             }
+            if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
+                self.expect_token(&Token::LParen)?;
+                let result = self.parse_comma_separated(|p| {
+                    if p.peek_token_ref().token == Token::LParen {
+                        p.parse_tuple(true, true)
+                    } else {
+                        Ok(vec![p.parse_expr()?])
+                    }
+                })?;
+                self.expect_token(&Token::RParen)?;
+                modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
+                    result,
+                )));
+            };
             let group_by = match expressions {
                 None => GroupByExpr::All(modifiers),
                 Some(exprs) => GroupByExpr::Expressions(exprs, modifiers),
@@ -8337,22 +10519,97 @@ impl<'a> Parser<'a> {
 
     pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
         if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
-            let order_by_exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
-            let interpolate = if dialect_of!(self is ClickHouseDialect | GenericDialect) {
-                self.parse_interpolations()?
+            let order_by =
+                if self.dialect.supports_order_by_all() && self.parse_keyword(Keyword::ALL) {
+                    let order_by_options = self.parse_order_by_options()?;
+                    OrderBy {
+                        kind: OrderByKind::All(order_by_options),
+                        interpolate: None,
+                    }
+                } else {
+                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
+                    let interpolate = if dialect_of!(self is ClickHouseDialect | GenericDialect) {
+                        self.parse_interpolations()?
+                    } else {
+                        None
+                    };
+                    OrderBy {
+                        kind: OrderByKind::Expressions(exprs),
+                        interpolate,
+                    }
+                };
+            Ok(Some(order_by))
+        } else {
+            Ok(None)
+        }
+    }
+
+    fn parse_optional_limit_clause(&mut self) -> Result<Option<LimitClause>, ParserError> {
+        let mut offset = if self.parse_keyword(Keyword::OFFSET) {
+            Some(self.parse_offset()?)
+        } else {
+            None
+        };
+
+        let (limit, limit_by) = if self.parse_keyword(Keyword::LIMIT) {
+            let expr = self.parse_limit()?;
+
+            if self.dialect.supports_limit_comma()
+                && offset.is_none()
+                && expr.is_some() // ALL not supported with comma
+                && self.consume_token(&Token::Comma)
+            {
+                let offset = expr.ok_or_else(|| {
+                    ParserError::ParserError(
+                        "Missing offset for LIMIT <offset>, <limit>".to_string(),
+                    )
+                })?;
+                return Ok(Some(LimitClause::OffsetCommaLimit {
+                    offset,
+                    limit: self.parse_expr()?,
+                }));
+            }
+
+            let limit_by = if dialect_of!(self is ClickHouseDialect | GenericDialect)
+                && self.parse_keyword(Keyword::BY)
+            {
+                Some(self.parse_comma_separated(Parser::parse_expr)?)
             } else {
                 None
             };
 
-            Ok(Some(OrderBy {
-                exprs: order_by_exprs,
-                interpolate,
+            (Some(expr), limit_by)
+        } else {
+            (None, None)
+        };
+
+        if offset.is_none() && limit.is_some() && self.parse_keyword(Keyword::OFFSET) {
+            offset = Some(self.parse_offset()?);
+        }
+
+        if offset.is_some() || (limit.is_some() && limit != Some(None)) || limit_by.is_some() {
+            Ok(Some(LimitClause::LimitOffset {
+                limit: limit.unwrap_or_default(),
+                offset,
+                limit_by: limit_by.unwrap_or_default(),
             }))
         } else {
             Ok(None)
         }
     }
 
+    /// Parse a table object for insertion
+    /// e.g. `some_database.some_table` or `FUNCTION some_table_func(...)`
+    pub fn parse_table_object(&mut self) -> Result<TableObject, ParserError> {
+        if self.dialect.supports_insert_table_function() && self.parse_keyword(Keyword::FUNCTION) {
+            let fn_name = self.parse_object_name(false)?;
+            self.parse_function_call(fn_name)
+                .map(TableObject::TableFunction)
+        } else {
+            self.parse_object_name(false).map(TableObject::TableName)
+        }
+    }
+
     /// Parse a possibly qualified, possibly quoted identifier, e.g.
     /// `foo` or `myschema."table"
     ///
@@ -8360,49 +10617,118 @@ impl<'a> Parser<'a> {
     /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
     /// in this context on BigQuery.
     pub fn parse_object_name(&mut self, in_table_clause: bool) -> Result<ObjectName, ParserError> {
-        let mut idents = vec![];
-        loop {
-            idents.push(self.parse_identifier(in_table_clause)?);
-            if !self.consume_token(&Token::Period) {
-                break;
-            }
-        }
+        self.parse_object_name_inner(in_table_clause, false)
+    }
 
-        // BigQuery accepts any number of quoted identifiers of a table name.
-        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
-        if dialect_of!(self is BigQueryDialect)
-            && idents.iter().any(|ident| ident.value.contains('.'))
-        {
-            idents = idents
-                .into_iter()
-                .flat_map(|ident| {
-                    ident
+    /// Parse a possibly qualified, possibly quoted identifier, e.g.
+    /// `foo` or `myschema."table"
+    ///
+    /// The `in_table_clause` parameter indicates whether the object name is a table in a FROM, JOIN,
+    /// or similar table clause. Currently, this is used only to support unquoted hyphenated identifiers
+    /// in this context on BigQuery.
+    ///
+    /// The `allow_wildcards` parameter indicates whether to allow for wildcards in the object name
+    /// e.g. *, *.*, `foo`.*, or "foo"."bar"
+    fn parse_object_name_inner(
+        &mut self,
+        in_table_clause: bool,
+        allow_wildcards: bool,
+    ) -> Result<ObjectName, ParserError> {
+        let mut parts = vec![];
+        if dialect_of!(self is BigQueryDialect) && in_table_clause {
+            loop {
+                let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
+                parts.push(ObjectNamePart::Identifier(ident));
+                if !self.consume_token(&Token::Period) && !end_with_period {
+                    break;
+                }
+            }
+        } else {
+            loop {
+                if allow_wildcards && self.peek_token().token == Token::Mul {
+                    let span = self.next_token().span;
+                    parts.push(ObjectNamePart::Identifier(Ident {
+                        value: Token::Mul.to_string(),
+                        quote_style: None,
+                        span,
+                    }));
+                } else if dialect_of!(self is BigQueryDialect) && in_table_clause {
+                    let (ident, end_with_period) = self.parse_unquoted_hyphenated_identifier()?;
+                    parts.push(ObjectNamePart::Identifier(ident));
+                    if !self.consume_token(&Token::Period) && !end_with_period {
+                        break;
+                    }
+                } else if self.dialect.supports_object_name_double_dot_notation()
+                    && parts.len() == 1
+                    && matches!(self.peek_token().token, Token::Period)
+                {
+                    // Empty string here means default schema
+                    parts.push(ObjectNamePart::Identifier(Ident::new("")));
+                } else {
+                    let ident = self.parse_identifier()?;
+                    let part = if self
+                        .dialect
+                        .is_identifier_generating_function_name(&ident, &parts)
+                    {
+                        self.expect_token(&Token::LParen)?;
+                        let args: Vec<FunctionArg> =
+                            self.parse_comma_separated0(Self::parse_function_args, Token::RParen)?;
+                        self.expect_token(&Token::RParen)?;
+                        ObjectNamePart::Function(ObjectNamePartFunction { name: ident, args })
+                    } else {
+                        ObjectNamePart::Identifier(ident)
+                    };
+                    parts.push(part);
+                }
+
+                if !self.consume_token(&Token::Period) {
+                    break;
+                }
+            }
+        }
+
+        // BigQuery accepts any number of quoted identifiers of a table name.
+        // https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#quoted_identifiers
+        if dialect_of!(self is BigQueryDialect)
+            && parts.iter().any(|part| {
+                part.as_ident()
+                    .is_some_and(|ident| ident.value.contains('.'))
+            })
+        {
+            parts = parts
+                .into_iter()
+                .flat_map(|part| match part.as_ident() {
+                    Some(ident) => ident
                         .value
                         .split('.')
-                        .map(|value| Ident {
-                            value: value.into(),
-                            quote_style: ident.quote_style,
+                        .map(|value| {
+                            ObjectNamePart::Identifier(Ident {
+                                value: value.into(),
+                                quote_style: ident.quote_style,
+                                span: ident.span,
+                            })
                         })
-                        .collect::<Vec<_>>()
+                        .collect::<Vec<_>>(),
+                    None => vec![part],
                 })
                 .collect()
         }
 
-        Ok(ObjectName(idents))
+        Ok(ObjectName(parts))
     }
 
     /// Parse identifiers
     pub fn parse_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
         let mut idents = vec![];
         loop {
-            match self.peek_token().token {
+            match &self.peek_token_ref().token {
                 Token::Word(w) => {
-                    idents.push(w.to_ident());
+                    idents.push(w.clone().into_ident(self.peek_token_ref().span));
                 }
                 Token::EOF | Token::Eq => break,
                 _ => {}
             }
-            self.next_token();
+            self.advance_token();
         }
         Ok(idents)
     }
@@ -8450,8 +10776,9 @@ impl<'a> Parser<'a> {
         let mut idents = vec![];
 
         // expecting at least one word for identifier
-        match self.next_token().token {
-            Token::Word(w) => idents.push(w.to_ident()),
+        let next_token = self.next_token();
+        match next_token.token {
+            Token::Word(w) => idents.push(w.into_ident(next_token.span)),
             Token::EOF => {
                 return Err(ParserError::ParserError(
                     "Empty input when parsing identifier".to_string(),
@@ -8468,19 +10795,22 @@ impl<'a> Parser<'a> {
         loop {
             match self.next_token().token {
                 // ensure that optional period is succeeded by another identifier
-                Token::Period => match self.next_token().token {
-                    Token::Word(w) => idents.push(w.to_ident()),
-                    Token::EOF => {
-                        return Err(ParserError::ParserError(
-                            "Trailing period in identifier".to_string(),
-                        ))?
-                    }
-                    token => {
-                        return Err(ParserError::ParserError(format!(
-                            "Unexpected token following period in identifier: {token}"
-                        )))?
+                Token::Period => {
+                    let next_token = self.next_token();
+                    match next_token.token {
+                        Token::Word(w) => idents.push(w.into_ident(next_token.span)),
+                        Token::EOF => {
+                            return Err(ParserError::ParserError(
+                                "Trailing period in identifier".to_string(),
+                            ))?
+                        }
+                        token => {
+                            return Err(ParserError::ParserError(format!(
+                                "Unexpected token following period in identifier: {token}"
+                            )))?
+                        }
                     }
-                },
+                }
                 Token::EOF => break,
                 token => {
                     return Err(ParserError::ParserError(format!(
@@ -8494,29 +10824,33 @@ impl<'a> Parser<'a> {
     }
 
     /// Parse a simple one-word identifier (possibly quoted, possibly a keyword)
-    ///
-    /// The `in_table_clause` parameter indicates whether the identifier is a table in a FROM, JOIN, or
-    /// similar table clause. Currently, this is used only to support unquoted hyphenated identifiers in
-    //  this context on BigQuery.
-    pub fn parse_identifier(&mut self, in_table_clause: bool) -> Result<Ident, ParserError> {
+    pub fn parse_identifier(&mut self) -> Result<Ident, ParserError> {
         let next_token = self.next_token();
         match next_token.token {
-            Token::Word(w) => {
-                let mut ident = w.to_ident();
+            Token::Word(w) => Ok(w.into_ident(next_token.span)),
+            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
+            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
+            _ => self.expected("identifier", next_token),
+        }
+    }
 
-                // On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
-                // TABLE clause [0].
-                //
-                // The first segment must be an ordinary unquoted identifier, e.g. it must not start
-                // with a digit. Subsequent segments are either must either be valid identifiers or
-                // integers, e.g. foo-123 is allowed, but foo-123a is not.
-                //
-                // [0] https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical
-                if dialect_of!(self is BigQueryDialect)
-                    && w.quote_style.is_none()
-                    && in_table_clause
-                {
-                    let mut requires_whitespace = false;
+    /// On BigQuery, hyphens are permitted in unquoted identifiers inside of a FROM or
+    /// TABLE clause.
+    ///
+    /// The first segment must be an ordinary unquoted identifier, e.g. it must not start
+    /// with a digit. Subsequent segments are either must either be valid identifiers or
+    /// integers, e.g. foo-123 is allowed, but foo-123a is not.
+    ///
+    /// [BigQuery-lexical](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical)
+    ///
+    /// Return a tuple of the identifier and a boolean indicating it ends with a period.
+    fn parse_unquoted_hyphenated_identifier(&mut self) -> Result<(Ident, bool), ParserError> {
+        match self.peek_token().token {
+            Token::Word(w) => {
+                let quote_style_is_none = w.quote_style.is_none();
+                let mut requires_whitespace = false;
+                let mut ident = w.into_ident(self.next_token().span);
+                if quote_style_is_none {
                     while matches!(self.peek_token_no_skip().token, Token::Minus) {
                         self.next_token();
                         ident.value.push('-');
@@ -8524,15 +10858,36 @@ impl<'a> Parser<'a> {
                         let token = self
                             .next_token_no_skip()
                             .cloned()
-                            .unwrap_or(TokenWithLocation::wrap(Token::EOF));
+                            .unwrap_or(TokenWithSpan::wrap(Token::EOF));
                         requires_whitespace = match token.token {
                             Token::Word(next_word) if next_word.quote_style.is_none() => {
                                 ident.value.push_str(&next_word.value);
                                 false
                             }
-                            Token::Number(s, false) if s.chars().all(|c| c.is_ascii_digit()) => {
-                                ident.value.push_str(&s);
-                                true
+                            Token::Number(s, false) => {
+                                // A number token can represent a decimal value ending with a period, e.g., `Number('123.')`.
+                                // However, for an [ObjectName], it is part of a hyphenated identifier, e.g., `foo-123.bar`.
+                                //
+                                // If a number token is followed by a period, it is part of an [ObjectName].
+                                // Return the identifier with `true` if the number token is followed by a period, indicating that
+                                // parsing should continue for the next part of the hyphenated identifier.
+                                if s.ends_with('.') {
+                                    let Some(s) = s.split('.').next().filter(|s| {
+                                        !s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
+                                    }) else {
+                                        return self.expected(
+                                            "continuation of hyphenated identifier",
+                                            TokenWithSpan::new(Token::Number(s, false), token.span),
+                                        );
+                                    };
+                                    ident.value.push_str(s);
+                                    return Ok((ident, true));
+                                } else {
+                                    ident.value.push_str(&s);
+                                }
+                                // If next token is period, then it is part of an ObjectName and we don't expect whitespace
+                                // after the number.
+                                !matches!(self.peek_token().token, Token::Period)
                             }
                             _ => {
                                 return self
@@ -8551,11 +10906,9 @@ impl<'a> Parser<'a> {
                         }
                     }
                 }
-                Ok(ident)
+                Ok((ident, false))
             }
-            Token::SingleQuotedString(s) => Ok(Ident::with_quote('\'', s)),
-            Token::DoubleQuotedString(s) => Ok(Ident::with_quote('\"', s)),
-            _ => self.expected("identifier", next_token),
+            _ => Ok((self.parse_identifier()?, false)),
         }
     }
 
@@ -8566,7 +10919,11 @@ impl<'a> Parser<'a> {
                 self.next_token();
                 Ok(vec![])
             } else {
-                let cols = self.parse_comma_separated(Parser::parse_view_column)?;
+                let cols = self.parse_comma_separated_with_trailing_commas(
+                    Parser::parse_view_column,
+                    self.dialect.supports_column_definition_trailing_commas(),
+                    Self::is_reserved_for_column_alias,
+                )?;
                 self.expect_token(&Token::RParen)?;
                 Ok(cols)
             }
@@ -8577,18 +10934,8 @@ impl<'a> Parser<'a> {
 
     /// Parses a column definition within a view.
     fn parse_view_column(&mut self) -> Result<ViewColumnDef, ParserError> {
-        let name = self.parse_identifier(false)?;
-        let options = if (dialect_of!(self is BigQueryDialect | GenericDialect)
-            && self.parse_keyword(Keyword::OPTIONS))
-            || (dialect_of!(self is SnowflakeDialect | GenericDialect)
-                && self.parse_keyword(Keyword::COMMENT))
-        {
-            self.prev_token();
-            self.parse_optional_column_option()?
-                .map(|option| vec![option])
-        } else {
-            None
-        };
+        let name = self.parse_identifier()?;
+        let options = self.parse_view_column_options()?;
         let data_type = if dialect_of!(self is ClickHouseDialect) {
             Some(self.parse_data_type()?)
         } else {
@@ -8601,18 +10948,72 @@ impl<'a> Parser<'a> {
         })
     }
 
-    /// Parse a parenthesized comma-separated list of unqualified, possibly quoted identifiers
+    fn parse_view_column_options(&mut self) -> Result<Option<ColumnOptions>, ParserError> {
+        let mut options = Vec::new();
+        loop {
+            let option = self.parse_optional_column_option()?;
+            if let Some(option) = option {
+                options.push(option);
+            } else {
+                break;
+            }
+        }
+        if options.is_empty() {
+            Ok(None)
+        } else if self.dialect.supports_space_separated_column_options() {
+            Ok(Some(ColumnOptions::SpaceSeparated(options)))
+        } else {
+            Ok(Some(ColumnOptions::CommaSeparated(options)))
+        }
+    }
+
+    /// Parses a parenthesized comma-separated list of unqualified, possibly quoted identifiers.
+    /// For example: `(col1, "col 2", ...)`
     pub fn parse_parenthesized_column_list(
         &mut self,
         optional: IsOptional,
         allow_empty: bool,
     ) -> Result<Vec<Ident>, ParserError> {
+        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| p.parse_identifier())
+    }
+
+    /// Parses a parenthesized comma-separated list of index columns, which can be arbitrary
+    /// expressions with ordering information (and an opclass in some dialects).
+    fn parse_parenthesized_index_column_list(&mut self) -> Result<Vec<IndexColumn>, ParserError> {
+        self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
+            p.parse_create_index_expr()
+        })
+    }
+
+    /// Parses a parenthesized comma-separated list of qualified, possibly quoted identifiers.
+    /// For example: `(db1.sc1.tbl1.col1, db1.sc1.tbl1."col 2", ...)`
+    pub fn parse_parenthesized_qualified_column_list(
+        &mut self,
+        optional: IsOptional,
+        allow_empty: bool,
+    ) -> Result<Vec<ObjectName>, ParserError> {
+        self.parse_parenthesized_column_list_inner(optional, allow_empty, |p| {
+            p.parse_object_name(true)
+        })
+    }
+
+    /// Parses a parenthesized comma-separated list of columns using
+    /// the provided function to parse each element.
+    fn parse_parenthesized_column_list_inner<F, T>(
+        &mut self,
+        optional: IsOptional,
+        allow_empty: bool,
+        mut f: F,
+    ) -> Result<Vec<T>, ParserError>
+    where
+        F: FnMut(&mut Parser) -> Result<T, ParserError>,
+    {
         if self.consume_token(&Token::LParen) {
             if allow_empty && self.peek_token().token == Token::RParen {
                 self.next_token();
                 Ok(vec![])
             } else {
-                let cols = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+                let cols = self.parse_comma_separated(|p| f(p))?;
                 self.expect_token(&Token::RParen)?;
                 Ok(cols)
             }
@@ -8623,11 +11024,11 @@ impl<'a> Parser<'a> {
         }
     }
 
-    /// Parse a parenthesized comma-separated list of table alias column definitions.
+    /// Parses a parenthesized comma-separated list of table alias column definitions.
     fn parse_table_alias_column_defs(&mut self) -> Result<Vec<TableAliasColumnDef>, ParserError> {
         if self.consume_token(&Token::LParen) {
             let cols = self.parse_comma_separated(|p| {
-                let name = p.parse_identifier(false)?;
+                let name = p.parse_identifier()?;
                 let data_type = p.maybe_parse(|p| p.parse_data_type())?;
                 Ok(TableAliasColumnDef { name, data_type })
             })?;
@@ -8655,6 +11056,85 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn maybe_parse_optional_interval_fields(
+        &mut self,
+    ) -> Result<Option<IntervalFields>, ParserError> {
+        match self.parse_one_of_keywords(&[
+            // Can be followed by `TO` option
+            Keyword::YEAR,
+            Keyword::DAY,
+            Keyword::HOUR,
+            Keyword::MINUTE,
+            // No `TO` option
+            Keyword::MONTH,
+            Keyword::SECOND,
+        ]) {
+            Some(Keyword::YEAR) => {
+                if self.peek_keyword(Keyword::TO) {
+                    self.expect_keyword(Keyword::TO)?;
+                    self.expect_keyword(Keyword::MONTH)?;
+                    Ok(Some(IntervalFields::YearToMonth))
+                } else {
+                    Ok(Some(IntervalFields::Year))
+                }
+            }
+            Some(Keyword::DAY) => {
+                if self.peek_keyword(Keyword::TO) {
+                    self.expect_keyword(Keyword::TO)?;
+                    match self.expect_one_of_keywords(&[
+                        Keyword::HOUR,
+                        Keyword::MINUTE,
+                        Keyword::SECOND,
+                    ])? {
+                        Keyword::HOUR => Ok(Some(IntervalFields::DayToHour)),
+                        Keyword::MINUTE => Ok(Some(IntervalFields::DayToMinute)),
+                        Keyword::SECOND => Ok(Some(IntervalFields::DayToSecond)),
+                        _ => {
+                            self.prev_token();
+                            self.expected("HOUR, MINUTE, or SECOND", self.peek_token())
+                        }
+                    }
+                } else {
+                    Ok(Some(IntervalFields::Day))
+                }
+            }
+            Some(Keyword::HOUR) => {
+                if self.peek_keyword(Keyword::TO) {
+                    self.expect_keyword(Keyword::TO)?;
+                    match self.expect_one_of_keywords(&[Keyword::MINUTE, Keyword::SECOND])? {
+                        Keyword::MINUTE => Ok(Some(IntervalFields::HourToMinute)),
+                        Keyword::SECOND => Ok(Some(IntervalFields::HourToSecond)),
+                        _ => {
+                            self.prev_token();
+                            self.expected("MINUTE or SECOND", self.peek_token())
+                        }
+                    }
+                } else {
+                    Ok(Some(IntervalFields::Hour))
+                }
+            }
+            Some(Keyword::MINUTE) => {
+                if self.peek_keyword(Keyword::TO) {
+                    self.expect_keyword(Keyword::TO)?;
+                    self.expect_keyword(Keyword::SECOND)?;
+                    Ok(Some(IntervalFields::MinuteToSecond))
+                } else {
+                    Ok(Some(IntervalFields::Minute))
+                }
+            }
+            Some(Keyword::MONTH) => Ok(Some(IntervalFields::Month)),
+            Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
+            Some(_) => {
+                self.prev_token();
+                self.expected(
+                    "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
+                    self.peek_token(),
+                )
+            }
+            None => Ok(None),
+        }
+    }
+
     /// Parse datetime64 [1]
     /// Syntax
     /// ```sql
@@ -8663,7 +11143,7 @@ impl<'a> Parser<'a> {
     ///
     /// [1]: https://clickhouse.com/docs/en/sql-reference/data-types/datetime64
     pub fn parse_datetime_64(&mut self) -> Result<(u64, Option<String>), ParserError> {
-        self.expect_keyword(Keyword::DATETIME64)?;
+        self.expect_keyword_is(Keyword::DATETIME64)?;
         self.expect_token(&Token::LParen)?;
         let precision = self.parse_literal_uint()?;
         let time_zone = if self.consume_token(&Token::Comma) {
@@ -8687,6 +11167,16 @@ impl<'a> Parser<'a> {
         }
     }
 
+    pub fn parse_optional_binary_length(&mut self) -> Result<Option<BinaryLength>, ParserError> {
+        if self.consume_token(&Token::LParen) {
+            let binary_length = self.parse_binary_length()?;
+            self.expect_token(&Token::RParen)?;
+            Ok(Some(binary_length))
+        } else {
+            Ok(None)
+        }
+    }
+
     pub fn parse_character_length(&mut self) -> Result<CharacterLength, ParserError> {
         if self.parse_keyword(Keyword::MAX) {
             return Ok(CharacterLength::Max);
@@ -8702,6 +11192,14 @@ impl<'a> Parser<'a> {
         Ok(CharacterLength::IntegerLength { length, unit })
     }
 
+    pub fn parse_binary_length(&mut self) -> Result<BinaryLength, ParserError> {
+        if self.parse_keyword(Keyword::MAX) {
+            return Ok(BinaryLength::Max);
+        }
+        let length = self.parse_literal_uint()?;
+        Ok(BinaryLength::IntegerLength { length })
+    }
+
     pub fn parse_optional_precision_scale(
         &mut self,
     ) -> Result<(Option<u64>, Option<u64>), ParserError> {
@@ -8778,6 +11276,13 @@ impl<'a> Parser<'a> {
         Ok(parent_type(inside_type.into()))
     }
 
+    /// Parse a DELETE statement, returning a `Box`ed SetExpr
+    ///
+    /// This is used to reduce the size of the stack frames in debug builds
+    fn parse_delete_setexpr_boxed(&mut self) -> Result<Box<SetExpr>, ParserError> {
+        Ok(Box::new(SetExpr::Delete(self.parse_delete()?)))
+    }
+
     pub fn parse_delete(&mut self) -> Result<Statement, ParserError> {
         let (tables, with_from_keyword) = if !self.parse_keyword(Keyword::FROM) {
             // `FROM` keyword is optional in BigQuery SQL.
@@ -8786,7 +11291,7 @@ impl<'a> Parser<'a> {
                 (vec![], false)
             } else {
                 let tables = self.parse_comma_separated(|p| p.parse_object_name(false))?;
-                self.expect_keyword(Keyword::FROM)?;
+                self.expect_keyword_is(Keyword::FROM)?;
                 (tables, true)
             }
         } else {
@@ -8868,6 +11373,7 @@ impl<'a> Parser<'a> {
         let mut analyze = false;
         let mut verbose = false;
         let mut query_plan = false;
+        let mut estimate = false;
         let mut format = None;
         let mut options = None;
 
@@ -8880,11 +11386,13 @@ impl<'a> Parser<'a> {
             options = Some(self.parse_utility_options()?)
         } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
             query_plan = true;
+        } else if self.parse_keyword(Keyword::ESTIMATE) {
+            estimate = true;
         } else {
             analyze = self.parse_keyword(Keyword::ANALYZE);
             verbose = self.parse_keyword(Keyword::VERBOSE);
             if self.parse_keyword(Keyword::FORMAT) {
-                format = Some(self.parse_analyze_format()?);
+                format = Some(self.parse_analyze_format_kind()?);
             }
         }
 
@@ -8897,6 +11405,7 @@ impl<'a> Parser<'a> {
                 analyze,
                 verbose,
                 query_plan,
+                estimate,
                 statement: Box::new(statement),
                 format,
                 options,
@@ -8934,7 +11443,9 @@ impl<'a> Parser<'a> {
     pub fn parse_query(&mut self) -> Result<Box<Query>, ParserError> {
         let _guard = self.recursion_counter.try_decrease()?;
         let with = if self.parse_keyword(Keyword::WITH) {
+            let with_token = self.get_current_token();
             Some(With {
+                with_token: with_token.clone().into(),
                 recursive: self.parse_keyword(Keyword::RECURSIVE),
                 cte_tables: self.parse_comma_separated(Parser::parse_cte)?,
             })
@@ -8945,30 +11456,42 @@ impl<'a> Parser<'a> {
             Ok(Query {
                 with,
                 body: self.parse_insert_setexpr_boxed()?,
-                limit: None,
-                limit_by: vec![],
                 order_by: None,
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             }
             .into())
         } else if self.parse_keyword(Keyword::UPDATE) {
             Ok(Query {
                 with,
                 body: self.parse_update_setexpr_boxed()?,
-                limit: None,
-                limit_by: vec![],
                 order_by: None,
-                offset: None,
+                limit_clause: None,
+                fetch: None,
+                locks: vec![],
+                for_clause: None,
+                settings: None,
+                format_clause: None,
+                pipe_operators: vec![],
+            }
+            .into())
+        } else if self.parse_keyword(Keyword::DELETE) {
+            Ok(Query {
+                with,
+                body: self.parse_delete_setexpr_boxed()?,
+                limit_clause: None,
+                order_by: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             }
             .into())
         } else {
@@ -8976,40 +11499,7 @@ impl<'a> Parser<'a> {
 
             let order_by = self.parse_optional_order_by()?;
 
-            let mut limit = None;
-            let mut offset = None;
-
-            for _x in 0..2 {
-                if limit.is_none() && self.parse_keyword(Keyword::LIMIT) {
-                    limit = self.parse_limit()?
-                }
-
-                if offset.is_none() && self.parse_keyword(Keyword::OFFSET) {
-                    offset = Some(self.parse_offset()?)
-                }
-
-                if self.dialect.supports_limit_comma()
-                    && limit.is_some()
-                    && offset.is_none()
-                    && self.consume_token(&Token::Comma)
-                {
-                    // MySQL style LIMIT x,y => LIMIT y OFFSET x.
-                    // Check <https://dev.mysql.com/doc/refman/8.0/en/select.html> for more details.
-                    offset = Some(Offset {
-                        value: limit.unwrap(),
-                        rows: OffsetRows::None,
-                    });
-                    limit = Some(self.parse_expr()?);
-                }
-            }
-
-            let limit_by = if dialect_of!(self is ClickHouseDialect | GenericDialect)
-                && self.parse_keyword(Keyword::BY)
-            {
-                self.parse_comma_separated(Parser::parse_expr)?
-            } else {
-                vec![]
-            };
+            let limit_clause = self.parse_optional_limit_clause()?;
 
             let settings = self.parse_settings()?;
 
@@ -9035,89 +11525,313 @@ impl<'a> Parser<'a> {
                 if self.parse_keyword(Keyword::NULL) {
                     Some(FormatClause::Null)
                 } else {
-                    let ident = self.parse_identifier(false)?;
+                    let ident = self.parse_identifier()?;
                     Some(FormatClause::Identifier(ident))
                 }
             } else {
                 None
             };
 
+            let pipe_operators = if self.dialect.supports_pipe_operator() {
+                self.parse_pipe_operators()?
+            } else {
+                Vec::new()
+            };
+
             Ok(Query {
                 with,
                 body,
                 order_by,
-                limit,
-                limit_by,
-                offset,
+                limit_clause,
                 fetch,
                 locks,
                 for_clause,
                 settings,
                 format_clause,
+                pipe_operators,
             }
             .into())
         }
     }
 
-    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
-        let settings = if dialect_of!(self is ClickHouseDialect|GenericDialect)
-            && self.parse_keyword(Keyword::SETTINGS)
-        {
-            let key_values = self.parse_comma_separated(|p| {
-                let key = p.parse_identifier(false)?;
-                p.expect_token(&Token::Eq)?;
-                let value = p.parse_value()?;
-                Ok(Setting { key, value })
-            })?;
-            Some(key_values)
-        } else {
-            None
-        };
-        Ok(settings)
-    }
+    fn parse_pipe_operators(&mut self) -> Result<Vec<PipeOperator>, ParserError> {
+        let mut pipe_operators = Vec::new();
 
-    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
-    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
-        if self.parse_keyword(Keyword::XML) {
-            Ok(Some(self.parse_for_xml()?))
-        } else if self.parse_keyword(Keyword::JSON) {
-            Ok(Some(self.parse_for_json()?))
-        } else if self.parse_keyword(Keyword::BROWSE) {
-            Ok(Some(ForClause::Browse))
-        } else {
-            Ok(None)
-        }
-    }
+        while self.consume_token(&Token::VerticalBarRightAngleBracket) {
+            let kw = self.expect_one_of_keywords(&[
+                Keyword::SELECT,
+                Keyword::EXTEND,
+                Keyword::SET,
+                Keyword::DROP,
+                Keyword::AS,
+                Keyword::WHERE,
+                Keyword::LIMIT,
+                Keyword::AGGREGATE,
+                Keyword::ORDER,
+                Keyword::TABLESAMPLE,
+                Keyword::RENAME,
+                Keyword::UNION,
+                Keyword::INTERSECT,
+                Keyword::EXCEPT,
+                Keyword::CALL,
+                Keyword::PIVOT,
+                Keyword::UNPIVOT,
+                Keyword::JOIN,
+                Keyword::INNER,
+                Keyword::LEFT,
+                Keyword::RIGHT,
+                Keyword::FULL,
+                Keyword::CROSS,
+            ])?;
+            match kw {
+                Keyword::SELECT => {
+                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
+                    pipe_operators.push(PipeOperator::Select { exprs })
+                }
+                Keyword::EXTEND => {
+                    let exprs = self.parse_comma_separated(Parser::parse_select_item)?;
+                    pipe_operators.push(PipeOperator::Extend { exprs })
+                }
+                Keyword::SET => {
+                    let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
+                    pipe_operators.push(PipeOperator::Set { assignments })
+                }
+                Keyword::DROP => {
+                    let columns = self.parse_identifiers()?;
+                    pipe_operators.push(PipeOperator::Drop { columns })
+                }
+                Keyword::AS => {
+                    let alias = self.parse_identifier()?;
+                    pipe_operators.push(PipeOperator::As { alias })
+                }
+                Keyword::WHERE => {
+                    let expr = self.parse_expr()?;
+                    pipe_operators.push(PipeOperator::Where { expr })
+                }
+                Keyword::LIMIT => {
+                    let expr = self.parse_expr()?;
+                    let offset = if self.parse_keyword(Keyword::OFFSET) {
+                        Some(self.parse_expr()?)
+                    } else {
+                        None
+                    };
+                    pipe_operators.push(PipeOperator::Limit { expr, offset })
+                }
+                Keyword::AGGREGATE => {
+                    let full_table_exprs = if self.peek_keyword(Keyword::GROUP) {
+                        vec![]
+                    } else {
+                        self.parse_comma_separated(|parser| {
+                            parser.parse_expr_with_alias_and_order_by()
+                        })?
+                    };
 
-    /// Parse a mssql `FOR XML` clause
-    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
-        let for_xml = if self.parse_keyword(Keyword::RAW) {
-            let mut element_name = None;
-            if self.peek_token().token == Token::LParen {
-                self.expect_token(&Token::LParen)?;
-                element_name = Some(self.parse_literal_string()?);
-                self.expect_token(&Token::RParen)?;
-            }
-            ForXml::Raw(element_name)
-        } else if self.parse_keyword(Keyword::AUTO) {
-            ForXml::Auto
-        } else if self.parse_keyword(Keyword::EXPLICIT) {
-            ForXml::Explicit
-        } else if self.parse_keyword(Keyword::PATH) {
-            let mut element_name = None;
-            if self.peek_token().token == Token::LParen {
-                self.expect_token(&Token::LParen)?;
-                element_name = Some(self.parse_literal_string()?);
-                self.expect_token(&Token::RParen)?;
-            }
-            ForXml::Path(element_name)
-        } else {
-            return Err(ParserError::ParserError(
-                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
-            ));
-        };
-        let mut elements = false;
-        let mut binary_base64 = false;
+                    let group_by_expr = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
+                        self.parse_comma_separated(|parser| {
+                            parser.parse_expr_with_alias_and_order_by()
+                        })?
+                    } else {
+                        vec![]
+                    };
+
+                    pipe_operators.push(PipeOperator::Aggregate {
+                        full_table_exprs,
+                        group_by_expr,
+                    })
+                }
+                Keyword::ORDER => {
+                    self.expect_one_of_keywords(&[Keyword::BY])?;
+                    let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
+                    pipe_operators.push(PipeOperator::OrderBy { exprs })
+                }
+                Keyword::TABLESAMPLE => {
+                    let sample = self.parse_table_sample(TableSampleModifier::TableSample)?;
+                    pipe_operators.push(PipeOperator::TableSample { sample });
+                }
+                Keyword::RENAME => {
+                    let mappings =
+                        self.parse_comma_separated(Parser::parse_identifier_with_optional_alias)?;
+                    pipe_operators.push(PipeOperator::Rename { mappings });
+                }
+                Keyword::UNION => {
+                    let set_quantifier = self.parse_set_quantifier(&Some(SetOperator::Union));
+                    let queries = self.parse_pipe_operator_queries()?;
+                    pipe_operators.push(PipeOperator::Union {
+                        set_quantifier,
+                        queries,
+                    });
+                }
+                Keyword::INTERSECT => {
+                    let set_quantifier =
+                        self.parse_distinct_required_set_quantifier("INTERSECT")?;
+                    let queries = self.parse_pipe_operator_queries()?;
+                    pipe_operators.push(PipeOperator::Intersect {
+                        set_quantifier,
+                        queries,
+                    });
+                }
+                Keyword::EXCEPT => {
+                    let set_quantifier = self.parse_distinct_required_set_quantifier("EXCEPT")?;
+                    let queries = self.parse_pipe_operator_queries()?;
+                    pipe_operators.push(PipeOperator::Except {
+                        set_quantifier,
+                        queries,
+                    });
+                }
+                Keyword::CALL => {
+                    let function_name = self.parse_object_name(false)?;
+                    let function_expr = self.parse_function(function_name)?;
+                    if let Expr::Function(function) = function_expr {
+                        let alias = self.parse_identifier_optional_alias()?;
+                        pipe_operators.push(PipeOperator::Call { function, alias });
+                    } else {
+                        return Err(ParserError::ParserError(
+                            "Expected function call after CALL".to_string(),
+                        ));
+                    }
+                }
+                Keyword::PIVOT => {
+                    self.expect_token(&Token::LParen)?;
+                    let aggregate_functions =
+                        self.parse_comma_separated(Self::parse_aliased_function_call)?;
+                    self.expect_keyword_is(Keyword::FOR)?;
+                    let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
+                    self.expect_keyword_is(Keyword::IN)?;
+
+                    self.expect_token(&Token::LParen)?;
+                    let value_source = if self.parse_keyword(Keyword::ANY) {
+                        let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
+                            self.parse_comma_separated(Parser::parse_order_by_expr)?
+                        } else {
+                            vec![]
+                        };
+                        PivotValueSource::Any(order_by)
+                    } else if self.peek_sub_query() {
+                        PivotValueSource::Subquery(self.parse_query()?)
+                    } else {
+                        PivotValueSource::List(
+                            self.parse_comma_separated(Self::parse_expr_with_alias)?,
+                        )
+                    };
+                    self.expect_token(&Token::RParen)?;
+                    self.expect_token(&Token::RParen)?;
+
+                    let alias = self.parse_identifier_optional_alias()?;
+
+                    pipe_operators.push(PipeOperator::Pivot {
+                        aggregate_functions,
+                        value_column,
+                        value_source,
+                        alias,
+                    });
+                }
+                Keyword::UNPIVOT => {
+                    self.expect_token(&Token::LParen)?;
+                    let value_column = self.parse_identifier()?;
+                    self.expect_keyword(Keyword::FOR)?;
+                    let name_column = self.parse_identifier()?;
+                    self.expect_keyword(Keyword::IN)?;
+
+                    self.expect_token(&Token::LParen)?;
+                    let unpivot_columns = self.parse_comma_separated(Parser::parse_identifier)?;
+                    self.expect_token(&Token::RParen)?;
+
+                    self.expect_token(&Token::RParen)?;
+
+                    let alias = self.parse_identifier_optional_alias()?;
+
+                    pipe_operators.push(PipeOperator::Unpivot {
+                        value_column,
+                        name_column,
+                        unpivot_columns,
+                        alias,
+                    });
+                }
+                Keyword::JOIN
+                | Keyword::INNER
+                | Keyword::LEFT
+                | Keyword::RIGHT
+                | Keyword::FULL
+                | Keyword::CROSS => {
+                    self.prev_token();
+                    let mut joins = self.parse_joins()?;
+                    if joins.len() != 1 {
+                        return Err(ParserError::ParserError(
+                            "Join pipe operator must have a single join".to_string(),
+                        ));
+                    }
+                    let join = joins.swap_remove(0);
+                    pipe_operators.push(PipeOperator::Join(join))
+                }
+                unhandled => {
+                    return Err(ParserError::ParserError(format!(
+                    "`expect_one_of_keywords` further up allowed unhandled keyword: {unhandled:?}"
+                )))
+                }
+            }
+        }
+        Ok(pipe_operators)
+    }
+
+    fn parse_settings(&mut self) -> Result<Option<Vec<Setting>>, ParserError> {
+        let settings = if dialect_of!(self is ClickHouseDialect|GenericDialect)
+            && self.parse_keyword(Keyword::SETTINGS)
+        {
+            let key_values = self.parse_comma_separated(|p| {
+                let key = p.parse_identifier()?;
+                p.expect_token(&Token::Eq)?;
+                let value = p.parse_expr()?;
+                Ok(Setting { key, value })
+            })?;
+            Some(key_values)
+        } else {
+            None
+        };
+        Ok(settings)
+    }
+
+    /// Parse a mssql `FOR [XML | JSON | BROWSE]` clause
+    pub fn parse_for_clause(&mut self) -> Result<Option<ForClause>, ParserError> {
+        if self.parse_keyword(Keyword::XML) {
+            Ok(Some(self.parse_for_xml()?))
+        } else if self.parse_keyword(Keyword::JSON) {
+            Ok(Some(self.parse_for_json()?))
+        } else if self.parse_keyword(Keyword::BROWSE) {
+            Ok(Some(ForClause::Browse))
+        } else {
+            Ok(None)
+        }
+    }
+
+    /// Parse a mssql `FOR XML` clause
+    pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
+        let for_xml = if self.parse_keyword(Keyword::RAW) {
+            let mut element_name = None;
+            if self.peek_token().token == Token::LParen {
+                self.expect_token(&Token::LParen)?;
+                element_name = Some(self.parse_literal_string()?);
+                self.expect_token(&Token::RParen)?;
+            }
+            ForXml::Raw(element_name)
+        } else if self.parse_keyword(Keyword::AUTO) {
+            ForXml::Auto
+        } else if self.parse_keyword(Keyword::EXPLICIT) {
+            ForXml::Explicit
+        } else if self.parse_keyword(Keyword::PATH) {
+            let mut element_name = None;
+            if self.peek_token().token == Token::LParen {
+                self.expect_token(&Token::LParen)?;
+                element_name = Some(self.parse_literal_string()?);
+                self.expect_token(&Token::RParen)?;
+            }
+            ForXml::Path(element_name)
+        } else {
+            return Err(ParserError::ParserError(
+                "Expected FOR XML [RAW | AUTO | EXPLICIT | PATH ]".to_string(),
+            ));
+        };
+        let mut elements = false;
+        let mut binary_base64 = false;
         let mut root = None;
         let mut r#type = false;
         while self.peek_token().token == Token::Comma {
@@ -9125,7 +11839,7 @@ impl<'a> Parser<'a> {
             if self.parse_keyword(Keyword::ELEMENTS) {
                 elements = true;
             } else if self.parse_keyword(Keyword::BINARY) {
-                self.expect_keyword(Keyword::BASE64)?;
+                self.expect_keyword_is(Keyword::BASE64)?;
                 binary_base64 = true;
             } else if self.parse_keyword(Keyword::ROOT) {
                 self.expect_token(&Token::LParen)?;
@@ -9180,7 +11894,7 @@ impl<'a> Parser<'a> {
 
     /// Parse a CTE (`alias [( col1, col2, ... )] AS (subquery)`)
     pub fn parse_cte(&mut self) -> Result<Cte, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let mut cte = if self.parse_keyword(Keyword::AS) {
             let mut is_materialized = None;
@@ -9192,8 +11906,10 @@ impl<'a> Parser<'a> {
                 }
             }
             self.expect_token(&Token::LParen)?;
+
             let query = self.parse_query()?;
-            self.expect_token(&Token::RParen)?;
+            let closing_paren_token = self.expect_token(&Token::RParen)?;
+
             let alias = TableAlias {
                 name,
                 columns: vec![],
@@ -9203,10 +11919,11 @@ impl<'a> Parser<'a> {
                 query,
                 from: None,
                 materialized: is_materialized,
+                closing_paren_token: closing_paren_token.into(),
             }
         } else {
             let columns = self.parse_table_alias_column_defs()?;
-            self.expect_keyword(Keyword::AS)?;
+            self.expect_keyword_is(Keyword::AS)?;
             let mut is_materialized = None;
             if dialect_of!(self is PostgreSqlDialect) {
                 if self.parse_keyword(Keyword::MATERIALIZED) {
@@ -9216,18 +11933,21 @@ impl<'a> Parser<'a> {
                 }
             }
             self.expect_token(&Token::LParen)?;
+
             let query = self.parse_query()?;
-            self.expect_token(&Token::RParen)?;
+            let closing_paren_token = self.expect_token(&Token::RParen)?;
+
             let alias = TableAlias { name, columns };
             Cte {
                 alias,
                 query,
                 from: None,
                 materialized: is_materialized,
+                closing_paren_token: closing_paren_token.into(),
             }
         };
         if self.parse_keyword(Keyword::FROM) {
-            cte.from = Some(self.parse_identifier(false)?);
+            cte.from = Some(self.parse_identifier()?);
         }
         Ok(cte)
     }
@@ -9243,7 +11963,9 @@ impl<'a> Parser<'a> {
     pub fn parse_query_body(&mut self, precedence: u8) -> Result<Box<SetExpr>, ParserError> {
         // We parse the expression using a Pratt parser, as in `parse_expr()`.
         // Start by parsing a restricted SELECT or a `(subquery)`:
-        let expr = if self.parse_keyword(Keyword::SELECT) {
+        let expr = if self.peek_keyword(Keyword::SELECT)
+            || (self.peek_keyword(Keyword::FROM) && self.dialect.supports_from_first_select())
+        {
             SetExpr::Select(self.parse_select().map(Box::new)?)
         } else if self.consume_token(&Token::LParen) {
             // CTEs are not allowed here, but the parser currently accepts them
@@ -9278,7 +12000,9 @@ impl<'a> Parser<'a> {
             let op = self.parse_set_operator(&self.peek_token().token);
             let next_precedence = match op {
                 // UNION and EXCEPT have the same binding power and evaluate left-to-right
-                Some(SetOperator::Union) | Some(SetOperator::Except) => 10,
+                Some(SetOperator::Union) | Some(SetOperator::Except) | Some(SetOperator::Minus) => {
+                    10
+                }
                 // INTERSECT has higher precedence than UNION/EXCEPT
                 Some(SetOperator::Intersect) => 20,
                 // Unexpected token or EOF => stop parsing the query body
@@ -9305,13 +12029,19 @@ impl<'a> Parser<'a> {
             Token::Word(w) if w.keyword == Keyword::UNION => Some(SetOperator::Union),
             Token::Word(w) if w.keyword == Keyword::EXCEPT => Some(SetOperator::Except),
             Token::Word(w) if w.keyword == Keyword::INTERSECT => Some(SetOperator::Intersect),
+            Token::Word(w) if w.keyword == Keyword::MINUS => Some(SetOperator::Minus),
             _ => None,
         }
     }
 
     pub fn parse_set_quantifier(&mut self, op: &Option<SetOperator>) -> SetQuantifier {
         match op {
-            Some(SetOperator::Except | SetOperator::Intersect | SetOperator::Union) => {
+            Some(
+                SetOperator::Except
+                | SetOperator::Intersect
+                | SetOperator::Union
+                | SetOperator::Minus,
+            ) => {
                 if self.parse_keywords(&[Keyword::DISTINCT, Keyword::BY, Keyword::NAME]) {
                     SetQuantifier::DistinctByName
                 } else if self.parse_keywords(&[Keyword::BY, Keyword::NAME]) {
@@ -9332,21 +12062,44 @@ impl<'a> Parser<'a> {
         }
     }
 
-    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
-    /// assuming the initial `SELECT` was already consumed
+    /// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`)
     pub fn parse_select(&mut self) -> Result<Select, ParserError> {
-        let value_table_mode =
-            if dialect_of!(self is BigQueryDialect) && self.parse_keyword(Keyword::AS) {
-                if self.parse_keyword(Keyword::VALUE) {
-                    Some(ValueTableMode::AsValue)
-                } else if self.parse_keyword(Keyword::STRUCT) {
-                    Some(ValueTableMode::AsStruct)
-                } else {
-                    self.expected("VALUE or STRUCT", self.peek_token())?
-                }
-            } else {
-                None
-            };
+        let mut from_first = None;
+
+        if self.dialect.supports_from_first_select() && self.peek_keyword(Keyword::FROM) {
+            let from_token = self.expect_keyword(Keyword::FROM)?;
+            let from = self.parse_table_with_joins()?;
+            if !self.peek_keyword(Keyword::SELECT) {
+                return Ok(Select {
+                    select_token: AttachedToken(from_token),
+                    distinct: None,
+                    top: None,
+                    top_before_distinct: false,
+                    projection: vec![],
+                    exclude: None,
+                    into: None,
+                    from,
+                    lateral_views: vec![],
+                    prewhere: None,
+                    selection: None,
+                    group_by: GroupByExpr::Expressions(vec![], vec![]),
+                    cluster_by: vec![],
+                    distribute_by: vec![],
+                    sort_by: vec![],
+                    having: None,
+                    named_window: vec![],
+                    window_before_qualify: false,
+                    qualify: None,
+                    value_table_mode: None,
+                    connect_by: None,
+                    flavor: SelectFlavor::FromFirstNoSelect,
+                });
+            }
+            from_first = Some(from);
+        }
+
+        let select_token = self.expect_keyword(Keyword::SELECT)?;
+        let value_table_mode = self.parse_value_table_mode()?;
 
         let mut top_before_distinct = false;
         let mut top = None;
@@ -9359,21 +12112,21 @@ impl<'a> Parser<'a> {
             top = Some(self.parse_top()?);
         }
 
-        let projection = self.parse_projection()?;
+        let projection =
+            if self.dialect.supports_empty_projections() && self.peek_keyword(Keyword::FROM) {
+                vec![]
+            } else {
+                self.parse_projection()?
+            };
+
+        let exclude = if self.dialect.supports_select_exclude() {
+            self.parse_optional_select_item_exclude()?
+        } else {
+            None
+        };
 
         let into = if self.parse_keyword(Keyword::INTO) {
-            let temporary = self
-                .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
-                .is_some();
-            let unlogged = self.parse_keyword(Keyword::UNLOGGED);
-            let table = self.parse_keyword(Keyword::TABLE);
-            let name = self.parse_object_name(false)?;
-            Some(SelectInto {
-                temporary,
-                unlogged,
-                table,
-                name,
-            })
+            Some(self.parse_select_into()?)
         } else {
             None
         };
@@ -9383,10 +12136,12 @@ impl<'a> Parser<'a> {
         // otherwise they may be parsed as an alias as part of the `projection`
         // or `from`.
 
-        let from = if self.parse_keyword(Keyword::FROM) {
-            self.parse_comma_separated(Parser::parse_table_and_joins)?
+        let (from, from_first) = if let Some(from) = from_first.take() {
+            (from, true)
+        } else if self.parse_keyword(Keyword::FROM) {
+            (self.parse_table_with_joins()?, false)
         } else {
-            vec![]
+            (vec![], false)
         };
 
         let mut lateral_views = vec![];
@@ -9451,7 +12206,7 @@ impl<'a> Parser<'a> {
         };
 
         let sort_by = if self.parse_keywords(&[Keyword::SORT, Keyword::BY]) {
-            self.parse_comma_separated(Parser::parse_expr)?
+            self.parse_comma_separated(Parser::parse_order_by_expr)?
         } else {
             vec![]
         };
@@ -9498,10 +12253,12 @@ impl<'a> Parser<'a> {
         };
 
         Ok(Select {
+            select_token: AttachedToken(select_token),
             distinct,
             top,
             top_before_distinct,
             projection,
+            exclude,
             into,
             from,
             lateral_views,
@@ -9517,9 +12274,40 @@ impl<'a> Parser<'a> {
             qualify,
             value_table_mode,
             connect_by,
+            flavor: if from_first {
+                SelectFlavor::FromFirst
+            } else {
+                SelectFlavor::Standard
+            },
         })
     }
 
+    fn parse_value_table_mode(&mut self) -> Result<Option<ValueTableMode>, ParserError> {
+        if !dialect_of!(self is BigQueryDialect) {
+            return Ok(None);
+        }
+
+        let mode = if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::VALUE]) {
+            Some(ValueTableMode::DistinctAsValue)
+        } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::AS, Keyword::STRUCT]) {
+            Some(ValueTableMode::DistinctAsStruct)
+        } else if self.parse_keywords(&[Keyword::AS, Keyword::VALUE])
+            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::VALUE])
+        {
+            Some(ValueTableMode::AsValue)
+        } else if self.parse_keywords(&[Keyword::AS, Keyword::STRUCT])
+            || self.parse_keywords(&[Keyword::ALL, Keyword::AS, Keyword::STRUCT])
+        {
+            Some(ValueTableMode::AsStruct)
+        } else if self.parse_keyword(Keyword::AS) {
+            self.expected("VALUE or STRUCT", self.peek_token())?
+        } else {
+            None
+        };
+
+        Ok(mode)
+    }
+
     /// Invoke `f` after first setting the parser's `ParserState` to `state`.
     ///
     /// Upon return, restores the parser's state to what it started at.
@@ -9603,150 +12391,310 @@ impl<'a> Parser<'a> {
     }
 
     /// Parse a `SET ROLE` statement. Expects SET to be consumed already.
-    fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::ROLE)?;
-        let context_modifier = match modifier {
-            Some(Keyword::LOCAL) => ContextModifier::Local,
-            Some(Keyword::SESSION) => ContextModifier::Session,
-            _ => ContextModifier::None,
-        };
+    fn parse_set_role(
+        &mut self,
+        modifier: Option<ContextModifier>,
+    ) -> Result<Statement, ParserError> {
+        self.expect_keyword_is(Keyword::ROLE)?;
 
         let role_name = if self.parse_keyword(Keyword::NONE) {
             None
         } else {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         };
-        Ok(Statement::SetRole {
-            context_modifier,
+        Ok(Statement::Set(Set::SetRole {
+            context_modifier: modifier,
             role_name,
-        })
+        }))
     }
 
-    pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
-        let modifier =
-            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
-        if let Some(Keyword::HIVEVAR) = modifier {
-            self.expect_token(&Token::Colon)?;
-        } else if let Some(set_role_stmt) =
-            self.maybe_parse(|parser| parser.parse_set_role(modifier))?
-        {
-            return Ok(set_role_stmt);
+    fn parse_set_values(
+        &mut self,
+        parenthesized_assignment: bool,
+    ) -> Result<Vec<Expr>, ParserError> {
+        let mut values = vec![];
+
+        if parenthesized_assignment {
+            self.expect_token(&Token::LParen)?;
+        }
+
+        loop {
+            let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
+                expr
+            } else if let Ok(expr) = self.parse_expr() {
+                expr
+            } else {
+                self.expected("variable value", self.peek_token())?
+            };
+
+            values.push(value);
+            if self.consume_token(&Token::Comma) {
+                continue;
+            }
+
+            if parenthesized_assignment {
+                self.expect_token(&Token::RParen)?;
+            }
+            return Ok(values);
         }
+    }
+
+    fn parse_context_modifier(&mut self) -> Option<ContextModifier> {
+        let modifier =
+            self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::GLOBAL])?;
+
+        Self::keyword_to_modifier(modifier)
+    }
 
-        let variables = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
-            OneOrManyWithParens::One(ObjectName(vec!["TIMEZONE".into()]))
-        } else if self.dialect.supports_parenthesized_set_variables()
+    /// Parse a single SET statement assignment `var = expr`.
+    fn parse_set_assignment(&mut self) -> Result<SetAssignment, ParserError> {
+        let scope = self.parse_context_modifier();
+
+        let name = if self.dialect.supports_parenthesized_set_variables()
             && self.consume_token(&Token::LParen)
         {
-            let variables = OneOrManyWithParens::Many(
-                self.parse_comma_separated(|parser: &mut Parser<'a>| {
-                    parser.parse_identifier(false)
-                })?
-                .into_iter()
-                .map(|ident| ObjectName(vec![ident]))
-                .collect(),
-            );
-            self.expect_token(&Token::RParen)?;
-            variables
+            // Parenthesized assignments are handled in the `parse_set` function after
+            // trying to parse list of assignments using this function.
+            // If a dialect supports both, and we find a LParen, we early exit from this function.
+            self.expected("Unparenthesized assignment", self.peek_token())?
         } else {
-            OneOrManyWithParens::One(self.parse_object_name(false)?)
+            self.parse_object_name(false)?
+        };
+
+        if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
+            return self.expected("assignment operator", self.peek_token());
+        }
+
+        let value = self.parse_expr()?;
+
+        Ok(SetAssignment { scope, name, value })
+    }
+
+    fn parse_set(&mut self) -> Result<Statement, ParserError> {
+        let hivevar = self.parse_keyword(Keyword::HIVEVAR);
+
+        // Modifier is either HIVEVAR: or a ContextModifier (LOCAL, SESSION, etc), not both
+        let scope = if !hivevar {
+            self.parse_context_modifier()
+        } else {
+            None
         };
 
-        if matches!(&variables, OneOrManyWithParens::One(variable) if variable.to_string().eq_ignore_ascii_case("NAMES")
-            && dialect_of!(self is MySqlDialect | GenericDialect))
+        if hivevar {
+            self.expect_token(&Token::Colon)?;
+        }
+
+        if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(scope))? {
+            return Ok(set_role_stmt);
+        }
+
+        // Handle special cases first
+        if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE])
+            || self.parse_keyword(Keyword::TIMEZONE)
         {
+            if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
+                return Ok(Set::SingleAssignment {
+                    scope,
+                    hivevar,
+                    variable: ObjectName::from(vec!["TIMEZONE".into()]),
+                    values: self.parse_set_values(false)?,
+                }
+                .into());
+            } else {
+                // A shorthand alias for SET TIME ZONE that doesn't require
+                // the assignment operator. It's originally PostgreSQL specific,
+                // but we allow it for all the dialects
+                return Ok(Set::SetTimeZone {
+                    local: scope == Some(ContextModifier::Local),
+                    value: self.parse_expr()?,
+                }
+                .into());
+            }
+        } else if self.dialect.supports_set_names() && self.parse_keyword(Keyword::NAMES) {
             if self.parse_keyword(Keyword::DEFAULT) {
-                return Ok(Statement::SetNamesDefault {});
+                return Ok(Set::SetNamesDefault {}.into());
             }
-
-            let charset_name = self.parse_literal_string()?;
+            let charset_name = self.parse_identifier()?;
             let collation_name = if self.parse_one_of_keywords(&[Keyword::COLLATE]).is_some() {
                 Some(self.parse_literal_string()?)
             } else {
                 None
             };
 
-            return Ok(Statement::SetNames {
+            return Ok(Set::SetNames {
                 charset_name,
                 collation_name,
-            });
-        }
-
-        let parenthesized_assignment = matches!(&variables, OneOrManyWithParens::Many(_));
-
-        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
-            if parenthesized_assignment {
-                self.expect_token(&Token::LParen)?;
-            }
-
-            let mut values = vec![];
-            loop {
-                let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
-                    expr
-                } else if let Ok(expr) = self.parse_expr() {
-                    expr
-                } else {
-                    self.expected("variable value", self.peek_token())?
-                };
-
-                values.push(value);
-                if self.consume_token(&Token::Comma) {
-                    continue;
-                }
-
-                if parenthesized_assignment {
-                    self.expect_token(&Token::RParen)?;
-                }
-                return Ok(Statement::SetVariable {
-                    local: modifier == Some(Keyword::LOCAL),
-                    hivevar: Some(Keyword::HIVEVAR) == modifier,
-                    variables,
-                    value: values,
-                });
             }
-        }
-
-        let OneOrManyWithParens::One(variable) = variables else {
-            return self.expected("set variable", self.peek_token());
-        };
-
-        if variable.to_string().eq_ignore_ascii_case("TIMEZONE") {
-            // for some db (e.g. postgresql), SET TIME ZONE <value> is an alias for SET TIMEZONE [TO|=] <value>
-            match self.parse_expr() {
-                Ok(expr) => Ok(Statement::SetTimeZone {
-                    local: modifier == Some(Keyword::LOCAL),
-                    value: expr,
-                }),
-                _ => self.expected("timezone value", self.peek_token())?,
-            }
-        } else if variable.to_string() == "CHARACTERISTICS" {
+            .into());
+        } else if self.parse_keyword(Keyword::CHARACTERISTICS) {
             self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?;
-            Ok(Statement::SetTransaction {
+            return Ok(Set::SetTransaction {
                 modes: self.parse_transaction_modes()?,
                 snapshot: None,
                 session: true,
-            })
-        } else if variable.to_string() == "TRANSACTION" && modifier.is_none() {
+            }
+            .into());
+        } else if self.parse_keyword(Keyword::TRANSACTION) {
             if self.parse_keyword(Keyword::SNAPSHOT) {
-                let snapshot_id = self.parse_value()?;
-                return Ok(Statement::SetTransaction {
+                let snapshot_id = self.parse_value()?.value;
+                return Ok(Set::SetTransaction {
                     modes: vec![],
                     snapshot: Some(snapshot_id),
                     session: false,
-                });
+                }
+                .into());
             }
-            Ok(Statement::SetTransaction {
+            return Ok(Set::SetTransaction {
                 modes: self.parse_transaction_modes()?,
                 snapshot: None,
                 session: false,
-            })
-        } else {
-            self.expected("equals sign or TO", self.peek_token())
+            }
+            .into());
         }
-    }
 
-    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
-        let terse = self.parse_keyword(Keyword::TERSE);
+        if self.dialect.supports_comma_separated_set_assignments() {
+            if scope.is_some() {
+                self.prev_token();
+            }
+
+            if let Some(assignments) = self
+                .maybe_parse(|parser| parser.parse_comma_separated(Parser::parse_set_assignment))?
+            {
+                return if assignments.len() > 1 {
+                    Ok(Set::MultipleAssignments { assignments }.into())
+                } else {
+                    let SetAssignment { scope, name, value } =
+                        assignments.into_iter().next().ok_or_else(|| {
+                            ParserError::ParserError("Expected at least one assignment".to_string())
+                        })?;
+
+                    Ok(Set::SingleAssignment {
+                        scope,
+                        hivevar,
+                        variable: name,
+                        values: vec![value],
+                    }
+                    .into())
+                };
+            }
+        }
+
+        let variables = if self.dialect.supports_parenthesized_set_variables()
+            && self.consume_token(&Token::LParen)
+        {
+            let vars = OneOrManyWithParens::Many(
+                self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
+                    .into_iter()
+                    .map(|ident| ObjectName::from(vec![ident]))
+                    .collect(),
+            );
+            self.expect_token(&Token::RParen)?;
+            vars
+        } else {
+            OneOrManyWithParens::One(self.parse_object_name(false)?)
+        };
+
+        if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
+            let stmt = match variables {
+                OneOrManyWithParens::One(var) => Set::SingleAssignment {
+                    scope,
+                    hivevar,
+                    variable: var,
+                    values: self.parse_set_values(false)?,
+                },
+                OneOrManyWithParens::Many(vars) => Set::ParenthesizedAssignments {
+                    variables: vars,
+                    values: self.parse_set_values(true)?,
+                },
+            };
+
+            return Ok(stmt.into());
+        }
+
+        if self.dialect.supports_set_stmt_without_operator() {
+            self.prev_token();
+            return self.parse_set_session_params();
+        };
+
+        self.expected("equals sign or TO", self.peek_token())
+    }
+
+    pub fn parse_set_session_params(&mut self) -> Result<Statement, ParserError> {
+        if self.parse_keyword(Keyword::STATISTICS) {
+            let topic = match self.parse_one_of_keywords(&[
+                Keyword::IO,
+                Keyword::PROFILE,
+                Keyword::TIME,
+                Keyword::XML,
+            ]) {
+                Some(Keyword::IO) => SessionParamStatsTopic::IO,
+                Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
+                Some(Keyword::TIME) => SessionParamStatsTopic::Time,
+                Some(Keyword::XML) => SessionParamStatsTopic::Xml,
+                _ => return self.expected("IO, PROFILE, TIME or XML", self.peek_token()),
+            };
+            let value = self.parse_session_param_value()?;
+            Ok(
+                Set::SetSessionParam(SetSessionParamKind::Statistics(SetSessionParamStatistics {
+                    topic,
+                    value,
+                }))
+                .into(),
+            )
+        } else if self.parse_keyword(Keyword::IDENTITY_INSERT) {
+            let obj = self.parse_object_name(false)?;
+            let value = self.parse_session_param_value()?;
+            Ok(Set::SetSessionParam(SetSessionParamKind::IdentityInsert(
+                SetSessionParamIdentityInsert { obj, value },
+            ))
+            .into())
+        } else if self.parse_keyword(Keyword::OFFSETS) {
+            let keywords = self.parse_comma_separated(|parser| {
+                let next_token = parser.next_token();
+                match &next_token.token {
+                    Token::Word(w) => Ok(w.to_string()),
+                    _ => parser.expected("SQL keyword", next_token),
+                }
+            })?;
+            let value = self.parse_session_param_value()?;
+            Ok(
+                Set::SetSessionParam(SetSessionParamKind::Offsets(SetSessionParamOffsets {
+                    keywords,
+                    value,
+                }))
+                .into(),
+            )
+        } else {
+            let names = self.parse_comma_separated(|parser| {
+                let next_token = parser.next_token();
+                match next_token.token {
+                    Token::Word(w) => Ok(w.to_string()),
+                    _ => parser.expected("Session param name", next_token),
+                }
+            })?;
+            let value = self.parse_expr()?.to_string();
+            Ok(
+                Set::SetSessionParam(SetSessionParamKind::Generic(SetSessionParamGeneric {
+                    names,
+                    value,
+                }))
+                .into(),
+            )
+        }
+    }
+
+    fn parse_session_param_value(&mut self) -> Result<SessionParamValue, ParserError> {
+        if self.parse_keyword(Keyword::ON) {
+            Ok(SessionParamValue::On)
+        } else if self.parse_keyword(Keyword::OFF) {
+            Ok(SessionParamValue::Off)
+        } else {
+            self.expected("ON or OFF", self.peek_token())
+        }
+    }
+
+    pub fn parse_show(&mut self) -> Result<Statement, ParserError> {
+        let terse = self.parse_keyword(Keyword::TERSE);
         let extended = self.parse_keyword(Keyword::EXTENDED);
         let full = self.parse_keyword(Keyword::FULL);
         let session = self.parse_keyword(Keyword::SESSION);
@@ -9793,6 +12741,10 @@ impl<'a> Parser<'a> {
             self.parse_show_databases(terse)
         } else if self.parse_keyword(Keyword::SCHEMAS) {
             self.parse_show_schemas(terse)
+        } else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
+            self.parse_show_charset(false)
+        } else if self.parse_keyword(Keyword::CHARSET) {
+            self.parse_show_charset(true)
         } else {
             Ok(Statement::ShowVariable {
                 variable: self.parse_identifiers()?,
@@ -9800,6 +12752,14 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
+        // parse one of keywords
+        Ok(Statement::ShowCharset(ShowCharset {
+            is_shorthand,
+            filter: self.parse_show_statement_filter()?,
+        }))
+    }
+
     fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
         let history = self.parse_keyword(Keyword::HISTORY);
         let show_options = self.parse_show_stmt_options()?;
@@ -9934,28 +12894,56 @@ impl<'a> Parser<'a> {
         } else if dialect_of!(self is DatabricksDialect) {
             self.parse_one_of_keywords(&[Keyword::CATALOG, Keyword::DATABASE, Keyword::SCHEMA])
         } else if dialect_of!(self is SnowflakeDialect) {
-            self.parse_one_of_keywords(&[Keyword::DATABASE, Keyword::SCHEMA, Keyword::WAREHOUSE])
+            self.parse_one_of_keywords(&[
+                Keyword::DATABASE,
+                Keyword::SCHEMA,
+                Keyword::WAREHOUSE,
+                Keyword::ROLE,
+                Keyword::SECONDARY,
+            ])
         } else {
             None // No specific keywords for other dialects, including GenericDialect
         };
 
-        let obj_name = self.parse_object_name(false)?;
-        let result = match parsed_keyword {
-            Some(Keyword::CATALOG) => Use::Catalog(obj_name),
-            Some(Keyword::DATABASE) => Use::Database(obj_name),
-            Some(Keyword::SCHEMA) => Use::Schema(obj_name),
-            Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
-            _ => Use::Object(obj_name),
+        let result = if matches!(parsed_keyword, Some(Keyword::SECONDARY)) {
+            self.parse_secondary_roles()?
+        } else {
+            let obj_name = self.parse_object_name(false)?;
+            match parsed_keyword {
+                Some(Keyword::CATALOG) => Use::Catalog(obj_name),
+                Some(Keyword::DATABASE) => Use::Database(obj_name),
+                Some(Keyword::SCHEMA) => Use::Schema(obj_name),
+                Some(Keyword::WAREHOUSE) => Use::Warehouse(obj_name),
+                Some(Keyword::ROLE) => Use::Role(obj_name),
+                _ => Use::Object(obj_name),
+            }
         };
 
         Ok(Statement::Use(result))
     }
 
+    fn parse_secondary_roles(&mut self) -> Result<Use, ParserError> {
+        self.expect_one_of_keywords(&[Keyword::ROLES, Keyword::ROLE])?;
+        if self.parse_keyword(Keyword::NONE) {
+            Ok(Use::SecondaryRoles(SecondaryRoles::None))
+        } else if self.parse_keyword(Keyword::ALL) {
+            Ok(Use::SecondaryRoles(SecondaryRoles::All))
+        } else {
+            let roles = self.parse_comma_separated(|parser| parser.parse_identifier())?;
+            Ok(Use::SecondaryRoles(SecondaryRoles::List(roles)))
+        }
+    }
+
     pub fn parse_table_and_joins(&mut self) -> Result<TableWithJoins, ParserError> {
         let relation = self.parse_table_factor()?;
         // Note that for keywords to be properly handled here, they need to be
         // added to `RESERVED_FOR_TABLE_ALIAS`, otherwise they may be parsed as
         // a table alias.
+        let joins = self.parse_joins()?;
+        Ok(TableWithJoins { relation, joins })
+    }
+
+    fn parse_joins(&mut self) -> Result<Vec<Join>, ParserError> {
         let mut joins = vec![];
         loop {
             let global = self.parse_keyword(Keyword::GLOBAL);
@@ -9975,16 +12963,16 @@ impl<'a> Parser<'a> {
                 }
             } else if self.parse_keyword(Keyword::OUTER) {
                 // MSSQL extension, similar to LEFT JOIN LATERAL .. ON 1=1
-                self.expect_keyword(Keyword::APPLY)?;
+                self.expect_keyword_is(Keyword::APPLY)?;
                 Join {
                     relation: self.parse_table_factor()?,
                     global,
                     join_operator: JoinOperator::OuterApply,
                 }
             } else if self.parse_keyword(Keyword::ASOF) {
-                self.expect_keyword(Keyword::JOIN)?;
+                self.expect_keyword_is(Keyword::JOIN)?;
                 let relation = self.parse_table_factor()?;
-                self.expect_keyword(Keyword::MATCH_CONDITION)?;
+                self.expect_keyword_is(Keyword::MATCH_CONDITION)?;
                 let match_condition = self.parse_parenthesized(Self::parse_expr)?;
                 Join {
                     relation,
@@ -10004,9 +12992,13 @@ impl<'a> Parser<'a> {
 
                 let join_operator_type = match peek_keyword {
                     Keyword::INNER | Keyword::JOIN => {
-                        let _ = self.parse_keyword(Keyword::INNER); // [ INNER ]
-                        self.expect_keyword(Keyword::JOIN)?;
-                        JoinOperator::Inner
+                        let inner = self.parse_keyword(Keyword::INNER); // [ INNER ]
+                        self.expect_keyword_is(Keyword::JOIN)?;
+                        if inner {
+                            JoinOperator::Inner
+                        } else {
+                            JoinOperator::Join
+                        }
                     }
                     kw @ Keyword::LEFT | kw @ Keyword::RIGHT => {
                         let _ = self.next_token(); // consume LEFT/RIGHT
@@ -10019,7 +13011,7 @@ impl<'a> Parser<'a> {
                         ]);
                         match join_type {
                             Some(Keyword::OUTER) => {
-                                self.expect_keyword(Keyword::JOIN)?;
+                                self.expect_keyword_is(Keyword::JOIN)?;
                                 if is_left {
                                     JoinOperator::LeftOuter
                                 } else {
@@ -10027,7 +13019,7 @@ impl<'a> Parser<'a> {
                                 }
                             }
                             Some(Keyword::SEMI) => {
-                                self.expect_keyword(Keyword::JOIN)?;
+                                self.expect_keyword_is(Keyword::JOIN)?;
                                 if is_left {
                                     JoinOperator::LeftSemi
                                 } else {
@@ -10035,7 +13027,7 @@ impl<'a> Parser<'a> {
                                 }
                             }
                             Some(Keyword::ANTI) => {
-                                self.expect_keyword(Keyword::JOIN)?;
+                                self.expect_keyword_is(Keyword::JOIN)?;
                                 if is_left {
                                     JoinOperator::LeftAnti
                                 } else {
@@ -10044,9 +13036,9 @@ impl<'a> Parser<'a> {
                             }
                             Some(Keyword::JOIN) => {
                                 if is_left {
-                                    JoinOperator::LeftOuter
+                                    JoinOperator::Left
                                 } else {
-                                    JoinOperator::RightOuter
+                                    JoinOperator::Right
                                 }
                             }
                             _ => {
@@ -10058,29 +13050,46 @@ impl<'a> Parser<'a> {
                     }
                     Keyword::ANTI => {
                         let _ = self.next_token(); // consume ANTI
-                        self.expect_keyword(Keyword::JOIN)?;
+                        self.expect_keyword_is(Keyword::JOIN)?;
                         JoinOperator::Anti
                     }
                     Keyword::SEMI => {
                         let _ = self.next_token(); // consume SEMI
-                        self.expect_keyword(Keyword::JOIN)?;
+                        self.expect_keyword_is(Keyword::JOIN)?;
                         JoinOperator::Semi
                     }
                     Keyword::FULL => {
                         let _ = self.next_token(); // consume FULL
                         let _ = self.parse_keyword(Keyword::OUTER); // [ OUTER ]
-                        self.expect_keyword(Keyword::JOIN)?;
+                        self.expect_keyword_is(Keyword::JOIN)?;
                         JoinOperator::FullOuter
                     }
                     Keyword::OUTER => {
                         return self.expected("LEFT, RIGHT, or FULL", self.peek_token());
                     }
+                    Keyword::STRAIGHT_JOIN => {
+                        let _ = self.next_token(); // consume STRAIGHT_JOIN
+                        JoinOperator::StraightJoin
+                    }
                     _ if natural => {
                         return self.expected("a join type after NATURAL", self.peek_token());
                     }
                     _ => break,
                 };
-                let relation = self.parse_table_factor()?;
+                let mut relation = self.parse_table_factor()?;
+
+                if !self
+                    .dialect
+                    .supports_left_associative_joins_without_parens()
+                    && self.peek_parens_less_nested_join()
+                {
+                    let joins = self.parse_joins()?;
+                    relation = TableFactor::NestedJoin {
+                        table_with_joins: Box::new(TableWithJoins { relation, joins }),
+                        alias: None,
+                    };
+                }
+
                 let join_constraint = self.parse_join_constraint(natural)?;
                 Join {
                     relation,
@@ -10090,7 +13099,21 @@ impl<'a> Parser<'a> {
             };
             joins.push(join);
         }
-        Ok(TableWithJoins { relation, joins })
+        Ok(joins)
+    }
+
+    fn peek_parens_less_nested_join(&self) -> bool {
+        matches!(
+            self.peek_token_ref().token,
+            Token::Word(Word {
+                keyword: Keyword::JOIN
+                    | Keyword::INNER
+                    | Keyword::LEFT
+                    | Keyword::RIGHT
+                    | Keyword::FULL,
+                ..
+            })
+        )
     }
 
     /// A table name or a parenthesized subquery, followed by optional `[AS] alias`
@@ -10103,7 +13126,7 @@ impl<'a> Parser<'a> {
                 let name = self.parse_object_name(false)?;
                 self.expect_token(&Token::LParen)?;
                 let args = self.parse_optional_args()?;
-                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+                let alias = self.maybe_parse_table_alias()?;
                 Ok(TableFactor::Function {
                     lateral: true,
                     name,
@@ -10116,7 +13139,7 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::LParen)?;
             let expr = self.parse_expr()?;
             self.expect_token(&Token::RParen)?;
-            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+            let alias = self.maybe_parse_table_alias()?;
             Ok(TableFactor::TableFunction { expr, alias })
         } else if self.consume_token(&Token::LParen) {
             // A left paren introduces either a derived table (i.e., a subquery)
@@ -10165,7 +13188,7 @@ impl<'a> Parser<'a> {
             #[allow(clippy::if_same_then_else)]
             if !table_and_joins.joins.is_empty() {
                 self.expect_token(&Token::RParen)?;
-                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+                let alias = self.maybe_parse_table_alias()?;
                 Ok(TableFactor::NestedJoin {
                     table_with_joins: Box::new(table_and_joins),
                     alias,
@@ -10178,7 +13201,7 @@ impl<'a> Parser<'a> {
                 // (B): `table_and_joins` (what we found inside the parentheses)
                 // is a nested join `(foo JOIN bar)`, not followed by other joins.
                 self.expect_token(&Token::RParen)?;
-                let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+                let alias = self.maybe_parse_table_alias()?;
                 Ok(TableFactor::NestedJoin {
                     table_with_joins: Box::new(table_and_joins),
                     alias,
@@ -10192,9 +13215,7 @@ impl<'a> Parser<'a> {
                 // [AS alias])`) as well.
                 self.expect_token(&Token::RParen)?;
 
-                if let Some(outer_alias) =
-                    self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?
-                {
+                if let Some(outer_alias) = self.maybe_parse_table_alias()? {
                     // Snowflake also allows specifying an alias *after* parens
                     // e.g. `FROM (mytable) AS alias`
                     match &mut table_and_joins.relation {
@@ -10203,6 +13224,7 @@ impl<'a> Parser<'a> {
                         | TableFactor::Function { alias, .. }
                         | TableFactor::UNNEST { alias, .. }
                         | TableFactor::JsonTable { alias, .. }
+                        | TableFactor::XmlTable { alias, .. }
                         | TableFactor::OpenJsonTable { alias, .. }
                         | TableFactor::TableFunction { alias, .. }
                         | TableFactor::Pivot { alias, .. }
@@ -10241,27 +13263,26 @@ impl<'a> Parser<'a> {
                 ]
             )
         {
-            self.expect_keyword(Keyword::VALUES)?;
+            self.expect_keyword_is(Keyword::VALUES)?;
 
             // Snowflake and Databricks allow syntax like below:
             // SELECT * FROM VALUES (1, 'a'), (2, 'b') AS t (col1, col2)
             // where there are no parentheses around the VALUES clause.
             let values = SetExpr::Values(self.parse_values(false)?);
-            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+            let alias = self.maybe_parse_table_alias()?;
             Ok(TableFactor::Derived {
                 lateral: false,
                 subquery: Box::new(Query {
                     with: None,
                     body: Box::new(values),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 }),
                 alias,
             })
@@ -10273,7 +13294,7 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::RParen)?;
 
             let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
-            let alias = match self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS) {
+            let alias = match self.maybe_parse_table_alias() {
                 Ok(Some(alias)) => Some(alias),
                 Ok(None) => None,
                 Err(e) => return Err(e),
@@ -10304,13 +13325,13 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword_with_tokens(Keyword::JSON_TABLE, &[Token::LParen]) {
             let json_expr = self.parse_expr()?;
             self.expect_token(&Token::Comma)?;
-            let json_path = self.parse_value()?;
-            self.expect_keyword(Keyword::COLUMNS)?;
+            let json_path = self.parse_value()?.value;
+            self.expect_keyword_is(Keyword::COLUMNS)?;
             self.expect_token(&Token::LParen)?;
             let columns = self.parse_comma_separated(Parser::parse_json_table_column_def)?;
             self.expect_token(&Token::RParen)?;
             self.expect_token(&Token::RParen)?;
-            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+            let alias = self.maybe_parse_table_alias()?;
             Ok(TableFactor::JsonTable {
                 json_expr,
                 json_path,
@@ -10320,9 +13341,17 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword_with_tokens(Keyword::OPENJSON, &[Token::LParen]) {
             self.prev_token();
             self.parse_open_json_table_factor()
+        } else if self.parse_keyword_with_tokens(Keyword::XMLTABLE, &[Token::LParen]) {
+            self.prev_token();
+            self.parse_xml_table_factor()
         } else {
             let name = self.parse_object_name(true)?;
 
+            let json_path = match self.peek_token().token {
+                Token::LBracket if self.dialect.supports_partiql() => Some(self.parse_json_path()?),
+                _ => None,
+            };
+
             let partitions: Vec<Ident> = if dialect_of!(self is MySqlDialect | GenericDialect)
                 && self.parse_keyword(Keyword::PARTITION)
             {
@@ -10332,7 +13361,7 @@ impl<'a> Parser<'a> {
             };
 
             // Parse potential version qualifier
-            let version = self.parse_table_version()?;
+            let version = self.maybe_parse_table_version()?;
 
             // Postgres, MSSQL, ClickHouse: table-valued functions:
             let args = if self.consume_token(&Token::LParen) {
@@ -10343,7 +13372,22 @@ impl<'a> Parser<'a> {
 
             let with_ordinality = self.parse_keywords(&[Keyword::WITH, Keyword::ORDINALITY]);
 
-            let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+            let mut sample = None;
+            if self.dialect.supports_table_sample_before_alias() {
+                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
+                    sample = Some(TableSampleKind::BeforeTableAlias(parsed_sample));
+                }
+            }
+
+            let alias = self.maybe_parse_table_alias()?;
+
+            // MYSQL-specific table hints:
+            let index_hints = if self.dialect.supports_table_hints() {
+                self.maybe_parse(|p| p.parse_table_index_hints())?
+                    .unwrap_or(vec![])
+            } else {
+                vec![]
+            };
 
             // MSSQL-specific table hints:
             let mut with_hints = vec![];
@@ -10357,6 +13401,12 @@ impl<'a> Parser<'a> {
                 }
             };
 
+            if !self.dialect.supports_table_sample_before_alias() {
+                if let Some(parsed_sample) = self.maybe_parse_table_sample()? {
+                    sample = Some(TableSampleKind::AfterTableAlias(parsed_sample));
+                }
+            }
+
             let mut table = TableFactor::Table {
                 name,
                 alias,
@@ -10365,6 +13415,9 @@ impl<'a> Parser<'a> {
                 version,
                 partitions,
                 with_ordinality,
+                json_path,
+                sample,
+                index_hints,
             };
 
             while let Some(kw) = self.parse_one_of_keywords(&[Keyword::PIVOT, Keyword::UNPIVOT]) {
@@ -10385,13 +13438,129 @@ impl<'a> Parser<'a> {
         }
     }
 
+    fn maybe_parse_table_sample(&mut self) -> Result<Option<Box<TableSample>>, ParserError> {
+        let modifier = if self.parse_keyword(Keyword::TABLESAMPLE) {
+            TableSampleModifier::TableSample
+        } else if self.parse_keyword(Keyword::SAMPLE) {
+            TableSampleModifier::Sample
+        } else {
+            return Ok(None);
+        };
+        self.parse_table_sample(modifier).map(Some)
+    }
+
+    fn parse_table_sample(
+        &mut self,
+        modifier: TableSampleModifier,
+    ) -> Result<Box<TableSample>, ParserError> {
+        let name = match self.parse_one_of_keywords(&[
+            Keyword::BERNOULLI,
+            Keyword::ROW,
+            Keyword::SYSTEM,
+            Keyword::BLOCK,
+        ]) {
+            Some(Keyword::BERNOULLI) => Some(TableSampleMethod::Bernoulli),
+            Some(Keyword::ROW) => Some(TableSampleMethod::Row),
+            Some(Keyword::SYSTEM) => Some(TableSampleMethod::System),
+            Some(Keyword::BLOCK) => Some(TableSampleMethod::Block),
+            _ => None,
+        };
+
+        let parenthesized = self.consume_token(&Token::LParen);
+
+        let (quantity, bucket) = if parenthesized && self.parse_keyword(Keyword::BUCKET) {
+            let selected_bucket = self.parse_number_value()?.value;
+            self.expect_keywords(&[Keyword::OUT, Keyword::OF])?;
+            let total = self.parse_number_value()?.value;
+            let on = if self.parse_keyword(Keyword::ON) {
+                Some(self.parse_expr()?)
+            } else {
+                None
+            };
+            (
+                None,
+                Some(TableSampleBucket {
+                    bucket: selected_bucket,
+                    total,
+                    on,
+                }),
+            )
+        } else {
+            let value = match self.maybe_parse(|p| p.parse_expr())? {
+                Some(num) => num,
+                None => {
+                    let next_token = self.next_token();
+                    if let Token::Word(w) = next_token.token {
+                        Expr::Value(Value::Placeholder(w.value).with_span(next_token.span))
+                    } else {
+                        return parser_err!(
+                            "Expecting number or byte length e.g. 100M",
+                            self.peek_token().span.start
+                        );
+                    }
+                }
+            };
+            let unit = if self.parse_keyword(Keyword::ROWS) {
+                Some(TableSampleUnit::Rows)
+            } else if self.parse_keyword(Keyword::PERCENT) {
+                Some(TableSampleUnit::Percent)
+            } else {
+                None
+            };
+            (
+                Some(TableSampleQuantity {
+                    parenthesized,
+                    value,
+                    unit,
+                }),
+                None,
+            )
+        };
+        if parenthesized {
+            self.expect_token(&Token::RParen)?;
+        }
+
+        let seed = if self.parse_keyword(Keyword::REPEATABLE) {
+            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Repeatable)?)
+        } else if self.parse_keyword(Keyword::SEED) {
+            Some(self.parse_table_sample_seed(TableSampleSeedModifier::Seed)?)
+        } else {
+            None
+        };
+
+        let offset = if self.parse_keyword(Keyword::OFFSET) {
+            Some(self.parse_expr()?)
+        } else {
+            None
+        };
+
+        Ok(Box::new(TableSample {
+            modifier,
+            name,
+            quantity,
+            seed,
+            bucket,
+            offset,
+        }))
+    }
+
+    fn parse_table_sample_seed(
+        &mut self,
+        modifier: TableSampleSeedModifier,
+    ) -> Result<TableSampleSeed, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let value = self.parse_number_value()?.value;
+        self.expect_token(&Token::RParen)?;
+        Ok(TableSampleSeed { modifier, value })
+    }
+
     /// Parses `OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]` clause,
     /// assuming the `OPENJSON` keyword was already consumed.
     fn parse_open_json_table_factor(&mut self) -> Result<TableFactor, ParserError> {
         self.expect_token(&Token::LParen)?;
         let json_expr = self.parse_expr()?;
         let json_path = if self.consume_token(&Token::Comma) {
-            Some(self.parse_value()?)
+            Some(self.parse_value()?.value)
         } else {
             None
         };
@@ -10404,7 +13573,7 @@ impl<'a> Parser<'a> {
         } else {
             Vec::new()
         };
-        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+        let alias = self.maybe_parse_table_alias()?;
         Ok(TableFactor::OpenJsonTable {
             json_expr,
             json_path,
@@ -10413,6 +13582,99 @@ impl<'a> Parser<'a> {
         })
     }
 
+    fn parse_xml_table_factor(&mut self) -> Result<TableFactor, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let namespaces = if self.parse_keyword(Keyword::XMLNAMESPACES) {
+            self.expect_token(&Token::LParen)?;
+            let namespaces = self.parse_comma_separated(Parser::parse_xml_namespace_definition)?;
+            self.expect_token(&Token::RParen)?;
+            self.expect_token(&Token::Comma)?;
+            namespaces
+        } else {
+            vec![]
+        };
+        let row_expression = self.parse_expr()?;
+        let passing = self.parse_xml_passing_clause()?;
+        self.expect_keyword_is(Keyword::COLUMNS)?;
+        let columns = self.parse_comma_separated(Parser::parse_xml_table_column)?;
+        self.expect_token(&Token::RParen)?;
+        let alias = self.maybe_parse_table_alias()?;
+        Ok(TableFactor::XmlTable {
+            namespaces,
+            row_expression,
+            passing,
+            columns,
+            alias,
+        })
+    }
+
+    fn parse_xml_namespace_definition(&mut self) -> Result<XmlNamespaceDefinition, ParserError> {
+        let uri = self.parse_expr()?;
+        self.expect_keyword_is(Keyword::AS)?;
+        let name = self.parse_identifier()?;
+        Ok(XmlNamespaceDefinition { uri, name })
+    }
+
+    fn parse_xml_table_column(&mut self) -> Result<XmlTableColumn, ParserError> {
+        let name = self.parse_identifier()?;
+
+        let option = if self.parse_keyword(Keyword::FOR) {
+            self.expect_keyword(Keyword::ORDINALITY)?;
+            XmlTableColumnOption::ForOrdinality
+        } else {
+            let r#type = self.parse_data_type()?;
+            let mut path = None;
+            let mut default = None;
+
+            if self.parse_keyword(Keyword::PATH) {
+                path = Some(self.parse_expr()?);
+            }
+
+            if self.parse_keyword(Keyword::DEFAULT) {
+                default = Some(self.parse_expr()?);
+            }
+
+            let not_null = self.parse_keywords(&[Keyword::NOT, Keyword::NULL]);
+            if !not_null {
+                // NULL is the default but can be specified explicitly
+                let _ = self.parse_keyword(Keyword::NULL);
+            }
+
+            XmlTableColumnOption::NamedInfo {
+                r#type,
+                path,
+                default,
+                nullable: !not_null,
+            }
+        };
+        Ok(XmlTableColumn { name, option })
+    }
+
+    fn parse_xml_passing_clause(&mut self) -> Result<XmlPassingClause, ParserError> {
+        let mut arguments = vec![];
+        if self.parse_keyword(Keyword::PASSING) {
+            loop {
+                let by_value =
+                    self.parse_keyword(Keyword::BY) && self.expect_keyword(Keyword::VALUE).is_ok();
+                let expr = self.parse_expr()?;
+                let alias = if self.parse_keyword(Keyword::AS) {
+                    Some(self.parse_identifier()?)
+                } else {
+                    None
+                };
+                arguments.push(XmlPassingArgument {
+                    expr,
+                    alias,
+                    by_value,
+                });
+                if !self.consume_token(&Token::Comma) {
+                    break;
+                }
+            }
+        }
+        Ok(XmlPassingClause { arguments })
+    }
+
     fn parse_match_recognize(&mut self, table: TableFactor) -> Result<TableFactor, ParserError> {
         self.expect_token(&Token::LParen)?;
 
@@ -10432,7 +13694,7 @@ impl<'a> Parser<'a> {
             self.parse_comma_separated(|p| {
                 let expr = p.parse_expr()?;
                 let _ = p.parse_keyword(Keyword::AS);
-                let alias = p.parse_identifier(false)?;
+                let alias = p.parse_identifier()?;
                 Ok(Measure { expr, alias })
             })?
         } else {
@@ -10478,9 +13740,9 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keywords(&[Keyword::TO, Keyword::NEXT, Keyword::ROW]) {
                     Some(AfterMatchSkip::ToNextRow)
                 } else if self.parse_keywords(&[Keyword::TO, Keyword::FIRST]) {
-                    Some(AfterMatchSkip::ToFirst(self.parse_identifier(false)?))
+                    Some(AfterMatchSkip::ToFirst(self.parse_identifier()?))
                 } else if self.parse_keywords(&[Keyword::TO, Keyword::LAST]) {
-                    Some(AfterMatchSkip::ToLast(self.parse_identifier(false)?))
+                    Some(AfterMatchSkip::ToLast(self.parse_identifier()?))
                 } else {
                     let found = self.next_token();
                     return self.expected("after match skip option", found);
@@ -10489,21 +13751,21 @@ impl<'a> Parser<'a> {
                 None
             };
 
-        self.expect_keyword(Keyword::PATTERN)?;
+        self.expect_keyword_is(Keyword::PATTERN)?;
         let pattern = self.parse_parenthesized(Self::parse_pattern)?;
 
-        self.expect_keyword(Keyword::DEFINE)?;
+        self.expect_keyword_is(Keyword::DEFINE)?;
 
         let symbols = self.parse_comma_separated(|p| {
-            let symbol = p.parse_identifier(false)?;
-            p.expect_keyword(Keyword::AS)?;
+            let symbol = p.parse_identifier()?;
+            p.expect_keyword_is(Keyword::AS)?;
             let definition = p.parse_expr()?;
             Ok(SymbolDefinition { symbol, definition })
         })?;
 
         self.expect_token(&Token::RParen)?;
 
-        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+        let alias = self.maybe_parse_table_alias()?;
 
         Ok(TableFactor::MatchRecognize {
             table: Box::new(table),
@@ -10526,9 +13788,7 @@ impl<'a> Parser<'a> {
             }
             Token::LBrace => {
                 self.expect_token(&Token::Minus)?;
-                let symbol = self
-                    .parse_identifier(false)
-                    .map(MatchRecognizeSymbol::Named)?;
+                let symbol = self.parse_identifier().map(MatchRecognizeSymbol::Named)?;
                 self.expect_token(&Token::Minus)?;
                 self.expect_token(&Token::RBrace)?;
                 Ok(MatchRecognizePattern::Exclude(symbol))
@@ -10540,7 +13800,7 @@ impl<'a> Parser<'a> {
             }) if value == "PERMUTE" => {
                 self.expect_token(&Token::LParen)?;
                 let symbols = self.parse_comma_separated(|p| {
-                    p.parse_identifier(false).map(MatchRecognizeSymbol::Named)
+                    p.parse_identifier().map(MatchRecognizeSymbol::Named)
                 })?;
                 self.expect_token(&Token::RParen)?;
                 Ok(MatchRecognizePattern::Permute(symbols))
@@ -10552,7 +13812,7 @@ impl<'a> Parser<'a> {
             }
             _ => {
                 self.prev_token();
-                self.parse_identifier(false)
+                self.parse_identifier()
                     .map(MatchRecognizeSymbol::Named)
                     .map(MatchRecognizePattern::Symbol)
             }
@@ -10577,7 +13837,7 @@ impl<'a> Parser<'a> {
                                 return self.expected("literal number", next_token);
                             };
                             self.expect_token(&Token::RBrace)?;
-                            RepetitionQuantifier::AtMost(Self::parse(n, token.location)?)
+                            RepetitionQuantifier::AtMost(Self::parse(n, token.span.start)?)
                         }
                         Token::Number(n, _) if self.consume_token(&Token::Comma) => {
                             let next_token = self.next_token();
@@ -10585,12 +13845,12 @@ impl<'a> Parser<'a> {
                                 Token::Number(m, _) => {
                                     self.expect_token(&Token::RBrace)?;
                                     RepetitionQuantifier::Range(
-                                        Self::parse(n, token.location)?,
-                                        Self::parse(m, token.location)?,
+                                        Self::parse(n, token.span.start)?,
+                                        Self::parse(m, token.span.start)?,
                                     )
                                 }
                                 Token::RBrace => {
-                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.location)?)
+                                    RepetitionQuantifier::AtLeast(Self::parse(n, token.span.start)?)
                                 }
                                 _ => {
                                     return self.expected("} or upper bound", next_token);
@@ -10599,7 +13859,7 @@ impl<'a> Parser<'a> {
                         }
                         Token::Number(n, _) => {
                             self.expect_token(&Token::RBrace)?;
-                            RepetitionQuantifier::Exactly(Self::parse(n, token.location)?)
+                            RepetitionQuantifier::Exactly(Self::parse(n, token.span.start)?)
                         }
                         _ => return self.expected("quantifier range", token),
                     }
@@ -10641,18 +13901,20 @@ impl<'a> Parser<'a> {
         }
     }
 
-    /// Parse a given table version specifier.
-    ///
-    /// For now it only supports timestamp versioning for BigQuery and MSSQL dialects.
-    pub fn parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
-        if dialect_of!(self is BigQueryDialect | MsSqlDialect)
-            && self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
-        {
-            let expr = self.parse_expr()?;
-            Ok(Some(TableVersion::ForSystemTimeAsOf(expr)))
-        } else {
-            Ok(None)
+    /// Parses a the timestamp version specifier (i.e. query historical data)
+    pub fn maybe_parse_table_version(&mut self) -> Result<Option<TableVersion>, ParserError> {
+        if self.dialect.supports_timestamp_versioning() {
+            if self.parse_keywords(&[Keyword::FOR, Keyword::SYSTEM_TIME, Keyword::AS, Keyword::OF])
+            {
+                let expr = self.parse_expr()?;
+                return Ok(Some(TableVersion::ForSystemTimeAsOf(expr)));
+            } else if self.peek_keyword(Keyword::AT) || self.peek_keyword(Keyword::BEFORE) {
+                let func_name = self.parse_object_name(true)?;
+                let func = self.parse_function(func_name)?;
+                return Ok(Some(TableVersion::Function(func)));
+            }
         }
+        Ok(None)
     }
 
     /// Parses MySQL's JSON_TABLE column definition.
@@ -10660,8 +13922,8 @@ impl<'a> Parser<'a> {
     pub fn parse_json_table_column_def(&mut self) -> Result<JsonTableColumn, ParserError> {
         if self.parse_keyword(Keyword::NESTED) {
             let _has_path_keyword = self.parse_keyword(Keyword::PATH);
-            let path = self.parse_value()?;
-            self.expect_keyword(Keyword::COLUMNS)?;
+            let path = self.parse_value()?.value;
+            self.expect_keyword_is(Keyword::COLUMNS)?;
             let columns = self.parse_parenthesized(|p| {
                 p.parse_comma_separated(Self::parse_json_table_column_def)
             })?;
@@ -10670,22 +13932,22 @@ impl<'a> Parser<'a> {
                 columns,
             }));
         }
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         if self.parse_keyword(Keyword::FOR) {
-            self.expect_keyword(Keyword::ORDINALITY)?;
+            self.expect_keyword_is(Keyword::ORDINALITY)?;
             return Ok(JsonTableColumn::ForOrdinality(name));
         }
         let r#type = self.parse_data_type()?;
         let exists = self.parse_keyword(Keyword::EXISTS);
-        self.expect_keyword(Keyword::PATH)?;
-        let path = self.parse_value()?;
+        self.expect_keyword_is(Keyword::PATH)?;
+        let path = self.parse_value()?.value;
         let mut on_empty = None;
         let mut on_error = None;
         while let Some(error_handling) = self.parse_json_table_column_error_handling()? {
             if self.parse_keyword(Keyword::EMPTY) {
                 on_empty = Some(error_handling);
             } else {
-                self.expect_keyword(Keyword::ERROR)?;
+                self.expect_keyword_is(Keyword::ERROR)?;
                 on_error = Some(error_handling);
             }
         }
@@ -10707,7 +13969,7 @@ impl<'a> Parser<'a> {
     ///
     /// Reference: <https://learn.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql?view=sql-server-ver16#syntax>
     pub fn parse_openjson_table_column_def(&mut self) -> Result<OpenJsonTableColumn, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         let r#type = self.parse_data_type()?;
         let path = if let Token::SingleQuotedString(path) = self.peek_token().token {
             self.next_token();
@@ -10717,7 +13979,7 @@ impl<'a> Parser<'a> {
         };
         let as_json = self.parse_keyword(Keyword::AS);
         if as_json {
-            self.expect_keyword(Keyword::JSON)?;
+            self.expect_keyword_is(Keyword::JSON)?;
         }
         Ok(OpenJsonTableColumn {
             name,
@@ -10735,11 +13997,11 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::ERROR) {
             JsonTableColumnErrorHandling::Error
         } else if self.parse_keyword(Keyword::DEFAULT) {
-            JsonTableColumnErrorHandling::Default(self.parse_value()?)
+            JsonTableColumnErrorHandling::Default(self.parse_value()?.value)
         } else {
             return Ok(None);
         };
-        self.expect_keyword(Keyword::ON)?;
+        self.expect_keyword_is(Keyword::ON)?;
         Ok(Some(res))
     }
 
@@ -10749,7 +14011,7 @@ impl<'a> Parser<'a> {
     ) -> Result<TableFactor, ParserError> {
         let subquery = self.parse_query()?;
         self.expect_token(&Token::RParen)?;
-        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
+        let alias = self.maybe_parse_table_alias()?;
         Ok(TableFactor::Derived {
             lateral: match lateral {
                 Lateral => true,
@@ -10765,9 +14027,9 @@ impl<'a> Parser<'a> {
             Token::Word(w) => Ok(w.value),
             _ => self.expected("a function identifier", self.peek_token()),
         }?;
-        let expr = self.parse_function(ObjectName(vec![Ident::new(function_name)]))?;
+        let expr = self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
         let alias = if self.parse_keyword(Keyword::AS) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
         } else {
             None
         };
@@ -10775,13 +14037,12 @@ impl<'a> Parser<'a> {
         Ok(ExprWithAlias { expr, alias })
     }
     /// Parses an expression with an optional alias
-
+    ///
     /// Examples:
-
+    ///
     /// ```sql
     /// SUM(price) AS total_price
     /// ```
-
     /// ```sql
     /// SUM(price)
     /// ```
@@ -10797,249 +14058,746 @@ impl<'a> Parser<'a> {
     /// assert_eq!(Some("b".to_string()), expr_with_alias.alias.map(|x|x.value));
     /// # Ok(())
     /// # }
-
     pub fn parse_expr_with_alias(&mut self) -> Result<ExprWithAlias, ParserError> {
         let expr = self.parse_expr()?;
         let alias = if self.parse_keyword(Keyword::AS) {
-            Some(self.parse_identifier(false)?)
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        Ok(ExprWithAlias { expr, alias })
+    }
+
+    pub fn parse_pivot_table_factor(
+        &mut self,
+        table: TableFactor,
+    ) -> Result<TableFactor, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let aggregate_functions = self.parse_comma_separated(Self::parse_aliased_function_call)?;
+        self.expect_keyword_is(Keyword::FOR)?;
+        let value_column = self.parse_period_separated(|p| p.parse_identifier())?;
+        self.expect_keyword_is(Keyword::IN)?;
+
+        self.expect_token(&Token::LParen)?;
+        let value_source = if self.parse_keyword(Keyword::ANY) {
+            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
+                self.parse_comma_separated(Parser::parse_order_by_expr)?
+            } else {
+                vec![]
+            };
+            PivotValueSource::Any(order_by)
+        } else if self.peek_sub_query() {
+            PivotValueSource::Subquery(self.parse_query()?)
+        } else {
+            PivotValueSource::List(self.parse_comma_separated(Self::parse_expr_with_alias)?)
+        };
+        self.expect_token(&Token::RParen)?;
+
+        let default_on_null =
+            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
+                self.expect_token(&Token::LParen)?;
+                let expr = self.parse_expr()?;
+                self.expect_token(&Token::RParen)?;
+                Some(expr)
+            } else {
+                None
+            };
+
+        self.expect_token(&Token::RParen)?;
+        let alias = self.maybe_parse_table_alias()?;
+        Ok(TableFactor::Pivot {
+            table: Box::new(table),
+            aggregate_functions,
+            value_column,
+            value_source,
+            default_on_null,
+            alias,
+        })
+    }
+
+    pub fn parse_unpivot_table_factor(
+        &mut self,
+        table: TableFactor,
+    ) -> Result<TableFactor, ParserError> {
+        let null_inclusion = if self.parse_keyword(Keyword::INCLUDE) {
+            self.expect_keyword_is(Keyword::NULLS)?;
+            Some(NullInclusion::IncludeNulls)
+        } else if self.parse_keyword(Keyword::EXCLUDE) {
+            self.expect_keyword_is(Keyword::NULLS)?;
+            Some(NullInclusion::ExcludeNulls)
+        } else {
+            None
+        };
+        self.expect_token(&Token::LParen)?;
+        let value = self.parse_expr()?;
+        self.expect_keyword_is(Keyword::FOR)?;
+        let name = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::IN)?;
+        let columns = self.parse_parenthesized_column_list_inner(Mandatory, false, |p| {
+            p.parse_expr_with_alias()
+        })?;
+        self.expect_token(&Token::RParen)?;
+        let alias = self.maybe_parse_table_alias()?;
+        Ok(TableFactor::Unpivot {
+            table: Box::new(table),
+            value,
+            null_inclusion,
+            name,
+            columns,
+            alias,
+        })
+    }
+
+    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
+        if natural {
+            Ok(JoinConstraint::Natural)
+        } else if self.parse_keyword(Keyword::ON) {
+            let constraint = self.parse_expr()?;
+            Ok(JoinConstraint::On(constraint))
+        } else if self.parse_keyword(Keyword::USING) {
+            let columns = self.parse_parenthesized_qualified_column_list(Mandatory, false)?;
+            Ok(JoinConstraint::Using(columns))
+        } else {
+            Ok(JoinConstraint::None)
+            //self.expected("ON, or USING after JOIN", self.peek_token())
+        }
+    }
+
+    /// Parse a GRANT statement.
+    pub fn parse_grant(&mut self) -> Result<Statement, ParserError> {
+        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
+
+        self.expect_keyword_is(Keyword::TO)?;
+        let grantees = self.parse_grantees()?;
+
+        let with_grant_option =
+            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
+
+        let current_grants =
+            if self.parse_keywords(&[Keyword::COPY, Keyword::CURRENT, Keyword::GRANTS]) {
+                Some(CurrentGrantsKind::CopyCurrentGrants)
+            } else if self.parse_keywords(&[Keyword::REVOKE, Keyword::CURRENT, Keyword::GRANTS]) {
+                Some(CurrentGrantsKind::RevokeCurrentGrants)
+            } else {
+                None
+            };
+
+        let as_grantor = if self.parse_keywords(&[Keyword::AS]) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        Ok(Statement::Grant {
+            privileges,
+            objects,
+            grantees,
+            with_grant_option,
+            as_grantor,
+            granted_by,
+            current_grants,
+        })
+    }
+
+    fn parse_grantees(&mut self) -> Result<Vec<Grantee>, ParserError> {
+        let mut values = vec![];
+        let mut grantee_type = GranteesType::None;
+        loop {
+            let new_grantee_type = if self.parse_keyword(Keyword::ROLE) {
+                GranteesType::Role
+            } else if self.parse_keyword(Keyword::USER) {
+                GranteesType::User
+            } else if self.parse_keyword(Keyword::SHARE) {
+                GranteesType::Share
+            } else if self.parse_keyword(Keyword::GROUP) {
+                GranteesType::Group
+            } else if self.parse_keyword(Keyword::PUBLIC) {
+                GranteesType::Public
+            } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
+                GranteesType::DatabaseRole
+            } else if self.parse_keywords(&[Keyword::APPLICATION, Keyword::ROLE]) {
+                GranteesType::ApplicationRole
+            } else if self.parse_keyword(Keyword::APPLICATION) {
+                GranteesType::Application
+            } else {
+                grantee_type.clone() // keep from previous iteraton, if not specified
+            };
+
+            if self
+                .dialect
+                .get_reserved_grantees_types()
+                .contains(&new_grantee_type)
+            {
+                self.prev_token();
+            } else {
+                grantee_type = new_grantee_type;
+            }
+
+            let grantee = if grantee_type == GranteesType::Public {
+                Grantee {
+                    grantee_type: grantee_type.clone(),
+                    name: None,
+                }
+            } else {
+                let mut name = self.parse_grantee_name()?;
+                if self.consume_token(&Token::Colon) {
+                    // Redshift supports namespace prefix for external users and groups:
+                    // <Namespace>:<GroupName> or <Namespace>:<UserName>
+                    // https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html
+                    let ident = self.parse_identifier()?;
+                    if let GranteeName::ObjectName(namespace) = name {
+                        name = GranteeName::ObjectName(ObjectName::from(vec![Ident::new(
+                            format!("{namespace}:{ident}"),
+                        )]));
+                    };
+                }
+                Grantee {
+                    grantee_type: grantee_type.clone(),
+                    name: Some(name),
+                }
+            };
+
+            values.push(grantee);
+
+            if !self.consume_token(&Token::Comma) {
+                break;
+            }
+        }
+
+        Ok(values)
+    }
+
+    pub fn parse_grant_deny_revoke_privileges_objects(
+        &mut self,
+    ) -> Result<(Privileges, Option<GrantObjects>), ParserError> {
+        let privileges = if self.parse_keyword(Keyword::ALL) {
+            Privileges::All {
+                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
+            }
+        } else {
+            let actions = self.parse_actions_list()?;
+            Privileges::Actions(actions)
+        };
+
+        let objects = if self.parse_keyword(Keyword::ON) {
+            if self.parse_keywords(&[Keyword::ALL, Keyword::TABLES, Keyword::IN, Keyword::SCHEMA]) {
+                Some(GrantObjects::AllTablesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::ALL,
+                Keyword::EXTERNAL,
+                Keyword::TABLES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::AllExternalTablesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::ALL,
+                Keyword::VIEWS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::AllViewsInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::ALL,
+                Keyword::MATERIALIZED,
+                Keyword::VIEWS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::AllMaterializedViewsInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::ALL,
+                Keyword::FUNCTIONS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::AllFunctionsInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::SCHEMAS,
+                Keyword::IN,
+                Keyword::DATABASE,
+            ]) {
+                Some(GrantObjects::FutureSchemasInDatabase {
+                    databases: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::TABLES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureTablesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::EXTERNAL,
+                Keyword::TABLES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureExternalTablesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::VIEWS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureViewsInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::MATERIALIZED,
+                Keyword::VIEWS,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureMaterializedViewsInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::ALL,
+                Keyword::SEQUENCES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::AllSequencesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[
+                Keyword::FUTURE,
+                Keyword::SEQUENCES,
+                Keyword::IN,
+                Keyword::SCHEMA,
+            ]) {
+                Some(GrantObjects::FutureSequencesInSchema {
+                    schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                })
+            } else if self.parse_keywords(&[Keyword::RESOURCE, Keyword::MONITOR]) {
+                Some(GrantObjects::ResourceMonitors(
+                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                ))
+            } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
+                Some(GrantObjects::ComputePools(
+                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                ))
+            } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
+                Some(GrantObjects::FailoverGroup(
+                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                ))
+            } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
+                Some(GrantObjects::ReplicationGroup(
+                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                ))
+            } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
+                Some(GrantObjects::ExternalVolumes(
+                    self.parse_comma_separated(|p| p.parse_object_name(false))?,
+                ))
+            } else {
+                let object_type = self.parse_one_of_keywords(&[
+                    Keyword::SEQUENCE,
+                    Keyword::DATABASE,
+                    Keyword::SCHEMA,
+                    Keyword::TABLE,
+                    Keyword::VIEW,
+                    Keyword::WAREHOUSE,
+                    Keyword::INTEGRATION,
+                    Keyword::VIEW,
+                    Keyword::WAREHOUSE,
+                    Keyword::INTEGRATION,
+                    Keyword::USER,
+                    Keyword::CONNECTION,
+                    Keyword::PROCEDURE,
+                    Keyword::FUNCTION,
+                ]);
+                let objects =
+                    self.parse_comma_separated(|p| p.parse_object_name_inner(false, true));
+                match object_type {
+                    Some(Keyword::DATABASE) => Some(GrantObjects::Databases(objects?)),
+                    Some(Keyword::SCHEMA) => Some(GrantObjects::Schemas(objects?)),
+                    Some(Keyword::SEQUENCE) => Some(GrantObjects::Sequences(objects?)),
+                    Some(Keyword::WAREHOUSE) => Some(GrantObjects::Warehouses(objects?)),
+                    Some(Keyword::INTEGRATION) => Some(GrantObjects::Integrations(objects?)),
+                    Some(Keyword::VIEW) => Some(GrantObjects::Views(objects?)),
+                    Some(Keyword::USER) => Some(GrantObjects::Users(objects?)),
+                    Some(Keyword::CONNECTION) => Some(GrantObjects::Connections(objects?)),
+                    kw @ (Some(Keyword::PROCEDURE) | Some(Keyword::FUNCTION)) => {
+                        if let Some(name) = objects?.first() {
+                            self.parse_grant_procedure_or_function(name, &kw)?
+                        } else {
+                            self.expected("procedure or function name", self.peek_token())?
+                        }
+                    }
+                    Some(Keyword::TABLE) | None => Some(GrantObjects::Tables(objects?)),
+                    _ => unreachable!(),
+                }
+            }
         } else {
             None
         };
 
-        Ok(ExprWithAlias { expr, alias })
+        Ok((privileges, objects))
     }
 
-    pub fn parse_pivot_table_factor(
+    fn parse_grant_procedure_or_function(
         &mut self,
-        table: TableFactor,
-    ) -> Result<TableFactor, ParserError> {
-        self.expect_token(&Token::LParen)?;
-        let aggregate_functions = self.parse_comma_separated(Self::parse_aliased_function_call)?;
-        self.expect_keyword(Keyword::FOR)?;
-        let value_column = self.parse_object_name(false)?.0;
-        self.expect_keyword(Keyword::IN)?;
-
-        self.expect_token(&Token::LParen)?;
-        let value_source = if self.parse_keyword(Keyword::ANY) {
-            let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
-                self.parse_comma_separated(Parser::parse_order_by_expr)?
-            } else {
-                vec![]
-            };
-            PivotValueSource::Any(order_by)
-        } else if self.peek_sub_query() {
-            PivotValueSource::Subquery(self.parse_query()?)
+        name: &ObjectName,
+        kw: &Option<Keyword>,
+    ) -> Result<Option<GrantObjects>, ParserError> {
+        let arg_types = if self.consume_token(&Token::LParen) {
+            let list = self.parse_comma_separated0(Self::parse_data_type, Token::RParen)?;
+            self.expect_token(&Token::RParen)?;
+            list
         } else {
-            PivotValueSource::List(self.parse_comma_separated(Self::parse_expr_with_alias)?)
+            vec![]
         };
-        self.expect_token(&Token::RParen)?;
-
-        let default_on_null =
-            if self.parse_keywords(&[Keyword::DEFAULT, Keyword::ON, Keyword::NULL]) {
-                self.expect_token(&Token::LParen)?;
-                let expr = self.parse_expr()?;
-                self.expect_token(&Token::RParen)?;
-                Some(expr)
+        match kw {
+            Some(Keyword::PROCEDURE) => Ok(Some(GrantObjects::Procedure {
+                name: name.clone(),
+                arg_types,
+            })),
+            Some(Keyword::FUNCTION) => Ok(Some(GrantObjects::Function {
+                name: name.clone(),
+                arg_types,
+            })),
+            _ => self.expected("procedure or function keywords", self.peek_token())?,
+        }
+    }
+
+    pub fn parse_grant_permission(&mut self) -> Result<Action, ParserError> {
+        fn parse_columns(parser: &mut Parser) -> Result<Option<Vec<Ident>>, ParserError> {
+            let columns = parser.parse_parenthesized_column_list(Optional, false)?;
+            if columns.is_empty() {
+                Ok(None)
             } else {
-                None
-            };
-
-        self.expect_token(&Token::RParen)?;
-        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
-        Ok(TableFactor::Pivot {
-            table: Box::new(table),
-            aggregate_functions,
-            value_column,
-            value_source,
-            default_on_null,
-            alias,
-        })
+                Ok(Some(columns))
+            }
+        }
+
+        // Multi-word privileges
+        if self.parse_keywords(&[Keyword::IMPORTED, Keyword::PRIVILEGES]) {
+            Ok(Action::ImportedPrivileges)
+        } else if self.parse_keywords(&[Keyword::ADD, Keyword::SEARCH, Keyword::OPTIMIZATION]) {
+            Ok(Action::AddSearchOptimization)
+        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::LISTING]) {
+            Ok(Action::AttachListing)
+        } else if self.parse_keywords(&[Keyword::ATTACH, Keyword::POLICY]) {
+            Ok(Action::AttachPolicy)
+        } else if self.parse_keywords(&[Keyword::BIND, Keyword::SERVICE, Keyword::ENDPOINT]) {
+            Ok(Action::BindServiceEndpoint)
+        } else if self.parse_keywords(&[Keyword::DATABASE, Keyword::ROLE]) {
+            let role = self.parse_object_name(false)?;
+            Ok(Action::DatabaseRole { role })
+        } else if self.parse_keywords(&[Keyword::EVOLVE, Keyword::SCHEMA]) {
+            Ok(Action::EvolveSchema)
+        } else if self.parse_keywords(&[Keyword::IMPORT, Keyword::SHARE]) {
+            Ok(Action::ImportShare)
+        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::VERSIONS]) {
+            Ok(Action::ManageVersions)
+        } else if self.parse_keywords(&[Keyword::MANAGE, Keyword::RELEASES]) {
+            Ok(Action::ManageReleases)
+        } else if self.parse_keywords(&[Keyword::OVERRIDE, Keyword::SHARE, Keyword::RESTRICTIONS]) {
+            Ok(Action::OverrideShareRestrictions)
+        } else if self.parse_keywords(&[
+            Keyword::PURCHASE,
+            Keyword::DATA,
+            Keyword::EXCHANGE,
+            Keyword::LISTING,
+        ]) {
+            Ok(Action::PurchaseDataExchangeListing)
+        } else if self.parse_keywords(&[Keyword::RESOLVE, Keyword::ALL]) {
+            Ok(Action::ResolveAll)
+        } else if self.parse_keywords(&[Keyword::READ, Keyword::SESSION]) {
+            Ok(Action::ReadSession)
+
+        // Single-word privileges
+        } else if self.parse_keyword(Keyword::APPLY) {
+            let apply_type = self.parse_action_apply_type()?;
+            Ok(Action::Apply { apply_type })
+        } else if self.parse_keyword(Keyword::APPLYBUDGET) {
+            Ok(Action::ApplyBudget)
+        } else if self.parse_keyword(Keyword::AUDIT) {
+            Ok(Action::Audit)
+        } else if self.parse_keyword(Keyword::CONNECT) {
+            Ok(Action::Connect)
+        } else if self.parse_keyword(Keyword::CREATE) {
+            let obj_type = self.maybe_parse_action_create_object_type();
+            Ok(Action::Create { obj_type })
+        } else if self.parse_keyword(Keyword::DELETE) {
+            Ok(Action::Delete)
+        } else if self.parse_keyword(Keyword::EXEC) {
+            let obj_type = self.maybe_parse_action_execute_obj_type();
+            Ok(Action::Exec { obj_type })
+        } else if self.parse_keyword(Keyword::EXECUTE) {
+            let obj_type = self.maybe_parse_action_execute_obj_type();
+            Ok(Action::Execute { obj_type })
+        } else if self.parse_keyword(Keyword::FAILOVER) {
+            Ok(Action::Failover)
+        } else if self.parse_keyword(Keyword::INSERT) {
+            Ok(Action::Insert {
+                columns: parse_columns(self)?,
+            })
+        } else if self.parse_keyword(Keyword::MANAGE) {
+            let manage_type = self.parse_action_manage_type()?;
+            Ok(Action::Manage { manage_type })
+        } else if self.parse_keyword(Keyword::MODIFY) {
+            let modify_type = self.parse_action_modify_type();
+            Ok(Action::Modify { modify_type })
+        } else if self.parse_keyword(Keyword::MONITOR) {
+            let monitor_type = self.parse_action_monitor_type();
+            Ok(Action::Monitor { monitor_type })
+        } else if self.parse_keyword(Keyword::OPERATE) {
+            Ok(Action::Operate)
+        } else if self.parse_keyword(Keyword::REFERENCES) {
+            Ok(Action::References {
+                columns: parse_columns(self)?,
+            })
+        } else if self.parse_keyword(Keyword::READ) {
+            Ok(Action::Read)
+        } else if self.parse_keyword(Keyword::REPLICATE) {
+            Ok(Action::Replicate)
+        } else if self.parse_keyword(Keyword::ROLE) {
+            let role = self.parse_object_name(false)?;
+            Ok(Action::Role { role })
+        } else if self.parse_keyword(Keyword::SELECT) {
+            Ok(Action::Select {
+                columns: parse_columns(self)?,
+            })
+        } else if self.parse_keyword(Keyword::TEMPORARY) {
+            Ok(Action::Temporary)
+        } else if self.parse_keyword(Keyword::TRIGGER) {
+            Ok(Action::Trigger)
+        } else if self.parse_keyword(Keyword::TRUNCATE) {
+            Ok(Action::Truncate)
+        } else if self.parse_keyword(Keyword::UPDATE) {
+            Ok(Action::Update {
+                columns: parse_columns(self)?,
+            })
+        } else if self.parse_keyword(Keyword::USAGE) {
+            Ok(Action::Usage)
+        } else if self.parse_keyword(Keyword::OWNERSHIP) {
+            Ok(Action::Ownership)
+        } else if self.parse_keyword(Keyword::DROP) {
+            Ok(Action::Drop)
+        } else {
+            self.expected("a privilege keyword", self.peek_token())?
+        }
     }
 
-    pub fn parse_unpivot_table_factor(
-        &mut self,
-        table: TableFactor,
-    ) -> Result<TableFactor, ParserError> {
-        self.expect_token(&Token::LParen)?;
-        let value = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::FOR)?;
-        let name = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::IN)?;
-        let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
-        self.expect_token(&Token::RParen)?;
-        let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
-        Ok(TableFactor::Unpivot {
-            table: Box::new(table),
-            value,
-            name,
-            columns,
-            alias,
-        })
+    fn maybe_parse_action_create_object_type(&mut self) -> Option<ActionCreateObjectType> {
+        // Multi-word object types
+        if self.parse_keywords(&[Keyword::APPLICATION, Keyword::PACKAGE]) {
+            Some(ActionCreateObjectType::ApplicationPackage)
+        } else if self.parse_keywords(&[Keyword::COMPUTE, Keyword::POOL]) {
+            Some(ActionCreateObjectType::ComputePool)
+        } else if self.parse_keywords(&[Keyword::DATA, Keyword::EXCHANGE, Keyword::LISTING]) {
+            Some(ActionCreateObjectType::DataExchangeListing)
+        } else if self.parse_keywords(&[Keyword::EXTERNAL, Keyword::VOLUME]) {
+            Some(ActionCreateObjectType::ExternalVolume)
+        } else if self.parse_keywords(&[Keyword::FAILOVER, Keyword::GROUP]) {
+            Some(ActionCreateObjectType::FailoverGroup)
+        } else if self.parse_keywords(&[Keyword::NETWORK, Keyword::POLICY]) {
+            Some(ActionCreateObjectType::NetworkPolicy)
+        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::LISTING]) {
+            Some(ActionCreateObjectType::OrganiationListing)
+        } else if self.parse_keywords(&[Keyword::REPLICATION, Keyword::GROUP]) {
+            Some(ActionCreateObjectType::ReplicationGroup)
+        }
+        // Single-word object types
+        else if self.parse_keyword(Keyword::ACCOUNT) {
+            Some(ActionCreateObjectType::Account)
+        } else if self.parse_keyword(Keyword::APPLICATION) {
+            Some(ActionCreateObjectType::Application)
+        } else if self.parse_keyword(Keyword::DATABASE) {
+            Some(ActionCreateObjectType::Database)
+        } else if self.parse_keyword(Keyword::INTEGRATION) {
+            Some(ActionCreateObjectType::Integration)
+        } else if self.parse_keyword(Keyword::ROLE) {
+            Some(ActionCreateObjectType::Role)
+        } else if self.parse_keyword(Keyword::SCHEMA) {
+            Some(ActionCreateObjectType::Schema)
+        } else if self.parse_keyword(Keyword::SHARE) {
+            Some(ActionCreateObjectType::Share)
+        } else if self.parse_keyword(Keyword::USER) {
+            Some(ActionCreateObjectType::User)
+        } else if self.parse_keyword(Keyword::WAREHOUSE) {
+            Some(ActionCreateObjectType::Warehouse)
+        } else {
+            None
+        }
     }
 
-    pub fn parse_join_constraint(&mut self, natural: bool) -> Result<JoinConstraint, ParserError> {
-        if natural {
-            Ok(JoinConstraint::Natural)
-        } else if self.parse_keyword(Keyword::ON) {
-            let constraint = self.parse_expr()?;
-            Ok(JoinConstraint::On(constraint))
-        } else if self.parse_keyword(Keyword::USING) {
-            let columns = self.parse_parenthesized_column_list(Mandatory, false)?;
-            Ok(JoinConstraint::Using(columns))
+    fn parse_action_apply_type(&mut self) -> Result<ActionApplyType, ParserError> {
+        if self.parse_keywords(&[Keyword::AGGREGATION, Keyword::POLICY]) {
+            Ok(ActionApplyType::AggregationPolicy)
+        } else if self.parse_keywords(&[Keyword::AUTHENTICATION, Keyword::POLICY]) {
+            Ok(ActionApplyType::AuthenticationPolicy)
+        } else if self.parse_keywords(&[Keyword::JOIN, Keyword::POLICY]) {
+            Ok(ActionApplyType::JoinPolicy)
+        } else if self.parse_keywords(&[Keyword::MASKING, Keyword::POLICY]) {
+            Ok(ActionApplyType::MaskingPolicy)
+        } else if self.parse_keywords(&[Keyword::PACKAGES, Keyword::POLICY]) {
+            Ok(ActionApplyType::PackagesPolicy)
+        } else if self.parse_keywords(&[Keyword::PASSWORD, Keyword::POLICY]) {
+            Ok(ActionApplyType::PasswordPolicy)
+        } else if self.parse_keywords(&[Keyword::PROJECTION, Keyword::POLICY]) {
+            Ok(ActionApplyType::ProjectionPolicy)
+        } else if self.parse_keywords(&[Keyword::ROW, Keyword::ACCESS, Keyword::POLICY]) {
+            Ok(ActionApplyType::RowAccessPolicy)
+        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::POLICY]) {
+            Ok(ActionApplyType::SessionPolicy)
+        } else if self.parse_keyword(Keyword::TAG) {
+            Ok(ActionApplyType::Tag)
         } else {
-            Ok(JoinConstraint::None)
-            //self.expected("ON, or USING after JOIN", self.peek_token())
+            self.expected("GRANT APPLY type", self.peek_token())
         }
     }
 
-    /// Parse a GRANT statement.
-    pub fn parse_grant(&mut self) -> Result<Statement, ParserError> {
-        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
-
-        self.expect_keyword(Keyword::TO)?;
-        let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+    fn maybe_parse_action_execute_obj_type(&mut self) -> Option<ActionExecuteObjectType> {
+        if self.parse_keywords(&[Keyword::DATA, Keyword::METRIC, Keyword::FUNCTION]) {
+            Some(ActionExecuteObjectType::DataMetricFunction)
+        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::ALERT]) {
+            Some(ActionExecuteObjectType::ManagedAlert)
+        } else if self.parse_keywords(&[Keyword::MANAGED, Keyword::TASK]) {
+            Some(ActionExecuteObjectType::ManagedTask)
+        } else if self.parse_keyword(Keyword::ALERT) {
+            Some(ActionExecuteObjectType::Alert)
+        } else if self.parse_keyword(Keyword::TASK) {
+            Some(ActionExecuteObjectType::Task)
+        } else {
+            None
+        }
+    }
 
-        let with_grant_option =
-            self.parse_keywords(&[Keyword::WITH, Keyword::GRANT, Keyword::OPTION]);
+    fn parse_action_manage_type(&mut self) -> Result<ActionManageType, ParserError> {
+        if self.parse_keywords(&[Keyword::ACCOUNT, Keyword::SUPPORT, Keyword::CASES]) {
+            Ok(ActionManageType::AccountSupportCases)
+        } else if self.parse_keywords(&[Keyword::EVENT, Keyword::SHARING]) {
+            Ok(ActionManageType::EventSharing)
+        } else if self.parse_keywords(&[Keyword::LISTING, Keyword::AUTO, Keyword::FULFILLMENT]) {
+            Ok(ActionManageType::ListingAutoFulfillment)
+        } else if self.parse_keywords(&[Keyword::ORGANIZATION, Keyword::SUPPORT, Keyword::CASES]) {
+            Ok(ActionManageType::OrganizationSupportCases)
+        } else if self.parse_keywords(&[Keyword::USER, Keyword::SUPPORT, Keyword::CASES]) {
+            Ok(ActionManageType::UserSupportCases)
+        } else if self.parse_keyword(Keyword::GRANTS) {
+            Ok(ActionManageType::Grants)
+        } else if self.parse_keyword(Keyword::WAREHOUSES) {
+            Ok(ActionManageType::Warehouses)
+        } else {
+            self.expected("GRANT MANAGE type", self.peek_token())
+        }
+    }
 
-        let granted_by = self
-            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
-            .then(|| self.parse_identifier(false).unwrap());
+    fn parse_action_modify_type(&mut self) -> Option<ActionModifyType> {
+        if self.parse_keywords(&[Keyword::LOG, Keyword::LEVEL]) {
+            Some(ActionModifyType::LogLevel)
+        } else if self.parse_keywords(&[Keyword::TRACE, Keyword::LEVEL]) {
+            Some(ActionModifyType::TraceLevel)
+        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::LOG, Keyword::LEVEL]) {
+            Some(ActionModifyType::SessionLogLevel)
+        } else if self.parse_keywords(&[Keyword::SESSION, Keyword::TRACE, Keyword::LEVEL]) {
+            Some(ActionModifyType::SessionTraceLevel)
+        } else {
+            None
+        }
+    }
 
-        Ok(Statement::Grant {
-            privileges,
-            objects,
-            grantees,
-            with_grant_option,
-            granted_by,
-        })
+    fn parse_action_monitor_type(&mut self) -> Option<ActionMonitorType> {
+        if self.parse_keyword(Keyword::EXECUTION) {
+            Some(ActionMonitorType::Execution)
+        } else if self.parse_keyword(Keyword::SECURITY) {
+            Some(ActionMonitorType::Security)
+        } else if self.parse_keyword(Keyword::USAGE) {
+            Some(ActionMonitorType::Usage)
+        } else {
+            None
+        }
     }
 
-    pub fn parse_grant_revoke_privileges_objects(
-        &mut self,
-    ) -> Result<(Privileges, GrantObjects), ParserError> {
-        let privileges = if self.parse_keyword(Keyword::ALL) {
-            Privileges::All {
-                with_privileges_keyword: self.parse_keyword(Keyword::PRIVILEGES),
-            }
+    pub fn parse_grantee_name(&mut self) -> Result<GranteeName, ParserError> {
+        let mut name = self.parse_object_name(false)?;
+        if self.dialect.supports_user_host_grantee()
+            && name.0.len() == 1
+            && name.0[0].as_ident().is_some()
+            && self.consume_token(&Token::AtSign)
+        {
+            let user = name.0.pop().unwrap().as_ident().unwrap().clone();
+            let host = self.parse_identifier()?;
+            Ok(GranteeName::UserHost { user, host })
         } else {
-            let (actions, err): (Vec<_>, Vec<_>) = self
-                .parse_actions_list()?
-                .into_iter()
-                .map(|(kw, columns)| match kw {
-                    Keyword::DELETE => Ok(Action::Delete),
-                    Keyword::INSERT => Ok(Action::Insert { columns }),
-                    Keyword::REFERENCES => Ok(Action::References { columns }),
-                    Keyword::SELECT => Ok(Action::Select { columns }),
-                    Keyword::TRIGGER => Ok(Action::Trigger),
-                    Keyword::TRUNCATE => Ok(Action::Truncate),
-                    Keyword::UPDATE => Ok(Action::Update { columns }),
-                    Keyword::USAGE => Ok(Action::Usage),
-                    Keyword::CONNECT => Ok(Action::Connect),
-                    Keyword::CREATE => Ok(Action::Create),
-                    Keyword::EXECUTE => Ok(Action::Execute),
-                    Keyword::TEMPORARY => Ok(Action::Temporary),
-                    // This will cover all future added keywords to
-                    // parse_grant_permission and unhandled in this
-                    // match
-                    _ => Err(kw),
-                })
-                .partition(Result::is_ok);
+            Ok(GranteeName::ObjectName(name))
+        }
+    }
 
-            if !err.is_empty() {
-                let errors: Vec<Keyword> = err.into_iter().filter_map(|x| x.err()).collect();
-                return Err(ParserError::ParserError(format!(
-                    "INTERNAL ERROR: GRANT/REVOKE unexpected keyword(s) - {errors:?}"
-                )));
+    /// Parse [`Statement::Deny`]
+    pub fn parse_deny(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keyword(Keyword::DENY)?;
+
+        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
+        let objects = match objects {
+            Some(o) => o,
+            None => {
+                return parser_err!(
+                    "DENY statements must specify an object",
+                    self.peek_token().span.start
+                )
             }
-            let act = actions.into_iter().filter_map(|x| x.ok()).collect();
-            Privileges::Actions(act)
         };
 
-        self.expect_keyword(Keyword::ON)?;
-
-        let objects = if self.parse_keywords(&[
-            Keyword::ALL,
-            Keyword::TABLES,
-            Keyword::IN,
-            Keyword::SCHEMA,
-        ]) {
-            GrantObjects::AllTablesInSchema {
-                schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
-            }
-        } else if self.parse_keywords(&[
-            Keyword::ALL,
-            Keyword::SEQUENCES,
-            Keyword::IN,
-            Keyword::SCHEMA,
-        ]) {
-            GrantObjects::AllSequencesInSchema {
-                schemas: self.parse_comma_separated(|p| p.parse_object_name(false))?,
-            }
+        self.expect_keyword_is(Keyword::TO)?;
+        let grantees = self.parse_grantees()?;
+        let cascade = self.parse_cascade_option();
+        let granted_by = if self.parse_keywords(&[Keyword::AS]) {
+            Some(self.parse_identifier()?)
         } else {
-            let object_type =
-                self.parse_one_of_keywords(&[Keyword::SEQUENCE, Keyword::SCHEMA, Keyword::TABLE]);
-            let objects = self.parse_comma_separated(|p| p.parse_object_name(false));
-            match object_type {
-                Some(Keyword::SCHEMA) => GrantObjects::Schemas(objects?),
-                Some(Keyword::SEQUENCE) => GrantObjects::Sequences(objects?),
-                Some(Keyword::TABLE) | None => GrantObjects::Tables(objects?),
-                _ => unreachable!(),
-            }
+            None
         };
 
-        Ok((privileges, objects))
-    }
-
-    pub fn parse_grant_permission(&mut self) -> Result<ParsedAction, ParserError> {
-        if let Some(kw) = self.parse_one_of_keywords(&[
-            Keyword::CONNECT,
-            Keyword::CREATE,
-            Keyword::DELETE,
-            Keyword::EXECUTE,
-            Keyword::INSERT,
-            Keyword::REFERENCES,
-            Keyword::SELECT,
-            Keyword::TEMPORARY,
-            Keyword::TRIGGER,
-            Keyword::TRUNCATE,
-            Keyword::UPDATE,
-            Keyword::USAGE,
-        ]) {
-            let columns = match kw {
-                Keyword::INSERT | Keyword::REFERENCES | Keyword::SELECT | Keyword::UPDATE => {
-                    let columns = self.parse_parenthesized_column_list(Optional, false)?;
-                    if columns.is_empty() {
-                        None
-                    } else {
-                        Some(columns)
-                    }
-                }
-                _ => None,
-            };
-            Ok((kw, columns))
-        } else {
-            self.expected("a privilege keyword", self.peek_token())?
-        }
+        Ok(Statement::Deny(DenyStatement {
+            privileges,
+            objects,
+            grantees,
+            cascade,
+            granted_by,
+        }))
     }
 
     /// Parse a REVOKE statement
     pub fn parse_revoke(&mut self) -> Result<Statement, ParserError> {
-        let (privileges, objects) = self.parse_grant_revoke_privileges_objects()?;
+        let (privileges, objects) = self.parse_grant_deny_revoke_privileges_objects()?;
 
-        self.expect_keyword(Keyword::FROM)?;
-        let grantees = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+        self.expect_keyword_is(Keyword::FROM)?;
+        let grantees = self.parse_grantees()?;
 
-        let granted_by = self
-            .parse_keywords(&[Keyword::GRANTED, Keyword::BY])
-            .then(|| self.parse_identifier(false).unwrap());
+        let granted_by = if self.parse_keywords(&[Keyword::GRANTED, Keyword::BY]) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
 
-        let loc = self.peek_token().location;
-        let cascade = self.parse_keyword(Keyword::CASCADE);
-        let restrict = self.parse_keyword(Keyword::RESTRICT);
-        if cascade && restrict {
-            return parser_err!("Cannot specify both CASCADE and RESTRICT in REVOKE", loc);
-        }
+        let cascade = self.parse_cascade_option();
 
         Ok(Statement::Revoke {
             privileges,
@@ -11053,7 +14811,10 @@ impl<'a> Parser<'a> {
     /// Parse an REPLACE statement
     pub fn parse_replace(&mut self) -> Result<Statement, ParserError> {
         if !dialect_of!(self is MySqlDialect | GenericDialect) {
-            return parser_err!("Unsupported statement REPLACE", self.peek_token().location);
+            return parser_err!(
+                "Unsupported statement REPLACE",
+                self.peek_token().span.start
+            );
         }
 
         let mut insert = self.parse_insert()?;
@@ -11091,9 +14852,8 @@ impl<'a> Parser<'a> {
 
         let replace_into = false;
 
-        let action = self.parse_one_of_keywords(&[Keyword::INTO, Keyword::OVERWRITE]);
-        let into = action == Some(Keyword::INTO);
-        let overwrite = action == Some(Keyword::OVERWRITE);
+        let overwrite = self.parse_keyword(Keyword::OVERWRITE);
+        let into = self.parse_keyword(Keyword::INTO);
 
         let local = self.parse_keyword(Keyword::LOCAL);
 
@@ -11115,21 +14875,23 @@ impl<'a> Parser<'a> {
         } else {
             // Hive lets you put table here regardless
             let table = self.parse_keyword(Keyword::TABLE);
-            let table_name = self.parse_object_name(false)?;
+            let table_object = self.parse_table_object()?;
 
             let table_alias =
                 if dialect_of!(self is PostgreSqlDialect) && self.parse_keyword(Keyword::AS) {
-                    Some(self.parse_identifier(false)?)
+                    Some(self.parse_identifier()?)
                 } else {
                     None
                 };
 
             let is_mysql = dialect_of!(self is MySqlDialect);
 
-            let (columns, partitioned, after_columns, source) =
-                if self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]) {
-                    (vec![], None, vec![], None)
-                } else {
+            let (columns, partitioned, after_columns, source, assignments) = if self
+                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
+            {
+                (vec![], None, vec![], None, vec![])
+            } else {
+                let (columns, partitioned, after_columns) = if !self.peek_subquery_start() {
                     let columns = self.parse_parenthesized_column_list(Optional, is_mysql)?;
 
                     let partitioned = self.parse_insert_partition()?;
@@ -11139,12 +14901,40 @@ impl<'a> Parser<'a> {
                     } else {
                         vec![]
                     };
+                    (columns, partitioned, after_columns)
+                } else {
+                    Default::default()
+                };
+
+                let (source, assignments) = if self.peek_keyword(Keyword::FORMAT)
+                    || self.peek_keyword(Keyword::SETTINGS)
+                {
+                    (None, vec![])
+                } else if self.dialect.supports_insert_set() && self.parse_keyword(Keyword::SET) {
+                    (None, self.parse_comma_separated(Parser::parse_assignment)?)
+                } else {
+                    (Some(self.parse_query()?), vec![])
+                };
+
+                (columns, partitioned, after_columns, source, assignments)
+            };
 
-                    let source = Some(self.parse_query()?);
+            let (format_clause, settings) = if self.dialect.supports_insert_format() {
+                // Settings always comes before `FORMAT` for ClickHouse:
+                // <https://clickhouse.com/docs/en/sql-reference/statements/insert-into>
+                let settings = self.parse_settings()?;
 
-                    (columns, partitioned, after_columns, source)
+                let format = if self.parse_keyword(Keyword::FORMAT) {
+                    Some(self.parse_input_format_clause()?)
+                } else {
+                    None
                 };
 
+                (format, settings)
+            } else {
+                Default::default()
+            };
+
             let insert_alias = if dialect_of!(self is MySqlDialect | GenericDialect)
                 && self.parse_keyword(Keyword::AS)
             {
@@ -11171,12 +14961,12 @@ impl<'a> Parser<'a> {
                             None
                         };
 
-                    self.expect_keyword(Keyword::DO)?;
+                    self.expect_keyword_is(Keyword::DO)?;
                     let action = if self.parse_keyword(Keyword::NOTHING) {
                         OnConflictAction::DoNothing
                     } else {
-                        self.expect_keyword(Keyword::UPDATE)?;
-                        self.expect_keyword(Keyword::SET)?;
+                        self.expect_keyword_is(Keyword::UPDATE)?;
+                        self.expect_keyword_is(Keyword::SET)?;
                         let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
                         let selection = if self.parse_keyword(Keyword::WHERE) {
                             Some(self.parse_expr()?)
@@ -11194,9 +14984,9 @@ impl<'a> Parser<'a> {
                         action,
                     }))
                 } else {
-                    self.expect_keyword(Keyword::DUPLICATE)?;
-                    self.expect_keyword(Keyword::KEY)?;
-                    self.expect_keyword(Keyword::UPDATE)?;
+                    self.expect_keyword_is(Keyword::DUPLICATE)?;
+                    self.expect_keyword_is(Keyword::KEY)?;
+                    self.expect_keyword_is(Keyword::UPDATE)?;
                     let l = self.parse_comma_separated(Parser::parse_assignment)?;
 
                     Some(OnInsert::DuplicateKeyUpdate(l))
@@ -11213,7 +15003,7 @@ impl<'a> Parser<'a> {
 
             Ok(Statement::Insert(Insert {
                 or,
-                table_name,
+                table: table_object,
                 table_alias,
                 ignore,
                 into,
@@ -11222,16 +15012,39 @@ impl<'a> Parser<'a> {
                 columns,
                 after_columns,
                 source,
-                table,
+                assignments,
+                has_table_keyword: table,
                 on,
                 returning,
                 replace_into,
                 priority,
                 insert_alias,
+                settings,
+                format_clause,
             }))
         }
     }
 
+    // Parses input format clause used for [ClickHouse].
+    //
+    // <https://clickhouse.com/docs/en/interfaces/formats>
+    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, ParserError> {
+        let ident = self.parse_identifier()?;
+        let values = self
+            .maybe_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))?
+            .unwrap_or_default();
+
+        Ok(InputFormatClause { ident, values })
+    }
+
+    /// Returns true if the immediate tokens look like the
+    /// beginning of a subquery. `(SELECT ...`
+    fn peek_subquery_start(&mut self) -> bool {
+        let [maybe_lparen, maybe_select] = self.peek_tokens();
+        Token::LParen == maybe_lparen
+            && matches!(maybe_select, Token::Word(w) if w.keyword == Keyword::SELECT)
+    }
+
     fn parse_conflict_clause(&mut self) -> Option<SqliteOnConflict> {
         if self.parse_keywords(&[Keyword::OR, Keyword::REPLACE]) {
             Some(SqliteOnConflict::Replace)
@@ -11266,7 +15079,7 @@ impl<'a> Parser<'a> {
     ) -> Result<Option<HiveLoadDataFormat>, ParserError> {
         if self.parse_keyword(Keyword::INPUTFORMAT) {
             let input_format = self.parse_expr()?;
-            self.expect_keyword(Keyword::SERDE)?;
+            self.expect_keyword_is(Keyword::SERDE)?;
             let serde = self.parse_expr()?;
             Ok(Some(HiveLoadDataFormat {
                 input_format,
@@ -11287,14 +15100,21 @@ impl<'a> Parser<'a> {
     pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
         let or = self.parse_conflict_clause();
         let table = self.parse_table_and_joins()?;
+        let from_before_set = if self.parse_keyword(Keyword::FROM) {
+            Some(UpdateTableFromKind::BeforeSet(
+                self.parse_table_with_joins()?,
+            ))
+        } else {
+            None
+        };
         self.expect_keyword(Keyword::SET)?;
         let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
-        let from = if self.parse_keyword(Keyword::FROM)
-            && dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect | SQLiteDialect )
-        {
-            Some(self.parse_table_and_joins()?)
+        let from = if from_before_set.is_none() && self.parse_keyword(Keyword::FROM) {
+            Some(UpdateTableFromKind::AfterSet(
+                self.parse_table_with_joins()?,
+            ))
         } else {
-            None
+            from_before_set
         };
         let selection = if self.parse_keyword(Keyword::WHERE) {
             Some(self.parse_expr()?)
@@ -11350,7 +15170,7 @@ impl<'a> Parser<'a> {
             })?
         } else {
             self.maybe_parse(|p| {
-                let name = p.parse_identifier(false)?;
+                let name = p.parse_identifier()?;
                 let operator = p.parse_function_named_arg_operator()?;
                 let arg = p.parse_wildcard_expr()?.into();
                 Ok(FunctionArg::Named {
@@ -11367,6 +15187,9 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_function_named_arg_operator(&mut self) -> Result<FunctionArgOperator, ParserError> {
+        if self.parse_keyword(Keyword::VALUE) {
+            return Ok(FunctionArgOperator::Value);
+        }
         let tok = self.next_token();
         match tok.token {
             Token::RArrow if self.dialect.supports_named_fn_args_with_rarrow_operator() => {
@@ -11483,7 +15306,7 @@ impl<'a> Parser<'a> {
         if dialect_of!(self is GenericDialect | MySqlDialect)
             && self.parse_keyword(Keyword::SEPARATOR)
         {
-            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?));
+            clauses.push(FunctionArgumentClause::Separator(self.parse_value()?.value));
         }
 
         if let Some(on_overflow) = self.parse_listagg_on_overflow()? {
@@ -11514,7 +15337,7 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_duplicate_treatment(&mut self) -> Result<Option<DuplicateTreatment>, ParserError> {
-        let loc = self.peek_token().location;
+        let loc = self.peek_token().span.start;
         match (
             self.parse_keyword(Keyword::ALL),
             self.parse_keyword(Keyword::DISTINCT),
@@ -11528,18 +15351,25 @@ impl<'a> Parser<'a> {
 
     /// Parse a comma-delimited list of projections after SELECT
     pub fn parse_select_item(&mut self) -> Result<SelectItem, ParserError> {
+        let prefix = self
+            .parse_one_of_keywords(
+                self.dialect
+                    .get_reserved_keywords_for_select_item_operator(),
+            )
+            .map(|keyword| Ident::new(format!("{keyword:?}")));
+
         match self.parse_wildcard_expr()? {
-            Expr::QualifiedWildcard(prefix) => Ok(SelectItem::QualifiedWildcard(
-                prefix,
-                self.parse_wildcard_additional_options()?,
+            Expr::QualifiedWildcard(prefix, token) => Ok(SelectItem::QualifiedWildcard(
+                SelectItemQualifiedWildcardKind::ObjectName(prefix),
+                self.parse_wildcard_additional_options(token.0)?,
             )),
-            Expr::Wildcard => Ok(SelectItem::Wildcard(
-                self.parse_wildcard_additional_options()?,
+            Expr::Wildcard(token) => Ok(SelectItem::Wildcard(
+                self.parse_wildcard_additional_options(token.0)?,
             )),
             Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none() => {
                 parser_err!(
                     format!("Expected an expression, found: {}", v),
-                    self.peek_token().location
+                    self.peek_token().span.start
                 )
             }
             Expr::BinaryOp {
@@ -11552,7 +15382,7 @@ impl<'a> Parser<'a> {
                 let Expr::Identifier(alias) = *left else {
                     return parser_err!(
                         "BUG: expected identifier expression as alias",
-                        self.peek_token().location
+                        self.peek_token().span.start
                     );
                 };
                 Ok(SelectItem::ExprWithAlias {
@@ -11560,11 +15390,23 @@ impl<'a> Parser<'a> {
                     alias,
                 })
             }
+            expr if self.dialect.supports_select_expr_star()
+                && self.consume_tokens(&[Token::Period, Token::Mul]) =>
+            {
+                let wildcard_token = self.get_previous_token().clone();
+                Ok(SelectItem::QualifiedWildcard(
+                    SelectItemQualifiedWildcardKind::Expr(expr),
+                    self.parse_wildcard_additional_options(wildcard_token)?,
+                ))
+            }
             expr => self
-                .parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
+                .maybe_parse_select_item_alias()
                 .map(|alias| match alias {
-                    Some(alias) => SelectItem::ExprWithAlias { expr, alias },
-                    None => SelectItem::UnnamedExpr(expr),
+                    Some(alias) => SelectItem::ExprWithAlias {
+                        expr: maybe_prefixed_expr(expr, prefix),
+                        alias,
+                    },
+                    None => SelectItem::UnnamedExpr(maybe_prefixed_expr(expr, prefix)),
                 }),
         }
     }
@@ -11574,14 +15416,14 @@ impl<'a> Parser<'a> {
     /// If it is not possible to parse it, will return an option.
     pub fn parse_wildcard_additional_options(
         &mut self,
+        wildcard_token: TokenWithSpan,
     ) -> Result<WildcardAdditionalOptions, ParserError> {
         let opt_ilike = if dialect_of!(self is GenericDialect | SnowflakeDialect) {
             self.parse_optional_select_item_ilike()?
         } else {
             None
         };
-        let opt_exclude = if opt_ilike.is_none()
-            && dialect_of!(self is GenericDialect | DuckDbDialect | SnowflakeDialect)
+        let opt_exclude = if opt_ilike.is_none() && self.dialect.supports_select_wildcard_exclude()
         {
             self.parse_optional_select_item_exclude()?
         } else {
@@ -11605,6 +15447,7 @@ impl<'a> Parser<'a> {
         };
 
         Ok(WildcardAdditionalOptions {
+            wildcard_token: wildcard_token.into(),
             opt_ilike,
             opt_exclude,
             opt_except,
@@ -11640,12 +15483,11 @@ impl<'a> Parser<'a> {
     ) -> Result<Option<ExcludeSelectItem>, ParserError> {
         let opt_exclude = if self.parse_keyword(Keyword::EXCLUDE) {
             if self.consume_token(&Token::LParen) {
-                let columns =
-                    self.parse_comma_separated(|parser| parser.parse_identifier(false))?;
+                let columns = self.parse_comma_separated(|parser| parser.parse_identifier())?;
                 self.expect_token(&Token::RParen)?;
                 Some(ExcludeSelectItem::Multiple(columns))
             } else {
-                let column = self.parse_identifier(false)?;
+                let column = self.parse_identifier()?;
                 Some(ExcludeSelectItem::Single(column))
             }
         } else {
@@ -11678,7 +15520,7 @@ impl<'a> Parser<'a> {
                 }
             } else {
                 // Clickhouse allows EXCEPT column_name
-                let ident = self.parse_identifier(false)?;
+                let ident = self.parse_identifier()?;
                 Some(ExceptSelectItem {
                     first_element: ident,
                     additional_elements: vec![],
@@ -11736,7 +15578,7 @@ impl<'a> Parser<'a> {
     pub fn parse_replace_elements(&mut self) -> Result<ReplaceSelectElement, ParserError> {
         let expr = self.parse_expr()?;
         let as_keyword = self.parse_keyword(Keyword::AS);
-        let ident = self.parse_identifier(false)?;
+        let ident = self.parse_identifier()?;
         Ok(ReplaceSelectElement {
             expr,
             column_name: ident,
@@ -11753,13 +15595,66 @@ impl<'a> Parser<'a> {
             Some(false)
         } else {
             None
-        }
-    }
+        }
+    }
+
+    /// Parse an [OrderByExpr] expression.
+    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
+        self.parse_order_by_expr_inner(false)
+            .map(|(order_by, _)| order_by)
+    }
+
+    /// Parse an [IndexColumn].
+    pub fn parse_create_index_expr(&mut self) -> Result<IndexColumn, ParserError> {
+        self.parse_order_by_expr_inner(true)
+            .map(|(column, operator_class)| IndexColumn {
+                column,
+                operator_class,
+            })
+    }
+
+    fn parse_order_by_expr_inner(
+        &mut self,
+        with_operator_class: bool,
+    ) -> Result<(OrderByExpr, Option<Ident>), ParserError> {
+        let expr = self.parse_expr()?;
+
+        let operator_class: Option<Ident> = if with_operator_class {
+            // We check that if non of the following keywords are present, then we parse an
+            // identifier as operator class.
+            if self
+                .peek_one_of_keywords(&[Keyword::ASC, Keyword::DESC, Keyword::NULLS, Keyword::WITH])
+                .is_some()
+            {
+                None
+            } else {
+                self.maybe_parse(|parser| parser.parse_identifier())?
+            }
+        } else {
+            None
+        };
+
+        let options = self.parse_order_by_options()?;
+
+        let with_fill = if dialect_of!(self is ClickHouseDialect | GenericDialect)
+            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
+        {
+            Some(self.parse_with_fill()?)
+        } else {
+            None
+        };
 
-    /// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
-    pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {
-        let expr = self.parse_expr()?;
+        Ok((
+            OrderByExpr {
+                expr,
+                options,
+                with_fill,
+            },
+            operator_class,
+        ))
+    }
 
+    fn parse_order_by_options(&mut self) -> Result<OrderByOptions, ParserError> {
         let asc = self.parse_asc_desc();
 
         let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
@@ -11770,20 +15665,7 @@ impl<'a> Parser<'a> {
             None
         };
 
-        let with_fill = if dialect_of!(self is ClickHouseDialect | GenericDialect)
-            && self.parse_keywords(&[Keyword::WITH, Keyword::FILL])
-        {
-            Some(self.parse_with_fill()?)
-        } else {
-            None
-        };
-
-        Ok(OrderByExpr {
-            expr,
-            asc,
-            nulls_first,
-            with_fill,
-        })
+        Ok(OrderByOptions { asc, nulls_first })
     }
 
     // Parse a WITH FILL clause (ClickHouse dialect)
@@ -11810,7 +15692,7 @@ impl<'a> Parser<'a> {
         Ok(WithFill { from, to, step })
     }
 
-    // Parse a set of comma seperated INTERPOLATE expressions (ClickHouse dialect)
+    // Parse a set of comma separated INTERPOLATE expressions (ClickHouse dialect)
     // that follow the INTERPOLATE keyword in an ORDER BY clause with the WITH FILL modifier
     pub fn parse_interpolations(&mut self) -> Result<Option<Interpolate>, ParserError> {
         if !self.parse_keyword(Keyword::INTERPOLATE) {
@@ -11833,7 +15715,7 @@ impl<'a> Parser<'a> {
 
     // Parse a INTERPOLATE expression (ClickHouse dialect)
     pub fn parse_interpolation(&mut self) -> Result<InterpolateExpr, ParserError> {
-        let column = self.parse_identifier(false)?;
+        let column = self.parse_identifier()?;
         let expr = if self.parse_keyword(Keyword::AS) {
             Some(self.parse_expr()?)
         } else {
@@ -11852,7 +15734,7 @@ impl<'a> Parser<'a> {
         } else {
             let next_token = self.next_token();
             let quantity = match next_token.token {
-                Token::Number(s, _) => Self::parse::<u64>(s, next_token.location)?,
+                Token::Number(s, _) => Self::parse::<u64>(s, next_token.span.start)?,
                 _ => self.expected("literal int", next_token)?,
             };
             Some(TopQuantity::Constant(quantity))
@@ -11893,7 +15775,8 @@ impl<'a> Parser<'a> {
 
     /// Parse a FETCH clause
     pub fn parse_fetch(&mut self) -> Result<Fetch, ParserError> {
-        self.expect_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT])?;
+        let _ = self.parse_one_of_keywords(&[Keyword::FIRST, Keyword::NEXT]);
+
         let (quantity, percent) = if self
             .parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])
             .is_some()
@@ -11902,16 +15785,16 @@ impl<'a> Parser<'a> {
         } else {
             let quantity = Expr::Value(self.parse_value()?);
             let percent = self.parse_keyword(Keyword::PERCENT);
-            self.expect_one_of_keywords(&[Keyword::ROW, Keyword::ROWS])?;
+            let _ = self.parse_one_of_keywords(&[Keyword::ROW, Keyword::ROWS]);
             (Some(quantity), percent)
         };
+
         let with_ties = if self.parse_keyword(Keyword::ONLY) {
             false
-        } else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
-            true
         } else {
-            return self.expected("one of ONLY or WITH TIES", self.peek_token());
+            self.parse_keywords(&[Keyword::WITH, Keyword::TIES])
         };
+
         Ok(Fetch {
             with_ties,
             percent,
@@ -11967,11 +15850,15 @@ impl<'a> Parser<'a> {
     }
 
     pub fn parse_start_transaction(&mut self) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TRANSACTION)?;
+        self.expect_keyword_is(Keyword::TRANSACTION)?;
         Ok(Statement::StartTransaction {
             modes: self.parse_transaction_modes()?,
             begin: false,
+            transaction: Some(BeginTransactionKind::Transaction),
             modifier: None,
+            statements: vec![],
+            exception: None,
+            has_end_keyword: false,
         })
     }
 
@@ -11984,20 +15871,88 @@ impl<'a> Parser<'a> {
             Some(TransactionModifier::Immediate)
         } else if self.parse_keyword(Keyword::EXCLUSIVE) {
             Some(TransactionModifier::Exclusive)
+        } else if self.parse_keyword(Keyword::TRY) {
+            Some(TransactionModifier::Try)
+        } else if self.parse_keyword(Keyword::CATCH) {
+            Some(TransactionModifier::Catch)
         } else {
             None
         };
-        let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
+        let transaction = match self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]) {
+            Some(Keyword::TRANSACTION) => Some(BeginTransactionKind::Transaction),
+            Some(Keyword::WORK) => Some(BeginTransactionKind::Work),
+            _ => None,
+        };
         Ok(Statement::StartTransaction {
             modes: self.parse_transaction_modes()?,
             begin: true,
+            transaction,
             modifier,
+            statements: vec![],
+            exception: None,
+            has_end_keyword: false,
+        })
+    }
+
+    pub fn parse_begin_exception_end(&mut self) -> Result<Statement, ParserError> {
+        let statements = self.parse_statement_list(&[Keyword::EXCEPTION, Keyword::END])?;
+
+        let exception = if self.parse_keyword(Keyword::EXCEPTION) {
+            let mut when = Vec::new();
+
+            // We can have multiple `WHEN` arms so we consume all cases until `END`
+            while !self.peek_keyword(Keyword::END) {
+                self.expect_keyword(Keyword::WHEN)?;
+
+                // Each `WHEN` case can have one or more conditions, e.g.
+                // WHEN EXCEPTION_1 [OR EXCEPTION_2] THEN
+                // So we parse identifiers until the `THEN` keyword.
+                let mut idents = Vec::new();
+
+                while !self.parse_keyword(Keyword::THEN) {
+                    let ident = self.parse_identifier()?;
+                    idents.push(ident);
+
+                    self.maybe_parse(|p| p.expect_keyword(Keyword::OR))?;
+                }
+
+                let statements = self.parse_statement_list(&[Keyword::WHEN, Keyword::END])?;
+
+                when.push(ExceptionWhen { idents, statements });
+            }
+
+            Some(when)
+        } else {
+            None
+        };
+
+        self.expect_keyword(Keyword::END)?;
+
+        Ok(Statement::StartTransaction {
+            begin: true,
+            statements,
+            exception,
+            has_end_keyword: true,
+            transaction: None,
+            modifier: None,
+            modes: Default::default(),
         })
     }
 
     pub fn parse_end(&mut self) -> Result<Statement, ParserError> {
+        let modifier = if !self.dialect.supports_end_transaction_modifier() {
+            None
+        } else if self.parse_keyword(Keyword::TRY) {
+            Some(TransactionModifier::Try)
+        } else if self.parse_keyword(Keyword::CATCH) {
+            Some(TransactionModifier::Catch)
+        } else {
+            None
+        };
         Ok(Statement::Commit {
             chain: self.parse_commit_rollback_chain()?,
+            end: true,
+            modifier,
         })
     }
 
@@ -12014,6 +15969,8 @@ impl<'a> Parser<'a> {
                     TransactionIsolationLevel::RepeatableRead
                 } else if self.parse_keyword(Keyword::SERIALIZABLE) {
                     TransactionIsolationLevel::Serializable
+                } else if self.parse_keyword(Keyword::SNAPSHOT) {
+                    TransactionIsolationLevel::Snapshot
                 } else {
                     self.expected("isolation level", self.peek_token())?
                 };
@@ -12040,6 +15997,8 @@ impl<'a> Parser<'a> {
     pub fn parse_commit(&mut self) -> Result<Statement, ParserError> {
         Ok(Statement::Commit {
             chain: self.parse_commit_rollback_chain()?,
+            end: false,
+            modifier: None,
         })
     }
 
@@ -12054,7 +16013,7 @@ impl<'a> Parser<'a> {
         let _ = self.parse_one_of_keywords(&[Keyword::TRANSACTION, Keyword::WORK]);
         if self.parse_keyword(Keyword::AND) {
             let chain = !self.parse_keyword(Keyword::NO);
-            self.expect_keyword(Keyword::CHAIN)?;
+            self.expect_keyword_is(Keyword::CHAIN)?;
             Ok(chain)
         } else {
             Ok(false)
@@ -12064,7 +16023,7 @@ impl<'a> Parser<'a> {
     pub fn parse_rollback_savepoint(&mut self) -> Result<Option<Ident>, ParserError> {
         if self.parse_keyword(Keyword::TO) {
             let _ = self.parse_keyword(Keyword::SAVEPOINT);
-            let savepoint = self.parse_identifier(false)?;
+            let savepoint = self.parse_identifier()?;
 
             Ok(Some(savepoint))
         } else {
@@ -12072,21 +16031,69 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse a 'RAISERROR' statement
+    pub fn parse_raiserror(&mut self) -> Result<Statement, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let message = Box::new(self.parse_expr()?);
+        self.expect_token(&Token::Comma)?;
+        let severity = Box::new(self.parse_expr()?);
+        self.expect_token(&Token::Comma)?;
+        let state = Box::new(self.parse_expr()?);
+        let arguments = if self.consume_token(&Token::Comma) {
+            self.parse_comma_separated(Parser::parse_expr)?
+        } else {
+            vec![]
+        };
+        self.expect_token(&Token::RParen)?;
+        let options = if self.parse_keyword(Keyword::WITH) {
+            self.parse_comma_separated(Parser::parse_raiserror_option)?
+        } else {
+            vec![]
+        };
+        Ok(Statement::RaisError {
+            message,
+            severity,
+            state,
+            arguments,
+            options,
+        })
+    }
+
+    pub fn parse_raiserror_option(&mut self) -> Result<RaisErrorOption, ParserError> {
+        match self.expect_one_of_keywords(&[Keyword::LOG, Keyword::NOWAIT, Keyword::SETERROR])? {
+            Keyword::LOG => Ok(RaisErrorOption::Log),
+            Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
+            Keyword::SETERROR => Ok(RaisErrorOption::SetError),
+            _ => self.expected(
+                "LOG, NOWAIT OR SETERROR raiserror option",
+                self.peek_token(),
+            ),
+        }
+    }
+
     pub fn parse_deallocate(&mut self) -> Result<Statement, ParserError> {
         let prepare = self.parse_keyword(Keyword::PREPARE);
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
         Ok(Statement::Deallocate { name, prepare })
     }
 
     pub fn parse_execute(&mut self) -> Result<Statement, ParserError> {
-        let name = self.parse_object_name(false)?;
+        let name = if self.dialect.supports_execute_immediate()
+            && self.parse_keyword(Keyword::IMMEDIATE)
+        {
+            None
+        } else {
+            let name = self.parse_object_name(false)?;
+            Some(name)
+        };
 
         let has_parentheses = self.consume_token(&Token::LParen);
 
+        let end_kws = &[Keyword::USING, Keyword::OUTPUT, Keyword::DEFAULT];
         let end_token = match (has_parentheses, self.peek_token().token) {
             (true, _) => Token::RParen,
             (false, Token::EOF) => Token::EOF,
-            (false, Token::Word(w)) if w.keyword == Keyword::USING => Token::Word(w),
+            (false, Token::Word(w)) if end_kws.contains(&w.keyword) => Token::Word(w),
             (false, _) => Token::SemiColon,
         };
 
@@ -12096,25 +16103,36 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::RParen)?;
         }
 
-        let mut using = vec![];
-        if self.parse_keyword(Keyword::USING) {
-            using.push(self.parse_expr()?);
+        let into = if self.parse_keyword(Keyword::INTO) {
+            self.parse_comma_separated(Self::parse_identifier)?
+        } else {
+            vec![]
+        };
 
-            while self.consume_token(&Token::Comma) {
-                using.push(self.parse_expr()?);
-            }
+        let using = if self.parse_keyword(Keyword::USING) {
+            self.parse_comma_separated(Self::parse_expr_with_alias)?
+        } else {
+            vec![]
         };
 
+        let output = self.parse_keyword(Keyword::OUTPUT);
+
+        let default = self.parse_keyword(Keyword::DEFAULT);
+
         Ok(Statement::Execute {
+            immediate: name.is_none(),
             name,
             parameters,
             has_parentheses,
+            into,
             using,
+            output,
+            default,
         })
     }
 
     pub fn parse_prepare(&mut self) -> Result<Statement, ParserError> {
-        let name = self.parse_identifier(false)?;
+        let name = self.parse_identifier()?;
 
         let mut data_types = vec![];
         if self.consume_token(&Token::LParen) {
@@ -12122,7 +16140,7 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::RParen)?;
         }
 
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
         let statement = Box::new(self.parse_statement()?);
         Ok(Statement::Prepare {
             name,
@@ -12136,8 +16154,8 @@ impl<'a> Parser<'a> {
         let query = self.parse_query()?;
         self.expect_token(&Token::RParen)?;
 
-        self.expect_keyword(Keyword::TO)?;
-        let to = self.parse_identifier(false)?;
+        self.expect_keyword_is(Keyword::TO)?;
+        let to = self.parse_identifier()?;
 
         let with_options = self.parse_options(Keyword::WITH)?;
 
@@ -12151,16 +16169,15 @@ impl<'a> Parser<'a> {
     pub fn parse_merge_clauses(&mut self) -> Result<Vec<MergeClause>, ParserError> {
         let mut clauses = vec![];
         loop {
-            if self.peek_token() == Token::EOF || self.peek_token() == Token::SemiColon {
+            if !(self.parse_keyword(Keyword::WHEN)) {
                 break;
             }
-            self.expect_keyword(Keyword::WHEN)?;
 
             let mut clause_kind = MergeClauseKind::Matched;
             if self.parse_keyword(Keyword::NOT) {
                 clause_kind = MergeClauseKind::NotMatched;
             }
-            self.expect_keyword(Keyword::MATCHED)?;
+            self.expect_keyword_is(Keyword::MATCHED)?;
 
             if matches!(clause_kind, MergeClauseKind::NotMatched)
                 && self.parse_keywords(&[Keyword::BY, Keyword::SOURCE])
@@ -12178,7 +16195,7 @@ impl<'a> Parser<'a> {
                 None
             };
 
-            self.expect_keyword(Keyword::THEN)?;
+            self.expect_keyword_is(Keyword::THEN)?;
 
             let merge_clause = match self.parse_one_of_keywords(&[
                 Keyword::UPDATE,
@@ -12194,7 +16211,7 @@ impl<'a> Parser<'a> {
                             "UPDATE is not allowed in a {clause_kind} merge clause"
                         )));
                     }
-                    self.expect_keyword(Keyword::SET)?;
+                    self.expect_keyword_is(Keyword::SET)?;
                     MergeAction::Update {
                         assignments: self.parse_comma_separated(Parser::parse_assignment)?,
                     }
@@ -12227,7 +16244,7 @@ impl<'a> Parser<'a> {
                     {
                         MergeInsertKind::Row
                     } else {
-                        self.expect_keyword(Keyword::VALUES)?;
+                        self.expect_keyword_is(Keyword::VALUES)?;
                         let values = self.parse_values(is_mysql)?;
                         MergeInsertKind::Values(values)
                     };
@@ -12248,16 +16265,49 @@ impl<'a> Parser<'a> {
         Ok(clauses)
     }
 
+    fn parse_output(&mut self) -> Result<OutputClause, ParserError> {
+        self.expect_keyword_is(Keyword::OUTPUT)?;
+        let select_items = self.parse_projection()?;
+        self.expect_keyword_is(Keyword::INTO)?;
+        let into_table = self.parse_select_into()?;
+
+        Ok(OutputClause {
+            select_items,
+            into_table,
+        })
+    }
+
+    fn parse_select_into(&mut self) -> Result<SelectInto, ParserError> {
+        let temporary = self
+            .parse_one_of_keywords(&[Keyword::TEMP, Keyword::TEMPORARY])
+            .is_some();
+        let unlogged = self.parse_keyword(Keyword::UNLOGGED);
+        let table = self.parse_keyword(Keyword::TABLE);
+        let name = self.parse_object_name(false)?;
+
+        Ok(SelectInto {
+            temporary,
+            unlogged,
+            table,
+            name,
+        })
+    }
+
     pub fn parse_merge(&mut self) -> Result<Statement, ParserError> {
         let into = self.parse_keyword(Keyword::INTO);
 
         let table = self.parse_table_factor()?;
 
-        self.expect_keyword(Keyword::USING)?;
+        self.expect_keyword_is(Keyword::USING)?;
         let source = self.parse_table_factor()?;
-        self.expect_keyword(Keyword::ON)?;
+        self.expect_keyword_is(Keyword::ON)?;
         let on = self.parse_expr()?;
         let clauses = self.parse_merge_clauses()?;
+        let output = if self.peek_keyword(Keyword::OUTPUT) {
+            Some(self.parse_output()?)
+        } else {
+            None
+        };
 
         Ok(Statement::Merge {
             into,
@@ -12265,11 +16315,12 @@ impl<'a> Parser<'a> {
             source,
             on: Box::new(on),
             clauses,
+            output,
         })
     }
 
     fn parse_pragma_value(&mut self) -> Result<Value, ParserError> {
-        match self.parse_value()? {
+        match self.parse_value()?.value {
             v @ Value::SingleQuotedString(_) => Ok(v),
             v @ Value::DoubleQuotedString(_) => Ok(v),
             v @ Value::Number(_, _) => Ok(v),
@@ -12309,7 +16360,7 @@ impl<'a> Parser<'a> {
 
     /// `INSTALL [extension_name]`
     pub fn parse_install(&mut self) -> Result<Statement, ParserError> {
-        let extension_name = self.parse_identifier(false)?;
+        let extension_name = self.parse_identifier()?;
 
         Ok(Statement::Install { extension_name })
     }
@@ -12317,15 +16368,15 @@ impl<'a> Parser<'a> {
     /// Parse a SQL LOAD statement
     pub fn parse_load(&mut self) -> Result<Statement, ParserError> {
         if self.dialect.supports_load_extension() {
-            let extension_name = self.parse_identifier(false)?;
+            let extension_name = self.parse_identifier()?;
             Ok(Statement::Load { extension_name })
         } else if self.parse_keyword(Keyword::DATA) && self.dialect.supports_load_data() {
             let local = self.parse_one_of_keywords(&[Keyword::LOCAL]).is_some();
-            self.expect_keyword(Keyword::INPATH)?;
+            self.expect_keyword_is(Keyword::INPATH)?;
             let inpath = self.parse_literal_string()?;
             let overwrite = self.parse_one_of_keywords(&[Keyword::OVERWRITE]).is_some();
-            self.expect_keyword(Keyword::INTO)?;
-            self.expect_keyword(Keyword::TABLE)?;
+            self.expect_keyword_is(Keyword::INTO)?;
+            self.expect_keyword_is(Keyword::TABLE)?;
             let table_name = self.parse_object_name(false)?;
             let partitioned = self.parse_insert_partition()?;
             let table_format = self.parse_load_data_table_format()?;
@@ -12350,13 +16401,13 @@ impl<'a> Parser<'a> {
     /// ```
     /// [ClickHouse](https://clickhouse.com/docs/en/sql-reference/statements/optimize)
     pub fn parse_optimize_table(&mut self) -> Result<Statement, ParserError> {
-        self.expect_keyword(Keyword::TABLE)?;
+        self.expect_keyword_is(Keyword::TABLE)?;
         let name = self.parse_object_name(false)?;
         let on_cluster = self.parse_optional_on_cluster()?;
 
         let partition = if self.parse_keyword(Keyword::PARTITION) {
             if self.parse_keyword(Keyword::ID) {
-                Some(Partition::Identifier(self.parse_identifier(false)?))
+                Some(Partition::Identifier(self.parse_identifier()?))
             } else {
                 Some(Partition::Expr(self.parse_expr()?))
             }
@@ -12403,7 +16454,7 @@ impl<'a> Parser<'a> {
         // [ OWNED BY { table_name.column_name | NONE } ]
         let owned_by = if self.parse_keywords(&[Keyword::OWNED, Keyword::BY]) {
             if self.parse_keywords(&[Keyword::NONE]) {
-                Some(ObjectName(vec![Ident::new("NONE")]))
+                Some(ObjectName::from(vec![Ident::new("NONE")]))
             } else {
                 Some(self.parse_object_name(false)?)
             }
@@ -12465,19 +16516,62 @@ impl<'a> Parser<'a> {
         Ok(sequence_options)
     }
 
+    ///   Parse a `CREATE SERVER` statement.
+    ///
+    ///  See [Statement::CreateServer]
+    pub fn parse_pg_create_server(&mut self) -> Result<Statement, ParserError> {
+        let ine = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
+        let name = self.parse_object_name(false)?;
+
+        let server_type = if self.parse_keyword(Keyword::TYPE) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        let version = if self.parse_keyword(Keyword::VERSION) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        self.expect_keywords(&[Keyword::FOREIGN, Keyword::DATA, Keyword::WRAPPER])?;
+        let foreign_data_wrapper = self.parse_object_name(false)?;
+
+        let mut options = None;
+        if self.parse_keyword(Keyword::OPTIONS) {
+            self.expect_token(&Token::LParen)?;
+            options = Some(self.parse_comma_separated(|p| {
+                let key = p.parse_identifier()?;
+                let value = p.parse_identifier()?;
+                Ok(CreateServerOption { key, value })
+            })?);
+            self.expect_token(&Token::RParen)?;
+        }
+
+        Ok(Statement::CreateServer(CreateServerStatement {
+            name,
+            if_not_exists: ine,
+            server_type,
+            version,
+            foreign_data_wrapper,
+            options,
+        }))
+    }
+
     /// The index of the first unprocessed token.
     pub fn index(&self) -> usize {
         self.index
     }
 
     pub fn parse_named_window(&mut self) -> Result<NamedWindowDefinition, ParserError> {
-        let ident = self.parse_identifier(false)?;
-        self.expect_keyword(Keyword::AS)?;
+        let ident = self.parse_identifier()?;
+        self.expect_keyword_is(Keyword::AS)?;
 
         let window_expr = if self.consume_token(&Token::LParen) {
             NamedWindowExpr::WindowSpec(self.parse_window_spec()?)
         } else if self.dialect.supports_window_clause_named_window_reference() {
-            NamedWindowExpr::NamedWindow(self.parse_identifier(false)?)
+            NamedWindowExpr::NamedWindow(self.parse_identifier()?)
         } else {
             return self.expected("(", self.peek_token());
         };
@@ -12488,22 +16582,30 @@ impl<'a> Parser<'a> {
     pub fn parse_create_procedure(&mut self, or_alter: bool) -> Result<Statement, ParserError> {
         let name = self.parse_object_name(false)?;
         let params = self.parse_optional_procedure_parameters()?;
-        self.expect_keyword(Keyword::AS)?;
-        self.expect_keyword(Keyword::BEGIN)?;
-        let statements = self.parse_statements()?;
-        self.expect_keyword(Keyword::END)?;
+
+        let language = if self.parse_keyword(Keyword::LANGUAGE) {
+            Some(self.parse_identifier()?)
+        } else {
+            None
+        };
+
+        self.expect_keyword_is(Keyword::AS)?;
+
+        let body = self.parse_conditional_statements(&[Keyword::END])?;
+
         Ok(Statement::CreateProcedure {
             name,
             or_alter,
             params,
-            body: statements,
+            language,
+            body,
         })
     }
 
     pub fn parse_window_spec(&mut self) -> Result<WindowSpec, ParserError> {
         let window_name = match self.peek_token().token {
             Token::Word(word) if word.keyword == Keyword::NoKeyword => {
-                self.parse_optional_indent()?
+                self.parse_optional_ident()?
             }
             _ => None,
         };
@@ -12536,7 +16638,11 @@ impl<'a> Parser<'a> {
 
     pub fn parse_create_type(&mut self) -> Result<Statement, ParserError> {
         let name = self.parse_object_name(false)?;
-        self.expect_keyword(Keyword::AS)?;
+        self.expect_keyword_is(Keyword::AS)?;
+
+        if self.parse_keyword(Keyword::ENUM) {
+            return self.parse_create_type_enum(name);
+        }
 
         let mut attributes = vec![];
         if !self.consume_token(&Token::LParen) || self.consume_token(&Token::RParen) {
@@ -12547,7 +16653,7 @@ impl<'a> Parser<'a> {
         }
 
         loop {
-            let attr_name = self.parse_identifier(false)?;
+            let attr_name = self.parse_identifier()?;
             let attr_data_type = self.parse_data_type()?;
             let attr_collation = if self.parse_keyword(Keyword::COLLATE) {
                 Some(self.parse_object_name(false)?)
@@ -12574,11 +16680,25 @@ impl<'a> Parser<'a> {
         })
     }
 
+    /// Parse remainder of `CREATE TYPE AS ENUM` statement (see [Statement::CreateType] and [Self::parse_create_type])
+    ///
+    /// See [PostgreSQL](https://www.postgresql.org/docs/current/sql-createtype.html)
+    pub fn parse_create_type_enum(&mut self, name: ObjectName) -> Result<Statement, ParserError> {
+        self.expect_token(&Token::LParen)?;
+        let labels = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
+        self.expect_token(&Token::RParen)?;
+
+        Ok(Statement::CreateType {
+            name,
+            representation: UserDefinedTypeRepresentation::Enum { labels },
+        })
+    }
+
     fn parse_parenthesized_identifiers(&mut self) -> Result<Vec<Ident>, ParserError> {
         self.expect_token(&Token::LParen)?;
-        let partitions = self.parse_comma_separated(|p| p.parse_identifier(false))?;
+        let idents = self.parse_comma_separated0(|p| p.parse_identifier(), Token::RParen)?;
         self.expect_token(&Token::RParen)?;
-        Ok(partitions)
+        Ok(idents)
     }
 
     fn parse_column_position(&mut self) -> Result<Option<MySQLColumnPosition>, ParserError> {
@@ -12586,7 +16706,7 @@ impl<'a> Parser<'a> {
             if self.parse_keyword(Keyword::FIRST) {
                 Ok(Some(MySQLColumnPosition::First))
             } else if self.parse_keyword(Keyword::AFTER) {
-                let ident = self.parse_identifier(false)?;
+                let ident = self.parse_identifier()?;
                 Ok(Some(MySQLColumnPosition::After(ident)))
             } else {
                 Ok(None)
@@ -12596,8 +16716,49 @@ impl<'a> Parser<'a> {
         }
     }
 
+    /// Parse [Statement::Print]
+    fn parse_print(&mut self) -> Result<Statement, ParserError> {
+        Ok(Statement::Print(PrintStatement {
+            message: Box::new(self.parse_expr()?),
+        }))
+    }
+
+    /// Parse [Statement::Return]
+    fn parse_return(&mut self) -> Result<Statement, ParserError> {
+        match self.maybe_parse(|p| p.parse_expr())? {
+            Some(expr) => Ok(Statement::Return(ReturnStatement {
+                value: Some(ReturnStatementValue::Expr(expr)),
+            })),
+            None => Ok(Statement::Return(ReturnStatement { value: None })),
+        }
+    }
+
+    /// /// Parse a `EXPORT DATA` statement.
+    ///
+    /// See [Statement::ExportData]
+    fn parse_export_data(&mut self) -> Result<Statement, ParserError> {
+        self.expect_keywords(&[Keyword::EXPORT, Keyword::DATA])?;
+
+        let connection = if self.parse_keywords(&[Keyword::WITH, Keyword::CONNECTION]) {
+            Some(self.parse_object_name(false)?)
+        } else {
+            None
+        };
+        self.expect_keyword(Keyword::OPTIONS)?;
+        self.expect_token(&Token::LParen)?;
+        let options = self.parse_comma_separated(|p| p.parse_sql_option())?;
+        self.expect_token(&Token::RParen)?;
+        self.expect_keyword(Keyword::AS)?;
+        let query = self.parse_query()?;
+        Ok(Statement::ExportData(ExportData {
+            options,
+            query,
+            connection,
+        }))
+    }
+
     /// Consume the parser and return its underlying token buffer
-    pub fn into_tokens(self) -> Vec<TokenWithLocation> {
+    pub fn into_tokens(self) -> Vec<TokenWithSpan> {
         self.tokens
     }
 
@@ -12613,7 +16774,7 @@ impl<'a> Parser<'a> {
         false
     }
 
-    fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
+    pub(crate) fn parse_show_stmt_options(&mut self) -> Result<ShowStatementOptions, ParserError> {
         let show_in;
         let mut filter_position = None;
         if self.dialect.supports_show_like_before_in() {
@@ -12694,7 +16855,9 @@ impl<'a> Parser<'a> {
                     .parse_one_of_keywords(&[Keyword::FROM, Keyword::IN])
                     .is_some()
                 {
-                    parent_name.0.insert(0, self.parse_identifier(false)?);
+                    parent_name
+                        .0
+                        .insert(0, ObjectNamePart::Identifier(self.parse_identifier()?));
                 }
                 (None, Some(parent_name))
             }
@@ -12709,7 +16872,7 @@ impl<'a> Parser<'a> {
 
     fn maybe_parse_show_stmt_starts_with(&mut self) -> Result<Option<Value>, ParserError> {
         if self.parse_keywords(&[Keyword::STARTS, Keyword::WITH]) {
-            Ok(Some(self.parse_value()?))
+            Ok(Some(self.parse_value()?.value))
         } else {
             Ok(None)
         }
@@ -12725,18 +16888,116 @@ impl<'a> Parser<'a> {
 
     fn maybe_parse_show_stmt_from(&mut self) -> Result<Option<Value>, ParserError> {
         if self.parse_keyword(Keyword::FROM) {
-            Ok(Some(self.parse_value()?))
+            Ok(Some(self.parse_value()?.value))
         } else {
             Ok(None)
         }
     }
+
+    pub(crate) fn in_column_definition_state(&self) -> bool {
+        matches!(self.state, ColumnDefinition)
+    }
+
+    /// Parses options provided in key-value format.
+    ///
+    /// * `parenthesized` - true if the options are enclosed in parenthesis
+    /// * `end_words` - a list of keywords that any of them indicates the end of the options section
+    pub(crate) fn parse_key_value_options(
+        &mut self,
+        parenthesized: bool,
+        end_words: &[Keyword],
+    ) -> Result<Vec<KeyValueOption>, ParserError> {
+        let mut options: Vec<KeyValueOption> = Vec::new();
+        if parenthesized {
+            self.expect_token(&Token::LParen)?;
+        }
+        loop {
+            match self.next_token().token {
+                Token::RParen => {
+                    if parenthesized {
+                        break;
+                    } else {
+                        return self.expected(" another option or EOF", self.peek_token());
+                    }
+                }
+                Token::EOF => break,
+                Token::Comma => continue,
+                Token::Word(w) if !end_words.contains(&w.keyword) => {
+                    options.push(self.parse_key_value_option(w)?)
+                }
+                Token::Word(w) if end_words.contains(&w.keyword) => {
+                    self.prev_token();
+                    break;
+                }
+                _ => return self.expected("another option, EOF, Comma or ')'", self.peek_token()),
+            };
+        }
+        Ok(options)
+    }
+
+    /// Parses a `KEY = VALUE` construct based on the specified key
+    pub(crate) fn parse_key_value_option(
+        &mut self,
+        key: Word,
+    ) -> Result<KeyValueOption, ParserError> {
+        self.expect_token(&Token::Eq)?;
+        match self.next_token().token {
+            Token::SingleQuotedString(value) => Ok(KeyValueOption {
+                option_name: key.value,
+                option_type: KeyValueOptionType::STRING,
+                value,
+            }),
+            Token::Word(word)
+                if word.keyword == Keyword::TRUE || word.keyword == Keyword::FALSE =>
+            {
+                Ok(KeyValueOption {
+                    option_name: key.value,
+                    option_type: KeyValueOptionType::BOOLEAN,
+                    value: word.value.to_uppercase(),
+                })
+            }
+            Token::Word(word) => Ok(KeyValueOption {
+                option_name: key.value,
+                option_type: KeyValueOptionType::ENUM,
+                value: word.value,
+            }),
+            Token::Number(n, _) => Ok(KeyValueOption {
+                option_name: key.value,
+                option_type: KeyValueOptionType::NUMBER,
+                value: n,
+            }),
+            _ => self.expected("expected option value", self.peek_token()),
+        }
+    }
+}
+
+fn maybe_prefixed_expr(expr: Expr, prefix: Option<Ident>) -> Expr {
+    if let Some(prefix) = prefix {
+        Expr::Prefixed {
+            prefix,
+            value: Box::new(expr),
+        }
+    } else {
+        expr
+    }
 }
 
 impl Word {
-    pub fn to_ident(&self) -> Ident {
+    #[deprecated(since = "0.54.0", note = "please use `into_ident` instead")]
+    pub fn to_ident(&self, span: Span) -> Ident {
         Ident {
             value: self.value.clone(),
             quote_style: self.quote_style,
+            span,
+        }
+    }
+
+    /// Convert this word into an [`Ident`] identifier
+    pub fn into_ident(self, span: Span) -> Ident {
+        Ident {
+            value: self.value,
+            quote_style: self.quote_style,
+            span,
         }
     }
 }
@@ -12999,14 +17260,14 @@ mod tests {
             test_parse_data_type!(
                 dialect,
                 "GEOMETRY",
-                DataType::Custom(ObjectName(vec!["GEOMETRY".into()]), vec![])
+                DataType::Custom(ObjectName::from(vec!["GEOMETRY".into()]), vec![])
             );
 
             test_parse_data_type!(
                 dialect,
                 "GEOMETRY(POINT)",
                 DataType::Custom(
-                    ObjectName(vec!["GEOMETRY".into()]),
+                    ObjectName::from(vec!["GEOMETRY".into()]),
                     vec!["POINT".to_string()]
                 )
             );
@@ -13015,7 +17276,7 @@ mod tests {
                 dialect,
                 "GEOMETRY(POINT, 4326)",
                 DataType::Custom(
-                    ObjectName(vec!["GEOMETRY".into()]),
+                    ObjectName::from(vec!["GEOMETRY".into()]),
                     vec!["POINT".to_string(), "4326".to_string()]
                 )
             );
@@ -13151,7 +17412,7 @@ mod tests {
             }};
         }
 
-        let dummy_name = ObjectName(vec![Ident::new("dummy_name")]);
+        let dummy_name = ObjectName::from(vec![Ident::new("dummy_name")]);
         let dummy_authorization = Ident::new("dummy_authorization");
 
         test_parse_schema_name!(
@@ -13183,6 +17444,20 @@ mod tests {
             }};
         }
 
+        fn mk_expected_col(name: &str) -> IndexColumn {
+            IndexColumn {
+                column: OrderByExpr {
+                    expr: Expr::Identifier(name.into()),
+                    options: OrderByOptions {
+                        asc: None,
+                        nulls_first: None,
+                    },
+                    with_fill: None,
+                },
+                operator_class: None,
+            }
+        }
+
         let dialect =
             TestedDialects::new(vec![Box::new(GenericDialect {}), Box::new(MySqlDialect {})]);
 
@@ -13193,7 +17468,7 @@ mod tests {
                 display_as_key: false,
                 name: None,
                 index_type: None,
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
 
@@ -13204,7 +17479,7 @@ mod tests {
                 display_as_key: true,
                 name: None,
                 index_type: None,
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
 
@@ -13215,7 +17490,7 @@ mod tests {
                 display_as_key: false,
                 name: Some(Ident::with_quote('\'', "index")),
                 index_type: None,
-                columns: vec![Ident::new("c1"), Ident::new("c2")],
+                columns: vec![mk_expected_col("c1"), mk_expected_col("c2")],
             }
         );
 
@@ -13226,7 +17501,7 @@ mod tests {
                 display_as_key: false,
                 name: None,
                 index_type: Some(IndexType::BTree),
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
 
@@ -13237,7 +17512,7 @@ mod tests {
                 display_as_key: false,
                 name: None,
                 index_type: Some(IndexType::Hash),
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
 
@@ -13248,7 +17523,7 @@ mod tests {
                 display_as_key: false,
                 name: Some(Ident::new("idx_name")),
                 index_type: Some(IndexType::BTree),
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
 
@@ -13259,7 +17534,7 @@ mod tests {
                 display_as_key: false,
                 name: Some(Ident::new("idx_name")),
                 index_type: Some(IndexType::Hash),
-                columns: vec![Ident::new("c1")],
+                columns: vec![mk_expected_col("c1")],
             }
         );
     }
@@ -13283,7 +17558,7 @@ mod tests {
         assert_eq!(
             ast,
             Err(ParserError::ParserError(
-                "Expected: [NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS, found: a at Line: 1, Column: 16"
+                "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: a at Line: 1, Column: 16"
                     .to_string()
             ))
         );
@@ -13310,14 +17585,17 @@ mod tests {
             Ident {
                 value: "CATALOG".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
             Ident {
                 value: "F(o)o. \"bar".to_string(),
                 quote_style: Some('"'),
+                span: Span::empty(),
             },
             Ident {
                 value: "table".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
         ];
         dialect.run_parser_method(r#"CATALOG."F(o)o. ""bar".table"#, |parser| {
@@ -13330,10 +17608,12 @@ mod tests {
             Ident {
                 value: "CATALOG".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
             Ident {
                 value: "table".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
         ];
         dialect.run_parser_method("CATALOG . table", |parser| {
@@ -13411,16 +17691,6 @@ mod tests {
         assert!(Parser::parse_sql(&GenericDialect {}, sql).is_err());
     }
 
-    #[test]
-    fn test_replace_into_set() {
-        // NOTE: This is actually valid MySQL syntax, REPLACE and INSERT,
-        // but the parser does not yet support it.
-        // https://dev.mysql.com/doc/refman/8.3/en/insert.html
-        let sql = "REPLACE INTO t SET a='1'";
-
-        assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
-    }
-
     #[test]
     fn test_replace_into_set_placeholder() {
         let sql = "REPLACE INTO t SET ?";
@@ -13434,4 +17704,36 @@ mod tests {
 
         assert!(Parser::parse_sql(&MySqlDialect {}, sql).is_err());
     }
+
+    #[test]
+    fn test_parse_not_null_in_column_options() {
+        let canonical = concat!(
+            "CREATE TABLE foo (",
+            "abc INT DEFAULT (42 IS NOT NULL) NOT NULL,",
+            " def INT,",
+            " def_null BOOL GENERATED ALWAYS AS (def IS NOT NULL) STORED,",
+            " CHECK (abc IS NOT NULL)",
+            ")"
+        );
+        all_dialects().verified_stmt(canonical);
+        all_dialects().one_statement_parses_to(
+            concat!(
+                "CREATE TABLE foo (",
+                "abc INT DEFAULT (42 NOT NULL) NOT NULL,",
+                " def INT,",
+                " def_null BOOL GENERATED ALWAYS AS (def NOT NULL) STORED,",
+                " CHECK (abc NOT NULL)",
+                ")"
+            ),
+            canonical,
+        );
+    }
+
+    #[test]
+    fn test_placeholder_invalid_whitespace() {
+        for w in ["  ", "/*invalid*/"] {
+            let sql = format!("\nSELECT\n  :{w}fooBar");
+            assert!(Parser::parse_sql(&GenericDialect, &sql).is_err());
+        }
+    }
 }
diff --git a/src/test_utils.rs b/src/test_utils.rs
index b35fc45c2..654f2723e 100644
--- a/src/test_utils.rs
+++ b/src/test_utils.rs
@@ -33,7 +33,7 @@ use core::fmt::Debug;
 
 use crate::dialect::*;
 use crate::parser::{Parser, ParserError};
-use crate::tokenizer::Tokenizer;
+use crate::tokenizer::{Token, Tokenizer};
 use crate::{ast::*, parser::ParserOptions};
 
 #[cfg(test)]
@@ -151,10 +151,11 @@ impl TestedDialects {
     ///
     /// 2. re-serializing the result of parsing `sql` produces the same
     ///    `canonical` sql string
+    ///
+    ///  For multiple statements, use [`statements_parse_to`].
     pub fn one_statement_parses_to(&self, sql: &str, canonical: &str) -> Statement {
         let mut statements = self.parse_sql_statements(sql).expect(sql);
         assert_eq!(statements.len(), 1);
-
         if !canonical.is_empty() && sql != canonical {
             assert_eq!(self.parse_sql_statements(canonical).unwrap(), statements);
         }
@@ -167,6 +168,24 @@ impl TestedDialects {
         only_statement
     }
 
+    /// The same as [`one_statement_parses_to`] but it works for a multiple statements
+    pub fn statements_parse_to(&self, sql: &str, canonical: &str) -> Vec<Statement> {
+        let statements = self.parse_sql_statements(sql).expect(sql);
+        if !canonical.is_empty() && sql != canonical {
+            assert_eq!(self.parse_sql_statements(canonical).unwrap(), statements);
+        } else {
+            assert_eq!(
+                sql,
+                statements
+                    .iter()
+                    .map(|s| s.to_string())
+                    .collect::<Vec<_>>()
+                    .join("; ")
+            );
+        }
+        statements
+    }
+
     /// Ensures that `sql` parses as an [`Expr`], and that
     /// re-serializing the parse result produces canonical
     pub fn expr_parses_to(&self, sql: &str, canonical: &str) -> Expr {
@@ -238,6 +257,22 @@ impl TestedDialects {
     pub fn verified_expr(&self, sql: &str) -> Expr {
         self.expr_parses_to(sql, sql)
     }
+
+    /// Check that the tokenizer returns the expected tokens for the given SQL.
+    pub fn tokenizes_to(&self, sql: &str, expected: Vec<Token>) {
+        if self.dialects.is_empty() {
+            panic!("No dialects to test");
+        }
+
+        self.dialects.iter().for_each(|dialect| {
+            let mut tokenizer = Tokenizer::new(&**dialect, sql);
+            if let Some(options) = &self.options {
+                tokenizer = tokenizer.with_unescape(options.unescape);
+            }
+            let tokens = tokenizer.tokenize().unwrap();
+            assert_eq!(expected, tokens, "Tokenized differently for {dialect:?}");
+        });
+    }
 }
 
 /// Returns all available dialects.
@@ -259,6 +294,11 @@ pub fn all_dialects() -> TestedDialects {
     ])
 }
 
+// Returns all available dialects with the specified parser options
+pub fn all_dialects_with_options(options: ParserOptions) -> TestedDialects {
+    TestedDialects::new_with_options(all_dialects().dialects, options)
+}
+
 /// Returns all dialects matching the given predicate.
 pub fn all_dialects_where<F>(predicate: F) -> TestedDialects
 where
@@ -310,10 +350,12 @@ pub fn alter_table_op_with_name(stmt: Statement, expected_name: &str) -> AlterTa
             operations,
             on_cluster: _,
             location: _,
+            iceberg,
         } => {
             assert_eq!(name.to_string(), expected_name);
             assert!(!if_exists);
             assert!(!is_only);
+            assert!(!iceberg);
             only(operations)
         }
         _ => panic!("Expected ALTER TABLE statement"),
@@ -329,6 +371,11 @@ pub fn number(n: &str) -> Value {
     Value::Number(n.parse().unwrap(), false)
 }
 
+/// Creates a [Value::SingleQuotedString]
+pub fn single_quoted_string(s: impl Into<String>) -> Value {
+    Value::SingleQuotedString(s.into())
+}
+
 pub fn table_alias(name: impl Into<String>) -> Option<TableAlias> {
     Some(TableAlias {
         name: Ident::new(name),
@@ -338,19 +385,37 @@ pub fn table_alias(name: impl Into<String>) -> Option<TableAlias> {
 
 pub fn table(name: impl Into<String>) -> TableFactor {
     TableFactor::Table {
-        name: ObjectName(vec![Ident::new(name.into())]),
+        name: ObjectName::from(vec![Ident::new(name.into())]),
+        alias: None,
+        args: None,
+        with_hints: vec![],
+        version: None,
+        partitions: vec![],
+        with_ordinality: false,
+        json_path: None,
+        sample: None,
+        index_hints: vec![],
+    }
+}
+
+pub fn table_from_name(name: ObjectName) -> TableFactor {
+    TableFactor::Table {
+        name,
         alias: None,
         args: None,
         with_hints: vec![],
         version: None,
         partitions: vec![],
         with_ordinality: false,
+        json_path: None,
+        sample: None,
+        index_hints: vec![],
     }
 }
 
 pub fn table_with_alias(name: impl Into<String>, alias: impl Into<String>) -> TableFactor {
     TableFactor::Table {
-        name: ObjectName(vec![Ident::new(name)]),
+        name: ObjectName::from(vec![Ident::new(name)]),
         alias: Some(TableAlias {
             name: Ident::new(alias),
             columns: vec![],
@@ -360,6 +425,9 @@ pub fn table_with_alias(name: impl Into<String>, alias: impl Into<String>) -> Ta
         version: None,
         partitions: vec![],
         with_ordinality: false,
+        json_path: None,
+        sample: None,
+        index_hints: vec![],
     }
 }
 
@@ -367,13 +435,14 @@ pub fn join(relation: TableFactor) -> Join {
     Join {
         relation,
         global: false,
-        join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+        join_operator: JoinOperator::Join(JoinConstraint::Natural),
     }
 }
 
 pub fn call(function: &str, args: impl IntoIterator<Item = Expr>) -> Expr {
     Expr::Function(Function {
-        name: ObjectName(vec![Ident::new(function)]),
+        name: ObjectName::from(vec![Ident::new(function)]),
+        uses_odbc_syntax: false,
         parameters: FunctionArguments::None,
         args: FunctionArguments::List(FunctionArgumentList {
             duplicate_treatment: None,
@@ -389,3 +458,52 @@ pub fn call(function: &str, args: impl IntoIterator<Item = Expr>) -> Expr {
         within_group: vec![],
     })
 }
+
+/// Gets the first index column (mysql calls it a key part) of the first index found in a
+/// [`Statement::CreateIndex`], [`Statement::CreateTable`], or [`Statement::AlterTable`].
+pub fn index_column(stmt: Statement) -> Expr {
+    match stmt {
+        Statement::CreateIndex(CreateIndex { columns, .. }) => {
+            columns.first().unwrap().column.expr.clone()
+        }
+        Statement::CreateTable(CreateTable { constraints, .. }) => {
+            match constraints.first().unwrap() {
+                TableConstraint::Index { columns, .. } => {
+                    columns.first().unwrap().column.expr.clone()
+                }
+                TableConstraint::Unique { columns, .. } => {
+                    columns.first().unwrap().column.expr.clone()
+                }
+                TableConstraint::PrimaryKey { columns, .. } => {
+                    columns.first().unwrap().column.expr.clone()
+                }
+                TableConstraint::FulltextOrSpatial { columns, .. } => {
+                    columns.first().unwrap().column.expr.clone()
+                }
+                _ => panic!("Expected an index, unique, primary, full text, or spatial constraint (foreign key does not support general key part expressions)"),
+            }
+        }
+        Statement::AlterTable { operations, .. } => match operations.first().unwrap() {
+            AlterTableOperation::AddConstraint { constraint, .. } => {
+                match constraint {
+                    TableConstraint::Index { columns, .. } => {
+                        columns.first().unwrap().column.expr.clone()
+                    }
+                    TableConstraint::Unique { columns, .. } => {
+                        columns.first().unwrap().column.expr.clone()
+                    }
+                    TableConstraint::PrimaryKey { columns, .. } => {
+                        columns.first().unwrap().column.expr.clone()
+                    }
+                    TableConstraint::FulltextOrSpatial {
+                        columns,
+                        ..
+                    } => columns.first().unwrap().column.expr.clone(),
+                    _ => panic!("Expected an index, unique, primary, full text, or spatial constraint (foreign key does not support general key part expressions)"),
+                }
+            }
+            _ => panic!("Expected a constraint"),
+        },
+        _ => panic!("Expected CREATE INDEX, ALTER TABLE, or CREATE TABLE, got: {stmt:?}"),
+    }
+}
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index 05aaf1e28..8382a5344 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -29,10 +29,10 @@ use alloc::{
     vec,
     vec::Vec,
 };
-use core::fmt;
 use core::iter::Peekable;
 use core::num::NonZeroU8;
 use core::str::Chars;
+use core::{cmp, fmt};
 
 #[cfg(feature = "serde")]
 use serde::{Deserialize, Serialize};
@@ -40,13 +40,13 @@ use serde::{Deserialize, Serialize};
 #[cfg(feature = "visitor")]
 use sqlparser_derive::{Visit, VisitMut};
 
-use crate::ast::DollarQuotedString;
 use crate::dialect::Dialect;
 use crate::dialect::{
     BigQueryDialect, DuckDbDialect, GenericDialect, MySqlDialect, PostgreSqlDialect,
     SnowflakeDialect,
 };
 use crate::keywords::{Keyword, ALL_KEYWORDS, ALL_KEYWORDS_INDEX};
+use crate::{ast::DollarQuotedString, dialect::HiveDialect};
 
 /// SQL Token enumeration
 #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -170,8 +170,10 @@ pub enum Token {
     RBrace,
     /// Right Arrow `=>`
     RArrow,
-    /// Sharp `#` used for PostgreSQL Bitwise XOR operator
+    /// Sharp `#` used for PostgreSQL Bitwise XOR operator, also PostgreSQL/Redshift geometrical unary/binary operator (Number of points in path or polygon/Intersection)
     Sharp,
+    /// `##` PostgreSQL/Redshift geometrical binary operator (Point of closest proximity)
+    DoubleSharp,
     /// Tilde `~` used for PostgreSQL Bitwise NOT operator or case sensitive match regular expression operator
     Tilde,
     /// `~*` , a case insensitive match regular expression operator in PostgreSQL
@@ -198,7 +200,7 @@ pub enum Token {
     ExclamationMark,
     /// Double Exclamation Mark `!!` used for PostgreSQL prefix factorial operator
     DoubleExclamationMark,
-    /// AtSign `@` used for PostgreSQL abs operator
+    /// AtSign `@` used for PostgreSQL abs operator, also PostgreSQL/Redshift geometrical unary/binary operator (Center, Contained or on)
     AtSign,
     /// `^@`, a "starts with" string operator in PostgreSQL
     CaretAt,
@@ -214,6 +216,38 @@ pub enum Token {
     LongArrow,
     /// `#>`, extracts JSON sub-object at the specified path
     HashArrow,
+    /// `@-@` PostgreSQL/Redshift geometrical unary operator (Length or circumference)
+    AtDashAt,
+    /// `?-` PostgreSQL/Redshift geometrical unary/binary operator (Is horizontal?/Are horizontally aligned?)
+    QuestionMarkDash,
+    /// `&<` PostgreSQL/Redshift geometrical binary operator (Overlaps to left?)
+    AmpersandLeftAngleBracket,
+    /// `&>` PostgreSQL/Redshift geometrical binary operator (Overlaps to right?)`
+    AmpersandRightAngleBracket,
+    /// `&<|` PostgreSQL/Redshift geometrical binary operator (Does not extend above?)`
+    AmpersandLeftAngleBracketVerticalBar,
+    /// `|&>` PostgreSQL/Redshift geometrical binary operator (Does not extend below?)`
+    VerticalBarAmpersandRightAngleBracket,
+    /// `<->` PostgreSQL/Redshift geometrical binary operator (Distance between)
+    TwoWayArrow,
+    /// `<^` PostgreSQL/Redshift geometrical binary operator (Is below?)
+    LeftAngleBracketCaret,
+    /// `>^` PostgreSQL/Redshift geometrical binary operator (Is above?)
+    RightAngleBracketCaret,
+    /// `?#` PostgreSQL/Redshift geometrical binary operator (Intersects or overlaps)
+    QuestionMarkSharp,
+    /// `?-|` PostgreSQL/Redshift geometrical binary operator (Is perpendicular?)
+    QuestionMarkDashVerticalBar,
+    /// `?||` PostgreSQL/Redshift geometrical binary operator (Are parallel?)
+    QuestionMarkDoubleVerticalBar,
+    /// `~=` PostgreSQL/Redshift geometrical binary operator (Same as)
+    TildeEqual,
+    /// `<<| PostgreSQL/Redshift geometrical binary operator (Is strictly below?)
+    ShiftLeftVerticalBar,
+    /// `|>> PostgreSQL/Redshift geometrical binary operator (Is strictly above?)
+    VerticalBarShiftRight,
+    /// `|> BigQuery pipe operator
+    VerticalBarRightAngleBracket,
     /// `#>>`, extracts JSON sub-object at the specified path as text
     HashLongArrow,
     /// jsonb @> jsonb -> boolean: Test whether left json contains the right json
@@ -303,6 +337,7 @@ impl fmt::Display for Token {
             Token::RBrace => f.write_str("}"),
             Token::RArrow => f.write_str("=>"),
             Token::Sharp => f.write_str("#"),
+            Token::DoubleSharp => f.write_str("##"),
             Token::ExclamationMark => f.write_str("!"),
             Token::DoubleExclamationMark => f.write_str("!!"),
             Token::Tilde => f.write_str("~"),
@@ -320,6 +355,22 @@ impl fmt::Display for Token {
             Token::Overlap => f.write_str("&&"),
             Token::PGSquareRoot => f.write_str("|/"),
             Token::PGCubeRoot => f.write_str("||/"),
+            Token::AtDashAt => f.write_str("@-@"),
+            Token::QuestionMarkDash => f.write_str("?-"),
+            Token::AmpersandLeftAngleBracket => f.write_str("&<"),
+            Token::AmpersandRightAngleBracket => f.write_str("&>"),
+            Token::AmpersandLeftAngleBracketVerticalBar => f.write_str("&<|"),
+            Token::VerticalBarAmpersandRightAngleBracket => f.write_str("|&>"),
+            Token::VerticalBarRightAngleBracket => f.write_str("|>"),
+            Token::TwoWayArrow => f.write_str("<->"),
+            Token::LeftAngleBracketCaret => f.write_str("<^"),
+            Token::RightAngleBracketCaret => f.write_str(">^"),
+            Token::QuestionMarkSharp => f.write_str("?#"),
+            Token::QuestionMarkDashVerticalBar => f.write_str("?-|"),
+            Token::QuestionMarkDoubleVerticalBar => f.write_str("?||"),
+            Token::TildeEqual => f.write_str("~="),
+            Token::ShiftLeftVerticalBar => f.write_str("<<|"),
+            Token::VerticalBarShiftRight => f.write_str("|>>"),
             Token::Placeholder(ref s) => write!(f, "{s}"),
             Token::Arrow => write!(f, "->"),
             Token::LongArrow => write!(f, "->>"),
@@ -422,61 +473,253 @@ impl fmt::Display for Whitespace {
 }
 
 /// Location in input string
-#[derive(Debug, Eq, PartialEq, Clone, Copy)]
+///
+/// # Create an "empty" (unknown) `Location`
+/// ```
+/// # use sqlparser::tokenizer::Location;
+/// let location = Location::empty();
+/// ```
+///
+/// # Create a `Location` from a line and column
+/// ```
+/// # use sqlparser::tokenizer::Location;
+/// let location = Location::new(1, 1);
+/// ```
+///
+/// # Create a `Location` from a pair
+/// ```
+/// # use sqlparser::tokenizer::Location;
+/// let location = Location::from((1, 1));
+/// ```
+#[derive(Eq, PartialEq, Hash, Clone, Copy, Ord, PartialOrd)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
 pub struct Location {
-    /// Line number, starting from 1
+    /// Line number, starting from 1.
+    ///
+    /// Note: Line 0 is used for empty spans
     pub line: u64,
-    /// Line column, starting from 1
+    /// Line column, starting from 1.
+    ///
+    /// Note: Column 0 is used for empty spans
     pub column: u64,
 }
 
 impl fmt::Display for Location {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         if self.line == 0 {
             return Ok(());
         }
-        write!(
-            f,
-            // TODO: use standard compiler location syntax (<path>:<line>:<col>)
-            " at Line: {}, Column: {}",
-            self.line, self.column,
-        )
+        write!(f, " at Line: {}, Column: {}", self.line, self.column)
     }
 }
 
-/// A [Token] with [Location] attached to it
-#[derive(Debug, Eq, PartialEq, Clone)]
-pub struct TokenWithLocation {
-    pub token: Token,
-    pub location: Location,
+impl fmt::Debug for Location {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Location({},{})", self.line, self.column)
+    }
+}
+
+impl Location {
+    /// Return an "empty" / unknown location
+    pub fn empty() -> Self {
+        Self { line: 0, column: 0 }
+    }
+
+    /// Create a new `Location` for a given line and column
+    pub fn new(line: u64, column: u64) -> Self {
+        Self { line, column }
+    }
+
+    /// Create a new location for a given line and column
+    ///
+    /// Alias for [`Self::new`]
+    // TODO: remove / deprecate in favor of` `new` for consistency?
+    pub fn of(line: u64, column: u64) -> Self {
+        Self::new(line, column)
+    }
+
+    /// Combine self and `end` into a new `Span`
+    pub fn span_to(self, end: Self) -> Span {
+        Span { start: self, end }
+    }
+}
+
+impl From<(u64, u64)> for Location {
+    fn from((line, column): (u64, u64)) -> Self {
+        Self { line, column }
+    }
+}
+
+/// A span represents a linear portion of the input string (start, end)
+///
+/// See [Spanned](crate::ast::Spanned) for more information.
+#[derive(Eq, PartialEq, Hash, Clone, PartialOrd, Ord, Copy)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct Span {
+    pub start: Location,
+    pub end: Location,
 }
 
-impl TokenWithLocation {
-    pub fn new(token: Token, line: u64, column: u64) -> TokenWithLocation {
-        TokenWithLocation {
-            token,
-            location: Location { line, column },
+impl fmt::Debug for Span {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "Span({:?}..{:?})", self.start, self.end)
+    }
+}
+
+impl Span {
+    // An empty span (0, 0) -> (0, 0)
+    // We need a const instance for pattern matching
+    const EMPTY: Span = Self::empty();
+
+    /// Create a new span from a start and end [`Location`]
+    pub fn new(start: Location, end: Location) -> Span {
+        Span { start, end }
+    }
+
+    /// Returns an empty span `(0, 0) -> (0, 0)`
+    ///
+    /// Empty spans represent no knowledge of source location
+    /// See [Spanned](crate::ast::Spanned) for more information.
+    pub const fn empty() -> Span {
+        Span {
+            start: Location { line: 0, column: 0 },
+            end: Location { line: 0, column: 0 },
+        }
+    }
+
+    /// Returns the smallest Span that contains both `self` and `other`
+    /// If either span is [Span::empty], the other span is returned
+    ///
+    /// # Examples
+    /// ```
+    /// # use sqlparser::tokenizer::{Span, Location};
+    /// // line 1, column1 -> line 2, column 5
+    /// let span1 = Span::new(Location::new(1, 1), Location::new(2, 5));
+    /// // line 2, column 3 -> line 3, column 7
+    /// let span2 = Span::new(Location::new(2, 3), Location::new(3, 7));
+    /// // Union of the two is the min/max of the two spans
+    /// // line 1, column 1 -> line 3, column 7
+    /// let union = span1.union(&span2);
+    /// assert_eq!(union, Span::new(Location::new(1, 1), Location::new(3, 7)));
+    /// ```
+    pub fn union(&self, other: &Span) -> Span {
+        // If either span is empty, return the other
+        // this prevents propagating (0, 0) through the tree
+        match (self, other) {
+            (&Span::EMPTY, _) => *other,
+            (_, &Span::EMPTY) => *self,
+            _ => Span {
+                start: cmp::min(self.start, other.start),
+                end: cmp::max(self.end, other.end),
+            },
         }
     }
 
-    pub fn wrap(token: Token) -> TokenWithLocation {
-        TokenWithLocation::new(token, 0, 0)
+    /// Same as [Span::union] for `Option<Span>`
+    ///
+    /// If `other` is `None`, `self` is returned
+    pub fn union_opt(&self, other: &Option<Span>) -> Span {
+        match other {
+            Some(other) => self.union(other),
+            None => *self,
+        }
+    }
+
+    /// Return the [Span::union] of all spans in the iterator
+    ///
+    /// If the iterator is empty, an empty span is returned
+    ///
+    /// # Example
+    /// ```
+    /// # use sqlparser::tokenizer::{Span, Location};
+    /// let spans = vec![
+    ///     Span::new(Location::new(1, 1), Location::new(2, 5)),
+    ///     Span::new(Location::new(2, 3), Location::new(3, 7)),
+    ///     Span::new(Location::new(3, 1), Location::new(4, 2)),
+    /// ];
+    /// // line 1, column 1 -> line 4, column 2
+    /// assert_eq!(
+    ///   Span::union_iter(spans),
+    ///   Span::new(Location::new(1, 1), Location::new(4, 2))
+    /// );
+    pub fn union_iter<I: IntoIterator<Item = Span>>(iter: I) -> Span {
+        iter.into_iter()
+            .reduce(|acc, item| acc.union(&item))
+            .unwrap_or(Span::empty())
+    }
+}
+
+/// Backwards compatibility struct for [`TokenWithSpan`]
+#[deprecated(since = "0.53.0", note = "please use `TokenWithSpan` instead")]
+pub type TokenWithLocation = TokenWithSpan;
+
+/// A [Token] with [Span] attached to it
+///
+/// This is used to track the location of a token in the input string
+///
+/// # Examples
+/// ```
+/// # use sqlparser::tokenizer::{Location, Span, Token, TokenWithSpan};
+/// // commas @ line 1, column 10
+/// let tok1 = TokenWithSpan::new(
+///   Token::Comma,
+///   Span::new(Location::new(1, 10), Location::new(1, 11)),
+/// );
+/// assert_eq!(tok1, Token::Comma); // can compare the token
+///
+/// // commas @ line 2, column 20
+/// let tok2 = TokenWithSpan::new(
+///   Token::Comma,
+///   Span::new(Location::new(2, 20), Location::new(2, 21)),
+/// );
+/// // same token but different locations are not equal
+/// assert_ne!(tok1, tok2);
+/// ```
+#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)]
+#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
+#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
+pub struct TokenWithSpan {
+    pub token: Token,
+    pub span: Span,
+}
+
+impl TokenWithSpan {
+    /// Create a new [`TokenWithSpan`] from a [`Token`] and a [`Span`]
+    pub fn new(token: Token, span: Span) -> Self {
+        Self { token, span }
+    }
+
+    /// Wrap a token with an empty span
+    pub fn wrap(token: Token) -> Self {
+        Self::new(token, Span::empty())
+    }
+
+    /// Wrap a token with a location from `start` to `end`
+    pub fn at(token: Token, start: Location, end: Location) -> Self {
+        Self::new(token, Span::new(start, end))
+    }
+
+    /// Return an EOF token with no location
+    pub fn new_eof() -> Self {
+        Self::wrap(Token::EOF)
     }
 }
 
-impl PartialEq<Token> for TokenWithLocation {
+impl PartialEq<Token> for TokenWithSpan {
     fn eq(&self, other: &Token) -> bool {
         &self.token == other
     }
 }
 
-impl PartialEq<TokenWithLocation> for Token {
-    fn eq(&self, other: &TokenWithLocation) -> bool {
+impl PartialEq<TokenWithSpan> for Token {
+    fn eq(&self, other: &TokenWithSpan) -> bool {
         self == &other.token
     }
 }
 
-impl fmt::Display for TokenWithLocation {
+impl fmt::Display for TokenWithSpan {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         self.token.fmt(f)
     }
@@ -504,7 +747,7 @@ struct State<'a> {
     pub col: u64,
 }
 
-impl<'a> State<'a> {
+impl State<'_> {
     /// return the next character and advance the stream
     pub fn next(&mut self) -> Option<char> {
         match self.peekable.next() {
@@ -636,8 +879,8 @@ impl<'a> Tokenizer<'a> {
     }
 
     /// Tokenize the statement and produce a vector of tokens with location information
-    pub fn tokenize_with_location(&mut self) -> Result<Vec<TokenWithLocation>, TokenizerError> {
-        let mut tokens: Vec<TokenWithLocation> = vec![];
+    pub fn tokenize_with_location(&mut self) -> Result<Vec<TokenWithSpan>, TokenizerError> {
+        let mut tokens: Vec<TokenWithSpan> = vec![];
         self.tokenize_with_location_into_buf(&mut tokens)
             .map(|_| tokens)
     }
@@ -646,7 +889,7 @@ impl<'a> Tokenizer<'a> {
     /// If an error is thrown, the buffer will contain all tokens that were successfully parsed before the error.
     pub fn tokenize_with_location_into_buf(
         &mut self,
-        buf: &mut Vec<TokenWithLocation>,
+        buf: &mut Vec<TokenWithSpan>,
     ) -> Result<(), TokenizerError> {
         let mut state = State {
             peekable: self.query.chars().peekable(),
@@ -655,8 +898,10 @@ impl<'a> Tokenizer<'a> {
         };
 
         let mut location = state.location();
-        while let Some(token) = self.next_token(&mut state)? {
-            buf.push(TokenWithLocation { token, location });
+        while let Some(token) = self.next_token(&mut state, buf.last().map(|t| &t.token))? {
+            let span = location.span_to(state.location());
+
+            buf.push(TokenWithSpan { token, span });
 
             location = state.location();
         }
@@ -690,7 +935,11 @@ impl<'a> Tokenizer<'a> {
     }
 
     /// Get the next token or return None
-    fn next_token(&self, chars: &mut State) -> Result<Option<Token>, TokenizerError> {
+    fn next_token(
+        &self,
+        chars: &mut State,
+        prev_token: Option<&Token>,
+    ) -> Result<Option<Token>, TokenizerError> {
         match chars.peek() {
             Some(&ch) => match ch {
                 ' ' => self.consume_and_return(chars, Token::Whitespace(Whitespace::Space)),
@@ -777,7 +1026,10 @@ impl<'a> Tokenizer<'a> {
                     match chars.peek() {
                         Some('\'') => {
                             // N'...' - a <national character string literal>
-                            let s = self.tokenize_single_quoted_string(chars, '\'', true)?;
+                            let backslash_escape =
+                                self.dialect.supports_string_literal_backslash_escape();
+                            let s =
+                                self.tokenize_single_quoted_string(chars, '\'', backslash_escape)?;
                             Ok(Some(Token::NationalStringLiteral(s)))
                         }
                         _ => {
@@ -788,7 +1040,7 @@ impl<'a> Tokenizer<'a> {
                     }
                 }
                 // PostgreSQL accepts "escape" string constants, which are an extension to the SQL standard.
-                x @ 'e' | x @ 'E' => {
+                x @ 'e' | x @ 'E' if self.dialect.supports_string_escape_constant() => {
                     let starting_loc = chars.location();
                     chars.next(); // consume, to check the next char
                     match chars.peek() {
@@ -881,34 +1133,98 @@ impl<'a> Tokenizer<'a> {
                     Ok(Some(Token::DoubleQuotedString(s)))
                 }
                 // delimited (quoted) identifier
+                quote_start if self.dialect.is_delimited_identifier_start(ch) => {
+                    let word = self.tokenize_quoted_identifier(quote_start, chars)?;
+                    Ok(Some(Token::make_word(&word, Some(quote_start))))
+                }
+                // Potentially nested delimited (quoted) identifier
                 quote_start
-                    if self.dialect.is_delimited_identifier_start(ch)
+                    if self
+                        .dialect
+                        .is_nested_delimited_identifier_start(quote_start)
                         && self
                             .dialect
-                            .is_proper_identifier_inside_quotes(chars.peekable.clone()) =>
+                            .peek_nested_delimited_identifier_quotes(chars.peekable.clone())
+                            .is_some() =>
                 {
-                    let error_loc = chars.location();
-                    chars.next(); // consume the opening quote
+                    let Some((quote_start, nested_quote_start)) = self
+                        .dialect
+                        .peek_nested_delimited_identifier_quotes(chars.peekable.clone())
+                    else {
+                        return self.tokenizer_error(
+                            chars.location(),
+                            format!("Expected nested delimiter '{quote_start}' before EOF."),
+                        );
+                    };
+
+                    let Some(nested_quote_start) = nested_quote_start else {
+                        let word = self.tokenize_quoted_identifier(quote_start, chars)?;
+                        return Ok(Some(Token::make_word(&word, Some(quote_start))));
+                    };
+
+                    let mut word = vec![];
                     let quote_end = Word::matching_end_quote(quote_start);
-                    let (s, last_char) = self.parse_quoted_ident(chars, quote_end);
+                    let nested_quote_end = Word::matching_end_quote(nested_quote_start);
+                    let error_loc = chars.location();
 
-                    if last_char == Some(quote_end) {
-                        Ok(Some(Token::make_word(&s, Some(quote_start))))
-                    } else {
-                        self.tokenizer_error(
+                    chars.next(); // skip the first delimiter
+                    peeking_take_while(chars, |ch| ch.is_whitespace());
+                    if chars.peek() != Some(&nested_quote_start) {
+                        return self.tokenizer_error(
+                            error_loc,
+                            format!("Expected nested delimiter '{nested_quote_start}' before EOF."),
+                        );
+                    }
+                    word.push(nested_quote_start.into());
+                    word.push(self.tokenize_quoted_identifier(nested_quote_end, chars)?);
+                    word.push(nested_quote_end.into());
+                    peeking_take_while(chars, |ch| ch.is_whitespace());
+                    if chars.peek() != Some(&quote_end) {
+                        return self.tokenizer_error(
                             error_loc,
                             format!("Expected close delimiter '{quote_end}' before EOF."),
-                        )
+                        );
                     }
+                    chars.next(); // skip close delimiter
+
+                    Ok(Some(Token::make_word(&word.concat(), Some(quote_start))))
                 }
                 // numbers and period
                 '0'..='9' | '.' => {
-                    let mut s = peeking_take_while(chars, |ch| ch.is_ascii_digit());
+                    // special case where if ._ is encountered after a word then that word
+                    // is a table and the _ is the start of the col name.
+                    // if the prev token is not a word, then this is not a valid sql
+                    // word or number.
+                    if ch == '.' && chars.peekable.clone().nth(1) == Some('_') {
+                        if let Some(Token::Word(_)) = prev_token {
+                            chars.next();
+                            return Ok(Some(Token::Period));
+                        }
+
+                        return self.tokenizer_error(
+                            chars.location(),
+                            "Unexpected character '_'".to_string(),
+                        );
+                    }
+
+                    // Some dialects support underscore as number separator
+                    // There can only be one at a time and it must be followed by another digit
+                    let is_number_separator = |ch: char, next_char: Option<char>| {
+                        self.dialect.supports_numeric_literal_underscores()
+                            && ch == '_'
+                            && next_char.is_some_and(|next_ch| next_ch.is_ascii_hexdigit())
+                    };
+
+                    let mut s = peeking_next_take_while(chars, |ch, next_ch| {
+                        ch.is_ascii_digit() || is_number_separator(ch, next_ch)
+                    });
 
                     // match binary literal that starts with 0x
                     if s == "0" && chars.peek() == Some(&'x') {
                         chars.next();
-                        let s2 = peeking_take_while(chars, |ch| ch.is_ascii_hexdigit());
+                        let s2 = peeking_next_take_while(chars, |ch, next_ch| {
+                            ch.is_ascii_hexdigit() || is_number_separator(ch, next_ch)
+                        });
                         return Ok(Some(Token::HexStringLiteral(s2)));
                     }
 
@@ -917,15 +1233,30 @@ impl<'a> Tokenizer<'a> {
                         s.push('.');
                         chars.next();
                     }
-                    s += &peeking_take_while(chars, |ch| ch.is_ascii_digit());
 
-                    // No number -> Token::Period
+                    // If the dialect supports identifiers that start with a numeric prefix
+                    // and we have now consumed a dot, check if the previous token was a Word.
+                    // If so, what follows is definitely not part of a decimal number and
+                    // we should yield the dot as a dedicated token so compound identifiers
+                    // starting with digits can be parsed correctly.
+                    if s == "." && self.dialect.supports_numeric_prefix() {
+                        if let Some(Token::Word(_)) = prev_token {
+                            return Ok(Some(Token::Period));
+                        }
+                    }
+
+                    // Consume fractional digits.
+                    s += &peeking_next_take_while(chars, |ch, next_ch| {
+                        ch.is_ascii_digit() || is_number_separator(ch, next_ch)
+                    });
+
+                    // No fraction -> Token::Period
                     if s == "." {
                         return Ok(Some(Token::Period));
                     }
 
-                    let mut exponent_part = String::new();
                     // Parse exponent as number
+                    let mut exponent_part = String::new();
                     if chars.peek() == Some(&'e') || chars.peek() == Some(&'E') {
                         let mut char_clone = chars.peekable.clone();
                         exponent_part.push(char_clone.next().unwrap());
@@ -954,14 +1285,23 @@ impl<'a> Tokenizer<'a> {
                         }
                     }
 
-                    // mysql dialect supports identifiers that start with a numeric prefix,
-                    // as long as they aren't an exponent number.
-                    if self.dialect.supports_numeric_prefix() && exponent_part.is_empty() {
-                        let word =
-                            peeking_take_while(chars, |ch| self.dialect.is_identifier_part(ch));
-
-                        if !word.is_empty() {
-                            s += word.as_str();
+                    // If the dialect supports identifiers that start with a numeric prefix,
+                    // we need to check if the value is in fact an identifier and must thus
+                    // be tokenized as a word.
+                    if self.dialect.supports_numeric_prefix() {
+                        if exponent_part.is_empty() {
+                            // If it is not a number with an exponent, it may be
+                            // an identifier starting with digits.
+                            let word =
+                                peeking_take_while(chars, |ch| self.dialect.is_identifier_part(ch));
+
+                            if !word.is_empty() {
+                                s += word.as_str();
+                                return Ok(Some(Token::make_word(s.as_str(), None)));
+                            }
+                        } else if prev_token == Some(&Token::Period) {
+                            // If the previous token was a period, thus not belonging to a number,
+                            // the value we have is part of an identifier.
                             return Ok(Some(Token::make_word(s.as_str(), None)));
                         }
                     }
@@ -981,14 +1321,26 @@ impl<'a> Tokenizer<'a> {
                 // operators
                 '-' => {
                     chars.next(); // consume the '-'
+
                     match chars.peek() {
                         Some('-') => {
-                            chars.next(); // consume the second '-', starting a single-line comment
-                            let comment = self.tokenize_single_line_comment(chars);
-                            Ok(Some(Token::Whitespace(Whitespace::SingleLineComment {
-                                prefix: "--".to_owned(),
-                                comment,
-                            })))
+                            let mut is_comment = true;
+                            if self.dialect.requires_single_line_comment_whitespace() {
+                                is_comment = Some(' ') == chars.peekable.clone().nth(1);
+                            }
+
+                            if is_comment {
+                                chars.next(); // consume second '-'
+                                let comment = self.tokenize_single_line_comment(chars);
+                                return Ok(Some(Token::Whitespace(
+                                    Whitespace::SingleLineComment {
+                                        prefix: "--".to_owned(),
+                                        comment,
+                                    },
+                                )));
+                            }
+
+                            self.start_binop(chars, "-", Token::Minus)
                         }
                         Some('>') => {
                             chars.next();
@@ -1048,6 +1400,31 @@ impl<'a> Tokenizer<'a> {
                                 _ => self.start_binop(chars, "||", Token::StringConcat),
                             }
                         }
+                        Some('&') if self.dialect.supports_geometric_types() => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('>') => self.consume_for_binop(
+                                    chars,
+                                    "|&>",
+                                    Token::VerticalBarAmpersandRightAngleBracket,
+                                ),
+                                _ => self.start_binop_opt(chars, "|&", None),
+                            }
+                        }
+                        Some('>') if self.dialect.supports_geometric_types() => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('>') => self.consume_for_binop(
+                                    chars,
+                                    "|>>",
+                                    Token::VerticalBarShiftRight,
+                                ),
+                                _ => self.start_binop_opt(chars, "|>", None),
+                            }
+                        }
+                        Some('>') if self.dialect.supports_pipe_operator() => {
+                            self.consume_for_binop(chars, "|>", Token::VerticalBarRightAngleBracket)
+                        }
                         // Bitshift '|' operator
                         _ => self.start_binop(chars, "|", Token::Pipe),
                     }
@@ -1096,8 +1473,34 @@ impl<'a> Tokenizer<'a> {
                                 _ => self.start_binop(chars, "<=", Token::LtEq),
                             }
                         }
+                        Some('|') if self.dialect.supports_geometric_types() => {
+                            self.consume_for_binop(chars, "<<|", Token::ShiftLeftVerticalBar)
+                        }
                         Some('>') => self.consume_for_binop(chars, "<>", Token::Neq),
+                        Some('<') if self.dialect.supports_geometric_types() => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('|') => self.consume_for_binop(
+                                    chars,
+                                    "<<|",
+                                    Token::ShiftLeftVerticalBar,
+                                ),
+                                _ => self.start_binop(chars, "<<", Token::ShiftLeft),
+                            }
+                        }
                         Some('<') => self.consume_for_binop(chars, "<<", Token::ShiftLeft),
+                        Some('-') if self.dialect.supports_geometric_types() => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('>') => {
+                                    self.consume_for_binop(chars, "<->", Token::TwoWayArrow)
+                                }
+                                _ => self.start_binop_opt(chars, "<-", None),
+                            }
+                        }
+                        Some('^') if self.dialect.supports_geometric_types() => {
+                            self.consume_for_binop(chars, "<^", Token::LeftAngleBracketCaret)
+                        }
                         Some('@') => self.consume_for_binop(chars, "<@", Token::ArrowAt),
                         _ => self.start_binop(chars, "<", Token::Lt),
                     }
@@ -1107,6 +1510,9 @@ impl<'a> Tokenizer<'a> {
                     match chars.peek() {
                         Some('=') => self.consume_for_binop(chars, ">=", Token::GtEq),
                         Some('>') => self.consume_for_binop(chars, ">>", Token::ShiftRight),
+                        Some('^') if self.dialect.supports_geometric_types() => {
+                            self.consume_for_binop(chars, ">^", Token::RightAngleBracketCaret)
+                        }
                         _ => self.start_binop(chars, ">", Token::Gt),
                     }
                 }
@@ -1125,6 +1531,22 @@ impl<'a> Tokenizer<'a> {
                 '&' => {
                     chars.next(); // consume the '&'
                     match chars.peek() {
+                        Some('>') if self.dialect.supports_geometric_types() => {
+                            chars.next();
+                            self.consume_and_return(chars, Token::AmpersandRightAngleBracket)
+                        }
+                        Some('<') if self.dialect.supports_geometric_types() => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('|') => self.consume_and_return(
+                                    chars,
+                                    Token::AmpersandLeftAngleBracketVerticalBar,
+                                ),
+                                _ => {
+                                    self.start_binop(chars, "&<", Token::AmpersandLeftAngleBracket)
+                                }
+                            }
+                        }
                         Some('&') => {
                             chars.next(); // consume the second '&'
                             self.start_binop(chars, "&&", Token::Overlap)
@@ -1142,7 +1564,8 @@ impl<'a> Tokenizer<'a> {
                 }
                 '{' => self.consume_and_return(chars, Token::LBrace),
                 '}' => self.consume_and_return(chars, Token::RBrace),
-                '#' if dialect_of!(self is SnowflakeDialect | BigQueryDialect | MySqlDialect) => {
+                '#' if dialect_of!(self is SnowflakeDialect | BigQueryDialect | MySqlDialect | HiveDialect) =>
+                {
                     chars.next(); // consume the '#', starting a snowflake single-line comment
                     let comment = self.tokenize_single_line_comment(chars);
                     Ok(Some(Token::Whitespace(Whitespace::SingleLineComment {
@@ -1154,6 +1577,9 @@ impl<'a> Tokenizer<'a> {
                     chars.next(); // consume
                     match chars.peek() {
                         Some('*') => self.consume_for_binop(chars, "~*", Token::TildeAsterisk),
+                        Some('=') if self.dialect.supports_geometric_types() => {
+                            self.consume_for_binop(chars, "~=", Token::TildeEqual)
+                        }
                         Some('~') => {
                             chars.next();
                             match chars.peek() {
@@ -1180,6 +1606,9 @@ impl<'a> Tokenizer<'a> {
                             }
                         }
                         Some(' ') => Ok(Some(Token::Sharp)),
+                        Some('#') if self.dialect.supports_geometric_types() => {
+                            self.consume_for_binop(chars, "##", Token::DoubleSharp)
+                        }
                         Some(sch) if self.dialect.is_identifier_start('#') => {
                             self.tokenize_identifier_or_keyword([ch, *sch], chars)
                         }
@@ -1189,6 +1618,16 @@ impl<'a> Tokenizer<'a> {
                 '@' => {
                     chars.next();
                     match chars.peek() {
+                        Some('@') if self.dialect.supports_geometric_types() => {
+                            self.consume_and_return(chars, Token::AtAt)
+                        }
+                        Some('-') if self.dialect.supports_geometric_types() => {
+                            chars.next();
+                            match chars.peek() {
+                                Some('@') => self.consume_and_return(chars, Token::AtDashAt),
+                                _ => self.start_binop_opt(chars, "@-", None),
+                            }
+                        }
                         Some('>') => self.consume_and_return(chars, Token::AtArrow),
                         Some('?') => self.consume_and_return(chars, Token::AtQuestion),
                         Some('@') => {
@@ -1202,6 +1641,18 @@ impl<'a> Tokenizer<'a> {
                             }
                         }
                         Some(' ') => Ok(Some(Token::AtSign)),
+                        // We break on quotes here, because no dialect allows identifiers starting
+                        // with @ and containing quotation marks (e.g. `@'foo'`) unless they are
+                        // quoted, which is tokenized as a quoted string, not here (e.g.
+                        // `"@'foo'"`). Further, at least two dialects parse `@` followed by a
+                        // quoted string as two separate tokens, which this allows. For example,
+                        // Postgres parses `@'1'` as the absolute value of '1' which is implicitly
+                        // cast to a numeric type. And when parsing MySQL-style grantees (e.g.
+                        // `GRANT ALL ON *.* to 'root'@'localhost'`), we also want separate tokens
+                        // for the user, the `@`, and the host.
+                        Some('\'') => Ok(Some(Token::AtSign)),
+                        Some('\"') => Ok(Some(Token::AtSign)),
+                        Some('`') => Ok(Some(Token::AtSign)),
                         Some(sch) if self.dialect.is_identifier_start('@') => {
                             self.tokenize_identifier_or_keyword([ch, *sch], chars)
                         }
@@ -1209,11 +1660,30 @@ impl<'a> Tokenizer<'a> {
                     }
                 }
                 // Postgres uses ? for jsonb operators, not prepared statements
-                '?' if dialect_of!(self is PostgreSqlDialect) => {
-                    chars.next();
+                '?' if self.dialect.supports_geometric_types() => {
+                    chars.next(); // consume
                     match chars.peek() {
-                        Some('|') => self.consume_and_return(chars, Token::QuestionPipe),
+                        Some('|') => {
+                            chars.next();
+                            match chars.peek() {
+                                Some('|') => self.consume_and_return(
+                                    chars,
+                                    Token::QuestionMarkDoubleVerticalBar,
+                                ),
+                                _ => Ok(Some(Token::QuestionPipe)),
+                            }
+                        }
+
                         Some('&') => self.consume_and_return(chars, Token::QuestionAnd),
+                        Some('-') => {
+                            chars.next(); // consume
+                            match chars.peek() {
+                                Some('|') => self
+                                    .consume_and_return(chars, Token::QuestionMarkDashVerticalBar),
+                                _ => Ok(Some(Token::QuestionMarkDash)),
+                            }
+                        }
+                        Some('#') => self.consume_and_return(chars, Token::QuestionMarkSharp),
                         _ => self.consume_and_return(chars, Token::Question),
                     }
                 }
@@ -1229,7 +1699,7 @@ impl<'a> Tokenizer<'a> {
                 }
                 '$' => Ok(Some(self.tokenize_dollar_preceded_value(chars)?)),
 
-                //whitespace check (including unicode chars) should be last as it covers some of the chars above
+                // whitespace check (including unicode chars) should be last as it covers some of the chars above
                 ch if ch.is_whitespace() => {
                     self.consume_and_return(chars, Token::Whitespace(Whitespace::Space))
                 }
@@ -1247,7 +1717,7 @@ impl<'a> Tokenizer<'a> {
         default: Token,
     ) -> Result<Option<Token>, TokenizerError> {
         chars.next(); // consume the first char
-        self.start_binop(chars, prefix, default)
+        self.start_binop_opt(chars, prefix, Some(default))
     }
 
     /// parse a custom binary operator
@@ -1256,6 +1726,16 @@ impl<'a> Tokenizer<'a> {
         chars: &mut State,
         prefix: &str,
         default: Token,
+    ) -> Result<Option<Token>, TokenizerError> {
+        self.start_binop_opt(chars, prefix, Some(default))
+    }
+
+    /// parse a custom binary operator
+    fn start_binop_opt(
+        &self,
+        chars: &mut State,
+        prefix: &str,
+        default: Option<Token>,
     ) -> Result<Option<Token>, TokenizerError> {
         let mut custom = None;
         while let Some(&ch) = chars.peek() {
@@ -1266,10 +1746,14 @@ impl<'a> Tokenizer<'a> {
             custom.get_or_insert_with(|| prefix.to_string()).push(ch);
             chars.next();
         }
-
-        Ok(Some(
-            custom.map(Token::CustomBinaryOperator).unwrap_or(default),
-        ))
+        match (custom, default) {
+            (Some(custom), _) => Ok(Token::CustomBinaryOperator(custom).into()),
+            (None, Some(tok)) => Ok(Some(tok)),
+            (None, None) => self.tokenizer_error(
+                chars.location(),
+                format!("Expected a valid binary operator after '{prefix}'"),
+            ),
+        }
     }
 
     /// Tokenize dollar preceded value (i.e: a string/placeholder)
@@ -1279,7 +1763,8 @@ impl<'a> Tokenizer<'a> {
 
         chars.next();
 
-        if let Some('$') = chars.peek() {
+        // If the dialect does not support dollar-quoted strings, then `$$` is rather a placeholder.
+        if matches!(chars.peek(), Some('$')) && !self.dialect.supports_dollar_placeholder() {
             chars.next();
 
             let mut is_terminated = false;
@@ -1313,52 +1798,43 @@ impl<'a> Tokenizer<'a> {
             };
         } else {
             value.push_str(&peeking_take_while(chars, |ch| {
-                ch.is_alphanumeric() || ch == '_'
+                ch.is_alphanumeric()
+                    || ch == '_'
+                    // Allow $ as a placeholder character if the dialect supports it
+                    || matches!(ch, '$' if self.dialect.supports_dollar_placeholder())
             }));
 
-            if let Some('$') = chars.peek() {
+            // If the dialect does not support dollar-quoted strings, don't look for the end delimiter.
+            if matches!(chars.peek(), Some('$')) && !self.dialect.supports_dollar_placeholder() {
                 chars.next();
 
-                'searching_for_end: loop {
-                    s.push_str(&peeking_take_while(chars, |ch| ch != '$'));
-                    match chars.peek() {
-                        Some('$') => {
-                            chars.next();
-                            let mut maybe_s = String::from("$");
-                            for c in value.chars() {
-                                if let Some(next_char) = chars.next() {
-                                    maybe_s.push(next_char);
-                                    if next_char != c {
-                                        // This doesn't match the dollar quote delimiter so this
-                                        // is not the end of the string.
-                                        s.push_str(&maybe_s);
-                                        continue 'searching_for_end;
-                                    }
-                                } else {
-                                    return self.tokenizer_error(
-                                        chars.location(),
-                                        "Unterminated dollar-quoted, expected $",
-                                    );
+                let mut temp = String::new();
+                let end_delimiter = format!("${value}$");
+
+                loop {
+                    match chars.next() {
+                        Some(ch) => {
+                            temp.push(ch);
+
+                            if temp.ends_with(&end_delimiter) {
+                                if let Some(temp) = temp.strip_suffix(&end_delimiter) {
+                                    s.push_str(temp);
                                 }
-                            }
-                            if chars.peek() == Some(&'$') {
-                                chars.next();
-                                maybe_s.push('$');
-                                // maybe_s matches the end delimiter
-                                break 'searching_for_end;
-                            } else {
-                                // This also doesn't match the dollar quote delimiter as there are
-                                // more characters before the second dollar so this is not the end
-                                // of the string.
-                                s.push_str(&maybe_s);
-                                continue 'searching_for_end;
+                                break;
                             }
                         }
-                        _ => {
+                        None => {
+                            if temp.ends_with(&end_delimiter) {
+                                if let Some(temp) = temp.strip_suffix(&end_delimiter) {
+                                    s.push_str(temp);
+                                }
+                                break;
+                            }
+
                             return self.tokenizer_error(
                                 chars.location(),
                                 "Unterminated dollar-quoted, expected $",
-                            )
+                            );
                         }
                     }
                 }
@@ -1386,11 +1862,17 @@ impl<'a> Tokenizer<'a> {
 
     // Consume characters until newline
     fn tokenize_single_line_comment(&self, chars: &mut State) -> String {
-        let mut comment = peeking_take_while(chars, |ch| ch != '\n');
+        let mut comment = peeking_take_while(chars, |ch| match ch {
+            '\n' => false,                                           // Always stop at \n
+            '\r' if dialect_of!(self is PostgreSqlDialect) => false, // Stop at \r for Postgres
+            _ => true, // Keep consuming for other characters
+        });
+
         if let Some(ch) = chars.next() {
-            assert_eq!(ch, '\n');
+            assert!(ch == '\n' || ch == '\r');
             comment.push(ch);
         }
+
         comment
     }
 
@@ -1403,6 +1885,27 @@ impl<'a> Tokenizer<'a> {
         s
     }
 
+    /// Read a quoted identifier
+    fn tokenize_quoted_identifier(
+        &self,
+        quote_start: char,
+        chars: &mut State,
+    ) -> Result<String, TokenizerError> {
+        let error_loc = chars.location();
+        chars.next(); // consume the opening quote
+        let quote_end = Word::matching_end_quote(quote_start);
+        let (s, last_char) = self.parse_quoted_ident(chars, quote_end);
+
+        if last_char == Some(quote_end) {
+            Ok(s)
+        } else {
+            self.tokenizer_error(
+                error_loc,
+                format!("Expected close delimiter '{quote_end}' before EOF."),
+            )
+        }
+    }
+
     /// Read a single quoted string, starting with the opening quote.
     fn tokenize_escaped_single_quoted_string(
         &self,
@@ -1555,8 +2058,13 @@ impl<'a> Tokenizer<'a> {
                     num_consecutive_quotes = 0;
 
                     if let Some(next) = chars.peek() {
-                        if !self.unescape {
-                            // In no-escape mode, the given query has to be saved completely including backslashes.
+                        if !self.unescape
+                            || (self.dialect.ignores_wildcard_escapes()
+                                && (*next == '%' || *next == '_'))
+                        {
+                            // In no-escape mode, the given query has to be saved completely
+                            // including backslashes. Similarly, with ignore_like_wildcard_escapes,
+                            // the backslash is not stripped.
                             s.push(ch);
                             s.push(*next);
                             chars.next(); // consume next
@@ -1599,28 +2107,33 @@ impl<'a> Tokenizer<'a> {
     ) -> Result<Option<Token>, TokenizerError> {
         let mut s = String::new();
         let mut nested = 1;
-        let mut last_ch = ' ';
+        let supports_nested_comments = self.dialect.supports_nested_comments();
 
         loop {
             match chars.next() {
-                Some(ch) => {
-                    if last_ch == '/' && ch == '*' {
-                        nested += 1;
-                    } else if last_ch == '*' && ch == '/' {
-                        nested -= 1;
-                        if nested == 0 {
-                            s.pop();
-                            break Ok(Some(Token::Whitespace(Whitespace::MultiLineComment(s))));
-                        }
+                Some('/') if matches!(chars.peek(), Some('*')) && supports_nested_comments => {
+                    chars.next(); // consume the '*'
+                    s.push('/');
+                    s.push('*');
+                    nested += 1;
+                }
+                Some('*') if matches!(chars.peek(), Some('/')) => {
+                    chars.next(); // consume the '/'
+                    nested -= 1;
+                    if nested == 0 {
+                        break Ok(Some(Token::Whitespace(Whitespace::MultiLineComment(s))));
                     }
+                    s.push('*');
+                    s.push('/');
+                }
+                Some(ch) => {
                     s.push(ch);
-                    last_ch = ch;
                 }
                 None => {
                     break self.tokenizer_error(
                         chars.location(),
                         "Unexpected EOF while in a multi-line comment",
-                    )
+                    );
                 }
             }
         }
@@ -1676,6 +2189,24 @@ fn peeking_take_while(chars: &mut State, mut predicate: impl FnMut(char) -> bool
     s
 }
 
+/// Same as peeking_take_while, but also passes the next character to the predicate.
+fn peeking_next_take_while(
+    chars: &mut State,
+    mut predicate: impl FnMut(char, Option<char>) -> bool,
+) -> String {
+    let mut s = String::new();
+    while let Some(&ch) = chars.peek() {
+        let next_char = chars.peekable.clone().nth(1);
+        if predicate(ch, next_char) {
+            chars.next(); // consume
+            s.push(ch);
+        } else {
+            break;
+        }
+    }
+    s
+}
+
 fn unescape_single_quoted_string(chars: &mut State<'_>) -> Option<String> {
     Unescape::new(chars).unescape()
 }
@@ -1871,13 +2402,13 @@ fn take_char_from_hex_digits(
             location: chars.location(),
         })?;
         let digit = next_char.to_digit(16).ok_or_else(|| TokenizerError {
-            message: format!("Invalid hex digit in escaped unicode string: {}", next_char),
+            message: format!("Invalid hex digit in escaped unicode string: {next_char}"),
             location: chars.location(),
         })?;
         result = result * 16 + digit;
     }
     char::from_u32(result).ok_or_else(|| TokenizerError {
-        message: format!("Invalid unicode character: {:x}", result),
+        message: format!("Invalid unicode character: {result:x}"),
         location: chars.location(),
     })
 }
@@ -1886,8 +2417,9 @@ fn take_char_from_hex_digits(
 mod tests {
     use super::*;
     use crate::dialect::{
-        BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect,
+        BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect, SQLiteDialect,
     };
+    use crate::test_utils::all_dialects_where;
     use core::fmt::Debug;
 
     #[test]
@@ -1956,6 +2488,41 @@ mod tests {
         compare(expected, tokens);
     }
 
+    #[test]
+    fn tokenize_numeric_literal_underscore() {
+        let dialect = GenericDialect {};
+        let sql = String::from("SELECT 10_000");
+        let mut tokenizer = Tokenizer::new(&dialect, &sql);
+        let tokens = tokenizer.tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::Number("10".to_string(), false),
+            Token::make_word("_000", None),
+        ];
+        compare(expected, tokens);
+
+        all_dialects_where(|dialect| dialect.supports_numeric_literal_underscores()).tokenizes_to(
+            "SELECT 10_000, _10_000, 10_00_, 10___0",
+            vec![
+                Token::make_keyword("SELECT"),
+                Token::Whitespace(Whitespace::Space),
+                Token::Number("10_000".to_string(), false),
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::make_word("_10_000", None), // leading underscore tokenizes as a word (parsed as column identifier)
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::Number("10_00".to_string(), false),
+                Token::make_word("_", None), // trailing underscores tokenizes as a word (syntax error in some dialects)
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::Number("10".to_string(), false),
+                Token::make_word("___0", None), // multiple underscores tokenizes as a word (syntax error in some dialects)
+            ],
+        );
+    }
+
     #[test]
     fn tokenize_select_exponent() {
         let sql = String::from("SELECT 1e10, 1e-10, 1e+10, 1ea, 1e-10a, 1e-10-10");
@@ -2290,20 +2857,67 @@ mod tests {
 
     #[test]
     fn tokenize_dollar_quoted_string_tagged() {
-        let sql = String::from(
-            "SELECT $tag$dollar '$' quoted strings have $tags like this$ or like this $$$tag$",
-        );
-        let dialect = GenericDialect {};
-        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
-        let expected = vec![
-            Token::make_keyword("SELECT"),
-            Token::Whitespace(Whitespace::Space),
-            Token::DollarQuotedString(DollarQuotedString {
-                value: "dollar '$' quoted strings have $tags like this$ or like this $$".into(),
-                tag: Some("tag".into()),
-            }),
+        let test_cases = vec![
+            (
+                String::from("SELECT $tag$dollar '$' quoted strings have $tags like this$ or like this $$$tag$"),
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::DollarQuotedString(DollarQuotedString {
+                        value: "dollar '$' quoted strings have $tags like this$ or like this $$".into(),
+                        tag: Some("tag".into()),
+                    })
+                ]
+            ),
+            (
+                String::from("SELECT $abc$x$ab$abc$"),
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::DollarQuotedString(DollarQuotedString {
+                        value: "x$ab".into(),
+                        tag: Some("abc".into()),
+                    })
+                ]
+            ),
+            (
+                String::from("SELECT $abc$$abc$"),
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::DollarQuotedString(DollarQuotedString {
+                        value: "".into(),
+                        tag: Some("abc".into()),
+                    })
+                ]
+            ),
+            (
+                String::from("0$abc$$abc$1"),
+                vec![
+                    Token::Number("0".into(), false),
+                    Token::DollarQuotedString(DollarQuotedString {
+                        value: "".into(),
+                        tag: Some("abc".into()),
+                    }),
+                    Token::Number("1".into(), false),
+                ]
+            ),
+            (
+                String::from("$function$abc$q$data$q$$function$"),
+                vec![
+                    Token::DollarQuotedString(DollarQuotedString {
+                        value: "abc$q$data$q$".into(),
+                        tag: Some("function".into()),
+                    }),
+                ]
+            ),
         ];
-        compare(expected, tokens);
+
+        let dialect = GenericDialect {};
+        for (sql, expected) in test_cases {
+            let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+            compare(expected, tokens);
+        }
     }
 
     #[test]
@@ -2322,6 +2936,78 @@ mod tests {
         );
     }
 
+    #[test]
+    fn tokenize_dollar_quoted_string_tagged_unterminated_mirror() {
+        let sql = String::from("SELECT $abc$abc$");
+        let dialect = GenericDialect {};
+        assert_eq!(
+            Tokenizer::new(&dialect, &sql).tokenize(),
+            Err(TokenizerError {
+                message: "Unterminated dollar-quoted, expected $".into(),
+                location: Location {
+                    line: 1,
+                    column: 17
+                }
+            })
+        );
+    }
+
+    #[test]
+    fn tokenize_dollar_placeholder() {
+        let sql = String::from("SELECT $$, $$ABC$$, $ABC$, $ABC");
+        let dialect = SQLiteDialect {};
+        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+        assert_eq!(
+            tokens,
+            vec![
+                Token::make_keyword("SELECT"),
+                Token::Whitespace(Whitespace::Space),
+                Token::Placeholder("$$".into()),
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::Placeholder("$$ABC$$".into()),
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::Placeholder("$ABC$".into()),
+                Token::Comma,
+                Token::Whitespace(Whitespace::Space),
+                Token::Placeholder("$ABC".into()),
+            ]
+        );
+    }
+
+    #[test]
+    fn tokenize_nested_dollar_quoted_strings() {
+        let sql = String::from("SELECT $tag$dollar $nested$ string$tag$");
+        let dialect = GenericDialect {};
+        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::DollarQuotedString(DollarQuotedString {
+                value: "dollar $nested$ string".into(),
+                tag: Some("tag".into()),
+            }),
+        ];
+        compare(expected, tokens);
+    }
+
+    #[test]
+    fn tokenize_dollar_quoted_string_untagged_empty() {
+        let sql = String::from("SELECT $$$$");
+        let dialect = GenericDialect {};
+        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::DollarQuotedString(DollarQuotedString {
+                value: "".into(),
+                tag: None,
+            }),
+        ];
+        compare(expected, tokens);
+    }
+
     #[test]
     fn tokenize_dollar_quoted_string_untagged() {
         let sql =
@@ -2392,17 +3078,62 @@ mod tests {
 
     #[test]
     fn tokenize_comment() {
-        let sql = String::from("0--this is a comment\n1");
+        let test_cases = vec![
+            (
+                String::from("0--this is a comment\n1"),
+                vec![
+                    Token::Number("0".to_string(), false),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: "this is a comment\n".to_string(),
+                    }),
+                    Token::Number("1".to_string(), false),
+                ],
+            ),
+            (
+                String::from("0--this is a comment\r1"),
+                vec![
+                    Token::Number("0".to_string(), false),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: "this is a comment\r1".to_string(),
+                    }),
+                ],
+            ),
+            (
+                String::from("0--this is a comment\r\n1"),
+                vec![
+                    Token::Number("0".to_string(), false),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: "this is a comment\r\n".to_string(),
+                    }),
+                    Token::Number("1".to_string(), false),
+                ],
+            ),
+        ];
 
         let dialect = GenericDialect {};
+
+        for (sql, expected) in test_cases {
+            let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+            compare(expected, tokens);
+        }
+    }
+
+    #[test]
+    fn tokenize_comment_postgres() {
+        let sql = String::from("1--\r0");
+
+        let dialect = PostgreSqlDialect {};
         let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
         let expected = vec![
-            Token::Number("0".to_string(), false),
+            Token::Number("1".to_string(), false),
             Token::Whitespace(Whitespace::SingleLineComment {
                 prefix: "--".to_string(),
-                comment: "this is a comment\n".to_string(),
+                comment: "\r".to_string(),
             }),
-            Token::Number("1".to_string(), false),
+            Token::Number("0".to_string(), false),
         ];
         compare(expected, tokens);
     }
@@ -2438,18 +3169,90 @@ mod tests {
 
     #[test]
     fn tokenize_nested_multiline_comment() {
-        let sql = String::from("0/*multi-line\n* \n/* comment \n /*comment*/*/ */ /comment*/1");
+        let dialect = GenericDialect {};
+        let test_cases = vec![
+            (
+                "0/*multi-line\n* \n/* comment \n /*comment*/*/ */ /comment*/1",
+                vec![
+                    Token::Number("0".to_string(), false),
+                    Token::Whitespace(Whitespace::MultiLineComment(
+                        "multi-line\n* \n/* comment \n /*comment*/*/ ".into(),
+                    )),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Div,
+                    Token::Word(Word {
+                        value: "comment".to_string(),
+                        quote_style: None,
+                        keyword: Keyword::COMMENT,
+                    }),
+                    Token::Mul,
+                    Token::Div,
+                    Token::Number("1".to_string(), false),
+                ],
+            ),
+            (
+                "0/*multi-line\n* \n/* comment \n /*comment/**/ */ /comment*/*/1",
+                vec![
+                    Token::Number("0".to_string(), false),
+                    Token::Whitespace(Whitespace::MultiLineComment(
+                        "multi-line\n* \n/* comment \n /*comment/**/ */ /comment*/".into(),
+                    )),
+                    Token::Number("1".to_string(), false),
+                ],
+            ),
+            (
+                "SELECT 1/* a /* b */ c */0",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Number("1".to_string(), false),
+                    Token::Whitespace(Whitespace::MultiLineComment(" a /* b */ c ".to_string())),
+                    Token::Number("0".to_string(), false),
+                ],
+            ),
+        ];
+
+        for (sql, expected) in test_cases {
+            let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+            compare(expected, tokens);
+        }
+    }
+
+    #[test]
+    fn tokenize_nested_multiline_comment_empty() {
+        let sql = "select 1/*/**/*/0";
 
         let dialect = GenericDialect {};
-        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+        let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
         let expected = vec![
+            Token::make_keyword("select"),
+            Token::Whitespace(Whitespace::Space),
+            Token::Number("1".to_string(), false),
+            Token::Whitespace(Whitespace::MultiLineComment("/**/".to_string())),
             Token::Number("0".to_string(), false),
+        ];
+
+        compare(expected, tokens);
+    }
+
+    #[test]
+    fn tokenize_nested_comments_if_not_supported() {
+        let dialect = SQLiteDialect {};
+        let sql = "SELECT 1/*/* nested comment */*/0";
+        let tokens = Tokenizer::new(&dialect, sql).tokenize();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::Number("1".to_string(), false),
             Token::Whitespace(Whitespace::MultiLineComment(
-                "multi-line\n* \n/* comment \n /*comment*/*/ */ /comment".to_string(),
+                "/* nested comment ".to_string(),
             )),
-            Token::Number("1".to_string(), false),
+            Token::Mul,
+            Token::Div,
+            Token::Number("0".to_string(), false),
         ];
-        compare(expected, tokens);
+
+        compare(expected, tokens.unwrap());
     }
 
     #[test]
@@ -2669,18 +3472,30 @@ mod tests {
             .tokenize_with_location()
             .unwrap();
         let expected = vec![
-            TokenWithLocation::new(Token::make_keyword("SELECT"), 1, 1),
-            TokenWithLocation::new(Token::Whitespace(Whitespace::Space), 1, 7),
-            TokenWithLocation::new(Token::make_word("a", None), 1, 8),
-            TokenWithLocation::new(Token::Comma, 1, 9),
-            TokenWithLocation::new(Token::Whitespace(Whitespace::Newline), 1, 10),
-            TokenWithLocation::new(Token::Whitespace(Whitespace::Space), 2, 1),
-            TokenWithLocation::new(Token::make_word("b", None), 2, 2),
+            TokenWithSpan::at(Token::make_keyword("SELECT"), (1, 1).into(), (1, 7).into()),
+            TokenWithSpan::at(
+                Token::Whitespace(Whitespace::Space),
+                (1, 7).into(),
+                (1, 8).into(),
+            ),
+            TokenWithSpan::at(Token::make_word("a", None), (1, 8).into(), (1, 9).into()),
+            TokenWithSpan::at(Token::Comma, (1, 9).into(), (1, 10).into()),
+            TokenWithSpan::at(
+                Token::Whitespace(Whitespace::Newline),
+                (1, 10).into(),
+                (2, 1).into(),
+            ),
+            TokenWithSpan::at(
+                Token::Whitespace(Whitespace::Space),
+                (2, 1).into(),
+                (2, 2).into(),
+            ),
+            TokenWithSpan::at(Token::make_word("b", None), (2, 2).into(), (2, 3).into()),
         ];
         compare(expected, tokens);
     }
 
-    fn compare<T: PartialEq + std::fmt::Debug>(expected: Vec<T>, actual: Vec<T>) {
+    fn compare<T: PartialEq + fmt::Debug>(expected: Vec<T>, actual: Vec<T>) {
         //println!("------------------------------");
         //println!("tokens   = {:?}", actual);
         //println!("expected = {:?}", expected);
@@ -2689,7 +3504,7 @@ mod tests {
     }
 
     fn check_unescape(s: &str, expected: Option<&str>) {
-        let s = format!("'{}'", s);
+        let s = format!("'{s}'");
         let mut state = State {
             peekable: s.chars().peekable(),
             line: 0,
@@ -2822,6 +3637,9 @@ mod tests {
             (r#"'\\a\\b\'c'"#, r#"\\a\\b\'c"#, r#"\a\b'c"#),
             (r#"'\'abcd'"#, r#"\'abcd"#, r#"'abcd"#),
             (r#"'''a''b'"#, r#"''a''b"#, r#"'a'b"#),
+            (r#"'\q'"#, r#"\q"#, r#"q"#),
+            (r#"'\%\_'"#, r#"\%\_"#, r#"%_"#),
+            (r#"'\\%\\_'"#, r#"\\%\\_"#, r#"\%\_"#),
         ] {
             let tokens = Tokenizer::new(&dialect, sql)
                 .with_unescape(false)
@@ -2855,6 +3673,16 @@ mod tests {
 
             compare(expected, tokens);
         }
+
+        // MySQL special case for LIKE escapes
+        for (sql, expected) in [(r#"'\%'"#, r#"\%"#), (r#"'\_'"#, r#"\_"#)] {
+            let dialect = MySqlDialect {};
+            let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+
+            let expected = vec![Token::SingleQuotedString(expected.to_string())];
+
+            compare(expected, tokens);
+        }
     }
 
     #[test]
@@ -2976,4 +3804,270 @@ mod tests {
         let expected = vec![Token::SingleQuotedString("''".to_string())];
         compare(expected, tokens);
     }
+
+    #[test]
+    fn test_mysql_users_grantees() {
+        let dialect = MySqlDialect {};
+
+        let sql = "CREATE USER `root`@`%`";
+        let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("CREATE"),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_keyword("USER"),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_word("root", Some('`')),
+            Token::AtSign,
+            Token::make_word("%", Some('`')),
+        ];
+        compare(expected, tokens);
+    }
+
+    #[test]
+    fn test_postgres_abs_without_space_and_string_literal() {
+        let dialect = MySqlDialect {};
+
+        let sql = "SELECT @'1'";
+        let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::AtSign,
+            Token::SingleQuotedString("1".to_string()),
+        ];
+        compare(expected, tokens);
+    }
+
+    #[test]
+    fn test_postgres_abs_without_space_and_quoted_column() {
+        let dialect = MySqlDialect {};
+
+        let sql = r#"SELECT @"bar" FROM foo"#;
+        let tokens = Tokenizer::new(&dialect, sql).tokenize().unwrap();
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::AtSign,
+            Token::DoubleQuotedString("bar".to_string()),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_keyword("FROM"),
+            Token::Whitespace(Whitespace::Space),
+            Token::make_word("foo", None),
+        ];
+        compare(expected, tokens);
+    }
+
+    #[test]
+    fn test_national_strings_backslash_escape_not_supported() {
+        all_dialects_where(|dialect| !dialect.supports_string_literal_backslash_escape())
+            .tokenizes_to(
+                "select n'''''\\'",
+                vec![
+                    Token::make_keyword("select"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::NationalStringLiteral("''\\".to_string()),
+                ],
+            );
+    }
+
+    #[test]
+    fn test_national_strings_backslash_escape_supported() {
+        all_dialects_where(|dialect| dialect.supports_string_literal_backslash_escape())
+            .tokenizes_to(
+                "select n'''''\\''",
+                vec![
+                    Token::make_keyword("select"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::NationalStringLiteral("'''".to_string()),
+                ],
+            );
+    }
+
+    #[test]
+    fn test_string_escape_constant_not_supported() {
+        all_dialects_where(|dialect| !dialect.supports_string_escape_constant()).tokenizes_to(
+            "select e'...'",
+            vec![
+                Token::make_keyword("select"),
+                Token::Whitespace(Whitespace::Space),
+                Token::make_word("e", None),
+                Token::SingleQuotedString("...".to_string()),
+            ],
+        );
+
+        all_dialects_where(|dialect| !dialect.supports_string_escape_constant()).tokenizes_to(
+            "select E'...'",
+            vec![
+                Token::make_keyword("select"),
+                Token::Whitespace(Whitespace::Space),
+                Token::make_word("E", None),
+                Token::SingleQuotedString("...".to_string()),
+            ],
+        );
+    }
+
+    #[test]
+    fn test_string_escape_constant_supported() {
+        all_dialects_where(|dialect| dialect.supports_string_escape_constant()).tokenizes_to(
+            "select e'\\''",
+            vec![
+                Token::make_keyword("select"),
+                Token::Whitespace(Whitespace::Space),
+                Token::EscapedStringLiteral("'".to_string()),
+            ],
+        );
+
+        all_dialects_where(|dialect| dialect.supports_string_escape_constant()).tokenizes_to(
+            "select E'\\''",
+            vec![
+                Token::make_keyword("select"),
+                Token::Whitespace(Whitespace::Space),
+                Token::EscapedStringLiteral("'".to_string()),
+            ],
+        );
+    }
+
+    #[test]
+    fn test_whitespace_required_after_single_line_comment() {
+        all_dialects_where(|dialect| dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT --'abc'",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Minus,
+                    Token::Minus,
+                    Token::SingleQuotedString("abc".to_string()),
+                ],
+            );
+
+        all_dialects_where(|dialect| dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT -- 'abc'",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: " 'abc'".to_string(),
+                    }),
+                ],
+            );
+
+        all_dialects_where(|dialect| dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT --",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Minus,
+                    Token::Minus,
+                ],
+            );
+    }
+
+    #[test]
+    fn test_whitespace_not_required_after_single_line_comment() {
+        all_dialects_where(|dialect| !dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT --'abc'",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: "'abc'".to_string(),
+                    }),
+                ],
+            );
+
+        all_dialects_where(|dialect| !dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT -- 'abc'",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: " 'abc'".to_string(),
+                    }),
+                ],
+            );
+
+        all_dialects_where(|dialect| !dialect.requires_single_line_comment_whitespace())
+            .tokenizes_to(
+                "SELECT --",
+                vec![
+                    Token::make_keyword("SELECT"),
+                    Token::Whitespace(Whitespace::Space),
+                    Token::Whitespace(Whitespace::SingleLineComment {
+                        prefix: "--".to_string(),
+                        comment: "".to_string(),
+                    }),
+                ],
+            );
+    }
+
+    #[test]
+    fn test_tokenize_identifiers_numeric_prefix() {
+        all_dialects_where(|dialect| dialect.supports_numeric_prefix())
+            .tokenizes_to("123abc", vec![Token::make_word("123abc", None)]);
+
+        all_dialects_where(|dialect| dialect.supports_numeric_prefix())
+            .tokenizes_to("12e34", vec![Token::Number("12e34".to_string(), false)]);
+
+        all_dialects_where(|dialect| dialect.supports_numeric_prefix()).tokenizes_to(
+            "t.12e34",
+            vec![
+                Token::make_word("t", None),
+                Token::Period,
+                Token::make_word("12e34", None),
+            ],
+        );
+
+        all_dialects_where(|dialect| dialect.supports_numeric_prefix()).tokenizes_to(
+            "t.1two3",
+            vec![
+                Token::make_word("t", None),
+                Token::Period,
+                Token::make_word("1two3", None),
+            ],
+        );
+    }
+
+    #[test]
+    fn tokenize_period_underscore() {
+        let sql = String::from("SELECT table._col");
+        // a dialect that supports underscores in numeric literals
+        let dialect = PostgreSqlDialect {};
+        let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
+
+        let expected = vec![
+            Token::make_keyword("SELECT"),
+            Token::Whitespace(Whitespace::Space),
+            Token::Word(Word {
+                value: "table".to_string(),
+                quote_style: None,
+                keyword: Keyword::TABLE,
+            }),
+            Token::Period,
+            Token::Word(Word {
+                value: "_col".to_string(),
+                quote_style: None,
+                keyword: Keyword::NoKeyword,
+            }),
+        ];
+
+        compare(expected, tokens);
+
+        let sql = String::from("SELECT ._123");
+        if let Ok(tokens) = Tokenizer::new(&dialect, &sql).tokenize() {
+            panic!("Tokenizer should have failed on {sql}, but it succeeded with {tokens:?}");
+        }
+
+        let sql = String::from("SELECT ._abc");
+        if let Ok(tokens) = Tokenizer::new(&dialect, &sql).tokenize() {
+            panic!("Tokenizer should have failed on {sql}, but it succeeded with {tokens:?}");
+        }
+    }
 }
diff --git a/tests/pretty_print.rs b/tests/pretty_print.rs
new file mode 100644
index 000000000..f5a9d8613
--- /dev/null
+++ b/tests/pretty_print.rs
@@ -0,0 +1,414 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use sqlparser::dialect::GenericDialect;
+use sqlparser::parser::Parser;
+
+fn prettify(sql: &str) -> String {
+    let ast = Parser::parse_sql(&GenericDialect {}, sql).unwrap();
+    format!("{:#}", ast[0])
+}
+
+#[test]
+fn test_pretty_print_select() {
+    assert_eq!(
+        prettify("SELECT a, b, c FROM my_table WHERE x = 1 AND y = 2"),
+        r#"
+SELECT
+  a,
+  b,
+  c
+FROM
+  my_table
+WHERE
+  x = 1 AND y = 2
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_join() {
+    assert_eq!(
+        prettify("SELECT a FROM table1 JOIN table2 ON table1.id = table2.id"),
+        r#"
+SELECT
+  a
+FROM
+  table1
+  JOIN table2 ON table1.id = table2.id
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_subquery() {
+    assert_eq!(
+        prettify("SELECT * FROM (SELECT a, b FROM my_table) AS subquery"),
+        r#"
+SELECT
+  *
+FROM
+  (
+    SELECT
+      a,
+      b
+    FROM
+      my_table
+  ) AS subquery
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_union() {
+    assert_eq!(
+        prettify("SELECT a FROM table1 UNION SELECT b FROM table2"),
+        r#"
+SELECT
+  a
+FROM
+  table1
+UNION
+SELECT
+  b
+FROM
+  table2
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_group_by() {
+    assert_eq!(
+        prettify("SELECT a, COUNT(*) FROM my_table GROUP BY a HAVING COUNT(*) > 1"),
+        r#"
+SELECT
+  a,
+  COUNT(*)
+FROM
+  my_table
+GROUP BY
+  a
+HAVING
+  COUNT(*) > 1
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_cte() {
+    assert_eq!(
+        prettify("WITH cte AS (SELECT a, b FROM my_table) SELECT * FROM cte"),
+        r#"
+WITH cte AS (
+  SELECT
+    a,
+    b
+  FROM
+    my_table
+)
+SELECT
+  *
+FROM
+  cte
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_case_when() {
+    assert_eq!(
+        prettify("SELECT CASE WHEN x > 0 THEN 'positive' WHEN x < 0 THEN 'negative' ELSE 'zero' END FROM my_table"),
+        r#"
+SELECT
+  CASE
+    WHEN x > 0 THEN
+      'positive'
+    WHEN x < 0 THEN
+      'negative'
+    ELSE
+      'zero'
+  END
+FROM
+  my_table
+"#.trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_window_function() {
+    assert_eq!(
+        prettify("SELECT id, value, ROW_NUMBER() OVER (PARTITION BY category ORDER BY value DESC) as rank FROM my_table"),
+        r#"
+SELECT
+  id,
+  value,
+  ROW_NUMBER() OVER (
+    PARTITION BY category
+    ORDER BY value DESC
+  ) AS rank
+FROM
+  my_table
+"#.trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_multiline_string() {
+    assert_eq!(
+        prettify("SELECT 'multiline\nstring' AS str"),
+        r#"
+SELECT
+  'multiline
+string' AS str
+"#
+        .trim(),
+        "A  literal string with a newline should be kept as is. The contents of the string should not be indented."
+    );
+}
+
+#[test]
+fn test_pretty_print_insert_values() {
+    assert_eq!(
+        prettify("INSERT INTO my_table (a, b, c) VALUES (1, 2, 3), (4, 5, 6)"),
+        r#"
+INSERT INTO my_table (a, b, c)
+VALUES
+  (1, 2, 3),
+  (4, 5, 6)
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_insert_select() {
+    assert_eq!(
+        prettify("INSERT INTO my_table (a, b) SELECT x, y FROM source_table RETURNING a AS id"),
+        r#"
+INSERT INTO my_table (a, b)
+SELECT
+  x,
+  y
+FROM
+  source_table
+RETURNING
+  a AS id
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_update() {
+    assert_eq!(
+        prettify("UPDATE my_table SET a = 1, b = 2 WHERE x > 0 RETURNING id, name"),
+        r#"
+UPDATE my_table
+SET
+  a = 1,
+  b = 2
+WHERE
+  x > 0
+RETURNING
+  id,
+  name
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_delete() {
+    assert_eq!(
+        prettify("DELETE FROM my_table WHERE x > 0 RETURNING id, name"),
+        r#"
+DELETE FROM
+  my_table
+WHERE
+  x > 0
+RETURNING
+  id,
+  name
+"#
+        .trim()
+    );
+
+    assert_eq!(
+        prettify("DELETE table1, table2"),
+        r#"
+DELETE
+  table1,
+  table2
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_create_table() {
+    assert_eq!(
+        prettify("CREATE TABLE my_table (id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, CONSTRAINT fk_other FOREIGN KEY (id) REFERENCES other_table(id))"),
+        r#"
+CREATE TABLE my_table (
+  id INT PRIMARY KEY,
+  name VARCHAR(255) NOT NULL,
+  CONSTRAINT fk_other FOREIGN KEY (id) REFERENCES other_table(id)
+)
+"#
+        .trim()
+    );
+}
+
+#[test]
+fn test_pretty_print_create_view() {
+    assert_eq!(
+        prettify("CREATE VIEW my_view AS SELECT a, b FROM my_table WHERE x > 0"),
+        r#"
+CREATE VIEW my_view AS
+SELECT
+  a,
+  b
+FROM
+  my_table
+WHERE
+  x > 0
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_create_function() {
+    assert_eq!(
+        prettify("CREATE FUNCTION my_func() RETURNS INT BEGIN SELECT COUNT(*) INTO @count FROM my_table; RETURN @count; END"),
+        r#"
+CREATE FUNCTION my_func() RETURNS INT
+BEGIN
+  SELECT COUNT(*) INTO @count FROM my_table;
+  RETURN @count;
+END
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_json_table() {
+    assert_eq!(
+        prettify("SELECT * FROM JSON_TABLE(@json, '$[*]' COLUMNS (id INT PATH '$.id', name VARCHAR(255) PATH '$.name')) AS jt"),
+        r#"
+SELECT
+  *
+FROM
+  JSON_TABLE(
+    @json,
+    '$[*]' COLUMNS (
+      id INT PATH '$.id',
+      name VARCHAR(255) PATH '$.name'
+    )
+  ) AS jt
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_transaction_blocks() {
+    assert_eq!(
+        prettify("BEGIN; UPDATE my_table SET x = 1; COMMIT;"),
+        r#"
+BEGIN;
+UPDATE my_table SET x = 1;
+COMMIT;
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_control_flow() {
+    assert_eq!(
+        prettify("IF x > 0 THEN SELECT 'positive'; ELSE SELECT 'negative'; END IF;"),
+        r#"
+IF x > 0 THEN
+  SELECT 'positive';
+ELSE
+  SELECT 'negative';
+END IF;
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_merge() {
+    assert_eq!(
+        prettify("MERGE INTO target_table t USING source_table s ON t.id = s.id WHEN MATCHED THEN UPDATE SET t.value = s.value WHEN NOT MATCHED THEN INSERT (id, value) VALUES (s.id, s.value)"),
+        r#"
+MERGE INTO target_table t
+USING source_table s ON t.id = s.id
+WHEN MATCHED THEN
+  UPDATE SET t.value = s.value
+WHEN NOT MATCHED THEN
+  INSERT (id, value) VALUES (s.id, s.value)
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_create_index() {
+    assert_eq!(
+        prettify("CREATE INDEX idx_name ON my_table (column1, column2)"),
+        r#"
+CREATE INDEX idx_name
+ON my_table (column1, column2)
+"#
+        .trim()
+    );
+}
+
+#[test]
+#[ignore = "https://github.com/apache/datafusion-sqlparser-rs/issues/1850"]
+fn test_pretty_print_explain() {
+    assert_eq!(
+        prettify("EXPLAIN ANALYZE SELECT * FROM my_table WHERE x > 0"),
+        r#"
+EXPLAIN ANALYZE
+SELECT
+  *
+FROM
+  my_table
+WHERE
+  x > 0
+"#
+        .trim()
+    );
+}
diff --git a/tests/sqlparser_bigquery.rs b/tests/sqlparser_bigquery.rs
index 2bf470f71..5c14d140c 100644
--- a/tests/sqlparser_bigquery.rs
+++ b/tests/sqlparser_bigquery.rs
@@ -20,127 +20,156 @@ mod test_utils;
 
 use std::ops::Deref;
 
+use sqlparser::ast::helpers::attached_token::AttachedToken;
 use sqlparser::ast::*;
 use sqlparser::dialect::{BigQueryDialect, GenericDialect};
+use sqlparser::keywords::Keyword;
 use sqlparser::parser::{ParserError, ParserOptions};
+use sqlparser::tokenizer::{Location, Span, Token, TokenWithSpan, Word};
 use test_utils::*;
 
 #[test]
 fn parse_literal_string() {
     let sql = concat!(
-        "SELECT ",
-        "'single', ",
-        r#""double", "#,
-        "'''triple-single''', ",
-        r#""""triple-double""", "#,
-        r#"'single\'escaped', "#,
-        r#"'''triple-single\'escaped''', "#,
-        r#"'''triple-single'unescaped''', "#,
-        r#""double\"escaped", "#,
-        r#""""triple-double\"escaped""", "#,
-        r#""""triple-double"unescaped""""#,
+        "SELECT ",                            // line 1, column 1
+        "'single', ",                         // line 1, column 7
+        r#""double", "#,                      // line 1, column 14
+        "'''triple-single''', ",              // line 1, column 22
+        r#""""triple-double""", "#,           // line 1, column 33
+        r#"'single\'escaped', "#,             // line 1, column 43
+        r#"'''triple-single\'escaped''', "#,  // line 1, column 55
+        r#"'''triple-single'unescaped''', "#, // line 1, column 68
+        r#""double\"escaped", "#,             // line 1, column 83
+        r#""""triple-double\"escaped""", "#,  // line 1, column 92
+        r#""""triple-double"unescaped""", "#, // line 1, column 105
+        r#""""triple-double'unescaped""", "#, // line 1, column 118
+        r#"'''triple-single"unescaped'''"#,   // line 1, column 131
     );
     let dialect = TestedDialects::new_with_options(
         vec![Box::new(BigQueryDialect {})],
         ParserOptions::new().with_unescape(false),
     );
     let select = dialect.verified_only_select(sql);
-    assert_eq!(10, select.projection.len());
+    assert_eq!(12, select.projection.len());
     assert_eq!(
-        &Expr::Value(Value::SingleQuotedString("single".to_string())),
+        &Expr::Value(Value::SingleQuotedString("single".into()).with_empty_span()),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
-        &Expr::Value(Value::DoubleQuotedString("double".to_string())),
+        &Expr::Value(Value::DoubleQuotedString("double".into()).with_empty_span()),
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleSingleQuotedString("triple-single".to_string())),
+        &Expr::Value(Value::TripleSingleQuotedString("triple-single".into()).with_empty_span()),
         expr_from_projection(&select.projection[2])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleDoubleQuotedString("triple-double".to_string())),
+        &Expr::Value(Value::TripleDoubleQuotedString("triple-double".into()).with_empty_span()),
         expr_from_projection(&select.projection[3])
     );
     assert_eq!(
-        &Expr::Value(Value::SingleQuotedString(r#"single\'escaped"#.to_string())),
+        &Expr::Value(Value::SingleQuotedString(r#"single\'escaped"#.into()).with_empty_span()),
         expr_from_projection(&select.projection[4])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleSingleQuotedString(
-            r#"triple-single\'escaped"#.to_string()
-        )),
+        &Expr::Value(
+            Value::TripleSingleQuotedString(r#"triple-single\'escaped"#.into()).with_empty_span()
+        ),
         expr_from_projection(&select.projection[5])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleSingleQuotedString(
-            r#"triple-single'unescaped"#.to_string()
-        )),
+        &Expr::Value(
+            Value::TripleSingleQuotedString(r#"triple-single'unescaped"#.into()).with_empty_span()
+        ),
         expr_from_projection(&select.projection[6])
     );
     assert_eq!(
-        &Expr::Value(Value::DoubleQuotedString(r#"double\"escaped"#.to_string())),
+        &Expr::Value(Value::DoubleQuotedString(r#"double\"escaped"#.to_string()).with_empty_span()),
         expr_from_projection(&select.projection[7])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleDoubleQuotedString(
-            r#"triple-double\"escaped"#.to_string()
-        )),
+        &Expr::Value(
+            Value::TripleDoubleQuotedString(r#"triple-double\"escaped"#.to_string())
+                .with_empty_span()
+        ),
         expr_from_projection(&select.projection[8])
     );
     assert_eq!(
-        &Expr::Value(Value::TripleDoubleQuotedString(
-            r#"triple-double"unescaped"#.to_string()
-        )),
+        &Expr::Value(
+            Value::TripleDoubleQuotedString(r#"triple-double"unescaped"#.to_string())
+                .with_empty_span()
+        ),
         expr_from_projection(&select.projection[9])
     );
+    assert_eq!(
+        &Expr::Value(
+            Value::TripleDoubleQuotedString(r#"triple-double'unescaped"#.to_string())
+                .with_empty_span()
+        ),
+        expr_from_projection(&select.projection[10])
+    );
+    assert_eq!(
+        &Expr::Value(
+            Value::TripleSingleQuotedString(r#"triple-single"unescaped"#.to_string())
+                .with_empty_span()
+        ),
+        expr_from_projection(&select.projection[11])
+    );
 }
 
 #[test]
 fn parse_byte_literal() {
     let sql = concat!(
-        "SELECT ",
-        "B'abc', ",
-        r#"B"abc", "#,
-        r#"B'f\(abc,(.*),def\)', "#,
-        r#"B"f\(abc,(.*),def\)", "#,
-        r#"B'''abc''', "#,
-        r#"B"""abc""""#,
+        "SELECT ",                   // line 1, column 1
+        "B'abc', ",                  // line 1, column 8
+        r#"B"abc", "#,               // line 1, column 15
+        r#"B'f\(abc,(.*),def\)', "#, // line 1, column 22
+        r#"B"f\(abc,(.*),def\)", "#, // line 1, column 42
+        r#"B'''abc''', "#,           // line 1, column 62
+        r#"B"""abc""""#,             // line 1, column 74
     );
     let stmt = bigquery().verified_stmt(sql);
     if let Statement::Query(query) = stmt {
         if let SetExpr::Select(select) = *query.body {
             assert_eq!(6, select.projection.len());
             assert_eq!(
-                &Expr::Value(Value::SingleQuotedByteStringLiteral("abc".to_string())),
+                &Expr::Value(
+                    Value::SingleQuotedByteStringLiteral("abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[0])
             );
             assert_eq!(
-                &Expr::Value(Value::DoubleQuotedByteStringLiteral("abc".to_string())),
+                &Expr::Value(
+                    Value::DoubleQuotedByteStringLiteral("abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[1])
             );
             assert_eq!(
-                &Expr::Value(Value::SingleQuotedByteStringLiteral(
-                    r"f\(abc,(.*),def\)".to_string()
-                )),
+                &Expr::Value(
+                    Value::SingleQuotedByteStringLiteral(r"f\(abc,(.*),def\)".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[2])
             );
             assert_eq!(
-                &Expr::Value(Value::DoubleQuotedByteStringLiteral(
-                    r"f\(abc,(.*),def\)".to_string()
-                )),
+                &Expr::Value(
+                    Value::DoubleQuotedByteStringLiteral(r"f\(abc,(.*),def\)".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[3])
             );
             assert_eq!(
-                &Expr::Value(Value::TripleSingleQuotedByteStringLiteral(
-                    r"abc".to_string()
-                )),
+                &Expr::Value(
+                    Value::TripleSingleQuotedByteStringLiteral(r"abc".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[4])
             );
             assert_eq!(
-                &Expr::Value(Value::TripleDoubleQuotedByteStringLiteral(
-                    r"abc".to_string()
-                )),
+                &Expr::Value(
+                    Value::TripleDoubleQuotedByteStringLiteral(r"abc".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[5])
             );
         }
@@ -157,48 +186,54 @@ fn parse_byte_literal() {
 #[test]
 fn parse_raw_literal() {
     let sql = concat!(
-        "SELECT ",
-        "R'abc', ",
-        r#"R"abc", "#,
-        r#"R'f\(abc,(.*),def\)', "#,
-        r#"R"f\(abc,(.*),def\)", "#,
-        r#"R'''abc''', "#,
-        r#"R"""abc""""#,
+        "SELECT ",                   // line 1, column 1
+        "R'abc', ",                  // line 1, column 8
+        r#"R"abc", "#,               // line 1, column 15
+        r#"R'f\(abc,(.*),def\)', "#, // line 1, column 22
+        r#"R"f\(abc,(.*),def\)", "#, // line 1, column 42
+        r#"R'''abc''', "#,           // line 1, column 62
+        r#"R"""abc""""#,             // line 1, column 74
     );
     let stmt = bigquery().verified_stmt(sql);
     if let Statement::Query(query) = stmt {
         if let SetExpr::Select(select) = *query.body {
             assert_eq!(6, select.projection.len());
             assert_eq!(
-                &Expr::Value(Value::SingleQuotedRawStringLiteral("abc".to_string())),
+                &Expr::Value(
+                    Value::SingleQuotedRawStringLiteral("abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[0])
             );
             assert_eq!(
-                &Expr::Value(Value::DoubleQuotedRawStringLiteral("abc".to_string())),
+                &Expr::Value(
+                    Value::DoubleQuotedRawStringLiteral("abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[1])
             );
             assert_eq!(
-                &Expr::Value(Value::SingleQuotedRawStringLiteral(
-                    r"f\(abc,(.*),def\)".to_string()
-                )),
+                &Expr::Value(
+                    Value::SingleQuotedRawStringLiteral(r"f\(abc,(.*),def\)".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[2])
             );
             assert_eq!(
-                &Expr::Value(Value::DoubleQuotedRawStringLiteral(
-                    r"f\(abc,(.*),def\)".to_string()
-                )),
+                &Expr::Value(
+                    Value::DoubleQuotedRawStringLiteral(r"f\(abc,(.*),def\)".to_string())
+                        .with_empty_span()
+                ),
                 expr_from_projection(&select.projection[3])
             );
             assert_eq!(
-                &Expr::Value(Value::TripleSingleQuotedRawStringLiteral(
-                    r"abc".to_string()
-                )),
+                &Expr::Value(
+                    Value::TripleSingleQuotedRawStringLiteral(r"abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[4])
             );
             assert_eq!(
-                &Expr::Value(Value::TripleDoubleQuotedRawStringLiteral(
-                    r"abc".to_string()
-                )),
+                &Expr::Value(
+                    Value::TripleDoubleQuotedRawStringLiteral(r"abc".to_string()).with_empty_span()
+                ),
                 expr_from_projection(&select.projection[5])
             );
         }
@@ -212,6 +247,64 @@ fn parse_raw_literal() {
     );
 }
 
+#[test]
+fn parse_big_query_non_reserved_column_alias() {
+    let sql = r#"SELECT OFFSET, EXPLAIN, ANALYZE, SORT, TOP, VIEW FROM T"#;
+    bigquery().verified_stmt(sql);
+
+    let sql = r#"SELECT 1 AS OFFSET, 2 AS EXPLAIN, 3 AS ANALYZE FROM T"#;
+    bigquery().verified_stmt(sql);
+}
+
+#[test]
+fn parse_at_at_identifier() {
+    bigquery().verified_stmt("SELECT @@error.stack_trace, @@error.message");
+}
+
+#[test]
+fn parse_begin() {
+    let sql = r#"BEGIN SELECT 1; EXCEPTION WHEN ERROR THEN SELECT 2; RAISE USING MESSAGE = FORMAT('ERR: %s', 'Bad'); END"#;
+    let Statement::StartTransaction {
+        statements,
+        exception,
+        has_end_keyword,
+        ..
+    } = bigquery().verified_stmt(sql)
+    else {
+        unreachable!();
+    };
+    assert_eq!(1, statements.len());
+    assert!(exception.is_some());
+
+    let exception = exception.unwrap();
+    assert_eq!(1, exception.len());
+    assert!(has_end_keyword);
+
+    bigquery().verified_stmt(
+        "BEGIN SELECT 1; SELECT 2; EXCEPTION WHEN ERROR THEN SELECT 2; SELECT 4; END",
+    );
+    bigquery()
+        .verified_stmt("BEGIN SELECT 1; EXCEPTION WHEN ERROR THEN SELECT @@error.stack_trace; END");
+    bigquery().verified_stmt("BEGIN EXCEPTION WHEN ERROR THEN SELECT 2; END");
+    bigquery().verified_stmt("BEGIN SELECT 1; SELECT 2; EXCEPTION WHEN ERROR THEN END");
+    bigquery().verified_stmt("BEGIN EXCEPTION WHEN ERROR THEN END");
+    bigquery().verified_stmt("BEGIN SELECT 1; SELECT 2; END");
+    bigquery().verified_stmt("BEGIN END");
+
+    assert_eq!(
+        bigquery()
+            .parse_sql_statements("BEGIN SELECT 1; SELECT 2 END")
+            .unwrap_err(),
+        ParserError::ParserError("Expected: ;, found: END".to_string())
+    );
+    assert_eq!(
+        bigquery()
+            .parse_sql_statements("BEGIN SELECT 1; EXCEPTION WHEN ERROR THEN SELECT 2 END")
+            .unwrap_err(),
+        ParserError::ParserError("Expected: ;, found: END".to_string())
+    );
+}
+
 #[test]
 fn parse_delete_statement() {
     let sql = "DELETE \"table\" WHERE 1";
@@ -221,15 +314,7 @@ fn parse_delete_statement() {
             ..
         }) => {
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::with_quote('"', "table")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![Ident::with_quote('"', "table")])),
                 from[0].relation
             );
         }
@@ -256,7 +341,7 @@ fn parse_create_view_with_options() {
         } => {
             assert_eq!(
                 name,
-                ObjectName(vec![
+                ObjectName::from(vec![
                     "myproject".into(),
                     "mydataset".into(),
                     "newview".into()
@@ -272,10 +357,16 @@ fn parse_create_view_with_options() {
                     ViewColumnDef {
                         name: Ident::new("age"),
                         data_type: None,
-                        options: Some(vec![ColumnOption::Options(vec![SqlOption::KeyValue {
-                            key: Ident::new("description"),
-                            value: Expr::Value(Value::DoubleQuotedString("field age".to_string())),
-                        }])]),
+                        options: Some(ColumnOptions::CommaSeparated(vec![ColumnOption::Options(
+                            vec![SqlOption::KeyValue {
+                                key: Ident::new("description"),
+                                value: Expr::Value(
+                                    Value::DoubleQuotedString("field age".to_string()).with_span(
+                                        Span::new(Location::new(1, 42), Location::new(1, 52))
+                                    )
+                                ),
+                            }]
+                        )])),
                     },
                 ],
                 columns
@@ -294,9 +385,10 @@ fn parse_create_view_with_options() {
             assert_eq!(
                 &SqlOption::KeyValue {
                     key: Ident::new("description"),
-                    value: Expr::Value(Value::DoubleQuotedString(
-                        "a view that expires in 2 days".to_string()
-                    )),
+                    value: Expr::Value(
+                        Value::DoubleQuotedString("a view that expires in 2 days".to_string())
+                            .with_empty_span()
+                    ),
                 },
                 &options[2],
             );
@@ -304,6 +396,7 @@ fn parse_create_view_with_options() {
         _ => unreachable!(),
     }
 }
+
 #[test]
 fn parse_create_view_if_not_exists() {
     let sql = "CREATE VIEW IF NOT EXISTS mydataset.newview AS SELECT foo FROM bar";
@@ -363,7 +456,7 @@ fn parse_create_table_with_unquoted_hyphen() {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
             assert_eq!(
                 name,
-                ObjectName(vec![
+                ObjectName::from(vec![
                     "my-pro-ject".into(),
                     "mydataset".into(),
                     "mytable".into()
@@ -373,7 +466,6 @@ fn parse_create_table_with_unquoted_hyphen() {
                 vec![ColumnDef {
                     name: Ident::new("x"),
                     data_type: DataType::Int64,
-                    collation: None,
                     options: vec![]
                 },],
                 columns
@@ -399,19 +491,18 @@ fn parse_create_table_with_options() {
             columns,
             partition_by,
             cluster_by,
-            options,
+            table_options,
             ..
         }) => {
             assert_eq!(
                 name,
-                ObjectName(vec!["mydataset".into(), "newtable".into()])
+                ObjectName::from(vec!["mydataset".into(), "newtable".into()])
             );
             assert_eq!(
                 vec![
                     ColumnDef {
                         name: Ident::new("x"),
                         data_type: DataType::Int64,
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
@@ -421,9 +512,11 @@ fn parse_create_table_with_options() {
                                 name: None,
                                 option: ColumnOption::Options(vec![SqlOption::KeyValue {
                                     key: Ident::new("description"),
-                                    value: Expr::Value(Value::DoubleQuotedString(
-                                        "field x".to_string()
-                                    )),
+                                    value: Expr::Value(
+                                        Value::DoubleQuotedString("field x".to_string()).with_span(
+                                            Span::new(Location::new(1, 42), Location::new(1, 52))
+                                        )
+                                    ),
                                 },])
                             },
                         ]
@@ -431,14 +524,15 @@ fn parse_create_table_with_options() {
                     ColumnDef {
                         name: Ident::new("y"),
                         data_type: DataType::Bool,
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Options(vec![SqlOption::KeyValue {
                                 key: Ident::new("description"),
-                                value: Expr::Value(Value::DoubleQuotedString(
-                                    "field y".to_string()
-                                )),
+                                value: Expr::Value(
+                                    Value::DoubleQuotedString("field y".to_string()).with_span(
+                                        Span::new(Location::new(1, 42), Location::new(1, 52))
+                                    )
+                                ),
                             },])
                         }]
                     },
@@ -449,23 +543,32 @@ fn parse_create_table_with_options() {
                 (
                     Some(Box::new(Expr::Identifier(Ident::new("_PARTITIONDATE")))),
                     Some(WrappedCollection::NoWrapping(vec![
-                        Ident::new("userid"),
-                        Ident::new("age"),
+                        Expr::Identifier(Ident::new("userid")),
+                        Expr::Identifier(Ident::new("age")),
                     ])),
-                    Some(vec![
+                    CreateTableOptions::Options(vec![
                         SqlOption::KeyValue {
                             key: Ident::new("partition_expiration_days"),
-                            value: Expr::Value(number("1")),
+                            value: Expr::Value(
+                                number("1").with_span(Span::new(
+                                    Location::new(1, 42),
+                                    Location::new(1, 43)
+                                ))
+                            ),
                         },
                         SqlOption::KeyValue {
                             key: Ident::new("description"),
-                            value: Expr::Value(Value::DoubleQuotedString(
-                                "table option description".to_string()
-                            )),
+                            value: Expr::Value(
+                                Value::DoubleQuotedString("table option description".to_string())
+                                    .with_span(Span::new(
+                                        Location::new(1, 42),
+                                        Location::new(1, 52)
+                                    ))
+                            ),
                         },
                     ])
                 ),
-                (partition_by, cluster_by, options)
+                (partition_by, cluster_by, table_options)
             )
         }
         _ => unreachable!(),
@@ -480,6 +583,12 @@ fn parse_create_table_with_options() {
         r#"description = "table option description")"#
     );
     bigquery().verified_stmt(sql);
+
+    let sql = "CREATE TABLE foo (x INT64) OPTIONS()";
+    bigquery().verified_stmt(sql);
+
+    let sql = "CREATE TABLE db.schema.test (x INT64 OPTIONS(description = 'An optional INTEGER field')) OPTIONS()";
+    bigquery().verified_stmt(sql);
 }
 
 #[test]
@@ -487,7 +596,7 @@ fn parse_nested_data_types() {
     let sql = "CREATE TABLE table (x STRUCT<a ARRAY<INT64>, b BYTES(42)>, y ARRAY<STRUCT<INT64>>)";
     match bigquery_and_generic().one_statement_parses_to(sql, sql) {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
-            assert_eq!(name, ObjectName(vec!["table".into()]));
+            assert_eq!(name, ObjectName::from(vec!["table".into()]));
             assert_eq!(
                 columns,
                 vec![
@@ -499,16 +608,17 @@ fn parse_nested_data_types() {
                                     field_name: Some("a".into()),
                                     field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(
                                         Box::new(DataType::Int64,)
-                                    ))
+                                    )),
+                                    options: None,
                                 },
                                 StructField {
                                     field_name: Some("b".into()),
-                                    field_type: DataType::Bytes(Some(42))
+                                    field_type: DataType::Bytes(Some(42)),
+                                    options: None,
                                 },
                             ],
                             StructBracketKind::AngleBrackets
                         ),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
@@ -518,11 +628,11 @@ fn parse_nested_data_types() {
                                 vec![StructField {
                                     field_name: None,
                                     field_type: DataType::Int64,
+                                    options: None,
                                 }],
                                 StructBracketKind::AngleBrackets
                             ),
                         ))),
-                        collation: None,
                         options: vec![],
                     },
                 ]
@@ -532,56 +642,27 @@ fn parse_nested_data_types() {
     }
 }
 
-#[test]
-fn parse_invalid_brackets() {
-    let sql = "SELECT STRUCT<INT64>>(NULL)";
-    assert_eq!(
-        bigquery_and_generic()
-            .parse_sql_statements(sql)
-            .unwrap_err(),
-        ParserError::ParserError("unmatched > in STRUCT literal".to_string())
-    );
-
-    let sql = "SELECT STRUCT<STRUCT<INT64>>>(NULL)";
-    assert_eq!(
-        bigquery_and_generic()
-            .parse_sql_statements(sql)
-            .unwrap_err(),
-        ParserError::ParserError("Expected: (, found: >".to_string())
-    );
-
-    let sql = "CREATE TABLE table (x STRUCT<STRUCT<INT64>>>)";
-    assert_eq!(
-        bigquery_and_generic()
-            .parse_sql_statements(sql)
-            .unwrap_err(),
-        ParserError::ParserError(
-            "Expected: ',' or ')' after column definition, found: >".to_string()
-        )
-    );
-}
-
 #[test]
 fn parse_tuple_struct_literal() {
     // tuple syntax: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#tuple_syntax
     // syntax: (expr1, expr2 [, ... ])
-    let sql = "SELECT (1, 2, 3), (1, 1.0, '123', true)";
+    let sql = "SELECT (1, 2, 3), (1, 1.0, '123', true)"; // line 1, column 1
     let select = bigquery().verified_only_select(sql);
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Tuple(vec![
-            Expr::Value(number("1")),
-            Expr::Value(number("2")),
-            Expr::Value(number("3")),
+            Expr::value(number("1")),
+            Expr::value(number("2")),
+            Expr::value(number("3")),
         ]),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Tuple(vec![
-            Expr::Value(number("1")),
-            Expr::Value(number("1.0")),
-            Expr::Value(Value::SingleQuotedString("123".to_string())),
-            Expr::Value(Value::Boolean(true))
+            Expr::value(number("1")),
+            Expr::value(number("1.0")),
+            Expr::Value(Value::SingleQuotedString("123".into()).with_empty_span()),
+            Expr::Value(Value::Boolean(true).with_empty_span())
         ]),
         expr_from_projection(&select.projection[1])
     );
@@ -597,9 +678,9 @@ fn parse_typeless_struct_syntax() {
     assert_eq!(
         &Expr::Struct {
             values: vec![
-                Expr::Value(number("1")),
-                Expr::Value(number("2")),
-                Expr::Value(number("3")),
+                Expr::value(number("1")),
+                Expr::value(number("2")),
+                Expr::value(number("3")),
             ],
             fields: Default::default()
         },
@@ -608,30 +689,35 @@ fn parse_typeless_struct_syntax() {
 
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedString("abc".to_string())),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedString("abc".into()).with_empty_span()
+            )],
             fields: Default::default()
         },
         expr_from_projection(&select.projection[1])
     );
+
     assert_eq!(
         &Expr::Struct {
             values: vec![
-                Expr::Value(number("1")),
+                Expr::value(number("1")),
                 Expr::CompoundIdentifier(vec![Ident::from("t"), Ident::from("str_col")]),
             ],
             fields: Default::default()
         },
         expr_from_projection(&select.projection[2])
     );
+
     assert_eq!(
         &Expr::Struct {
             values: vec![
                 Expr::Named {
-                    expr: Expr::Value(number("1")).into(),
+                    expr: Expr::value(number("1")).into(),
                     name: Ident::from("a")
                 },
                 Expr::Named {
-                    expr: Expr::Value(Value::SingleQuotedString("abc".to_string())).into(),
+                    expr: Expr::Value(Value::SingleQuotedString("abc".into()).with_empty_span())
+                        .into(),
                     name: Ident::from("b")
                 },
             ],
@@ -639,6 +725,7 @@ fn parse_typeless_struct_syntax() {
         },
         expr_from_projection(&select.projection[3])
     );
+
     assert_eq!(
         &Expr::Struct {
             values: vec![Expr::Named {
@@ -661,10 +748,11 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(3, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5"))],
             fields: vec![StructField {
                 field_name: None,
                 field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
@@ -672,15 +760,17 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(
         &Expr::Struct {
             values: vec![
-                Expr::Value(number("1")),
+                Expr::value(number("1")),
                 Expr::CompoundIdentifier(vec![
                     Ident {
                         value: "t".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                     Ident {
                         value: "str_col".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                 ]),
             ],
@@ -689,15 +779,19 @@ fn parse_typed_struct_syntax_bigquery() {
                     field_name: Some(Ident {
                         value: "x".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 },
                 StructField {
                     field_name: Some(Ident {
                         value: "y".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    field_type: DataType::String(None)
+                    field_type: DataType::String(None),
+                    options: None,
                 },
             ]
         },
@@ -708,23 +802,27 @@ fn parse_typed_struct_syntax_bigquery() {
             values: vec![Expr::Identifier(Ident {
                 value: "nested_col".into(),
                 quote_style: None,
-            }),],
+                span: Span::empty(),
+            })],
             fields: vec![
                 StructField {
                     field_name: Some("arr".into()),
                     field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
                         DataType::Float64
-                    )))
+                    ))),
+                    options: None,
                 },
                 StructField {
                     field_name: Some("str".into()),
                     field_type: DataType::Struct(
                         vec![StructField {
                             field_name: None,
-                            field_type: DataType::Bool
+                            field_type: DataType::Bool,
+                            options: None,
                         }],
                         StructBracketKind::AngleBrackets
-                    )
+                    ),
+                    options: None,
                 },
             ]
         },
@@ -739,20 +837,23 @@ fn parse_typed_struct_syntax_bigquery() {
             values: vec![Expr::Identifier(Ident {
                 value: "nested_col".into(),
                 quote_style: None,
-            }),],
+                span: Span::empty(),
+            })],
             fields: vec![
                 StructField {
                     field_name: Some("x".into()),
                     field_type: DataType::Struct(
                         Default::default(),
                         StructBracketKind::AngleBrackets
-                    )
+                    ),
+                    options: None,
                 },
                 StructField {
                     field_name: Some("y".into()),
                     field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
                         DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
-                    )))
+                    ))),
+                    options: None,
                 },
             ]
         },
@@ -764,22 +865,24 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::Boolean(true)),],
+            values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Bool
+                field_type: DataType::Bool,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedByteStringLiteral(
-                "abc".into()
-            )),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedByteStringLiteral("abc".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Bytes(Some(42))
+                field_type: DataType::Bytes(Some(42)),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -790,45 +893,53 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(4, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::DoubleQuotedString(
-                "2011-05-05".to_string()
-            )),],
+            values: vec![Expr::Value(
+                Value::DoubleQuotedString("2011-05-05".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Date
+                field_type: DataType::Date,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Datetime(None),
-                value: "1999-01-01 01:23:34.45".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1999-01-01 01:23:34.45".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Datetime(None)
+                field_type: DataType::Datetime(None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5.0")),],
+            values: vec![Expr::value(number("5.0"))],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Float64
+                field_type: DataType::Float64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[2])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("1")),],
+            values: vec![Expr::value(number("1"))],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Int64
+                field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[3])
@@ -840,28 +951,41 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(
         &Expr::Struct {
             values: vec![Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString("2".to_string()))),
+                value: Box::new(Expr::Value(
+                    Value::SingleQuotedString("2".into()).with_empty_span()
+                )),
                 leading_field: Some(DateTimeField::Hour),
                 leading_precision: None,
                 last_field: None,
                 fractional_seconds_precision: None
-            }),],
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Interval
+                field_type: DataType::Interval {
+                    fields: None,
+                    precision: None
+                },
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::JSON,
-                value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString(
+                        r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.into()
+                    ),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::JSON
+                field_type: DataType::JSON,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -872,23 +996,33 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(3, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::DoubleQuotedString("foo".to_string())),],
+            values: vec![Expr::Value(
+                Value::DoubleQuotedString("foo".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::String(Some(42))
+                field_type: DataType::String(Some(42)),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Timestamp(None, TimezoneInfo::None),
-                value: "2008-12-25 15:30:00 America/Los_Angeles".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString(
+                        "2008-12-25 15:30:00 America/Los_Angeles".into()
+                    ),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Timestamp(None, TimezoneInfo::None)
+                field_type: DataType::Timestamp(None, TimezoneInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -896,13 +1030,18 @@ fn parse_typed_struct_syntax_bigquery() {
 
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Time(None, TimezoneInfo::None),
-                value: "15:30:00".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("15:30:00".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Time(None, TimezoneInfo::None)
+                field_type: DataType::Time(None, TimezoneInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[2])
@@ -913,26 +1052,36 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Numeric(ExactNumberInfo::None),
-                value: "1".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Numeric(ExactNumberInfo::None)
+                field_type: DataType::Numeric(ExactNumberInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::BigNumeric(ExactNumberInfo::None),
-                value: "1".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::BigNumeric(ExactNumberInfo::None)
+                field_type: DataType::BigNumeric(ExactNumberInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -944,15 +1093,17 @@ fn parse_typed_struct_syntax_bigquery() {
     assert_eq!(1, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("1")), Expr::Value(number("2")),],
+            values: vec![Expr::value(number("1")), Expr::value(number("2")),],
             fields: vec![
                 StructField {
                     field_name: Some("key".into()),
                     field_type: DataType::Int64,
+                    options: None,
                 },
                 StructField {
                     field_name: Some("value".into()),
                     field_type: DataType::Int64,
+                    options: None,
                 },
             ]
         },
@@ -970,10 +1121,11 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(3, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5"))],
             fields: vec![StructField {
                 field_name: None,
                 field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
@@ -981,15 +1133,17 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(
         &Expr::Struct {
             values: vec![
-                Expr::Value(number("1")),
+                Expr::value(number("1")),
                 Expr::CompoundIdentifier(vec![
                     Ident {
                         value: "t".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                     Ident {
                         value: "str_col".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                 ]),
             ],
@@ -998,47 +1152,24 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
                     field_name: Some(Ident {
                         value: "x".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 },
                 StructField {
                     field_name: Some(Ident {
                         value: "y".into(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    field_type: DataType::String(None)
+                    field_type: DataType::String(None),
+                    options: None,
                 },
             ]
         },
         expr_from_projection(&select.projection[1])
     );
-    assert_eq!(
-        &Expr::Struct {
-            values: vec![Expr::Identifier(Ident {
-                value: "nested_col".into(),
-                quote_style: None,
-            }),],
-            fields: vec![
-                StructField {
-                    field_name: Some("arr".into()),
-                    field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
-                        DataType::Float64
-                    )))
-                },
-                StructField {
-                    field_name: Some("str".into()),
-                    field_type: DataType::Struct(
-                        vec![StructField {
-                            field_name: None,
-                            field_type: DataType::Bool
-                        }],
-                        StructBracketKind::AngleBrackets
-                    )
-                },
-            ]
-        },
-        expr_from_projection(&select.projection[2])
-    );
 
     let sql = r#"SELECT STRUCT<x STRUCT, y ARRAY<STRUCT>>(nested_col)"#;
     let select = bigquery_and_generic().verified_only_select(sql);
@@ -1048,20 +1179,23 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
             values: vec![Expr::Identifier(Ident {
                 value: "nested_col".into(),
                 quote_style: None,
-            }),],
+                span: Span::empty(),
+            })],
             fields: vec![
                 StructField {
                     field_name: Some("x".into()),
                     field_type: DataType::Struct(
                         Default::default(),
                         StructBracketKind::AngleBrackets
-                    )
+                    ),
+                    options: None,
                 },
                 StructField {
                     field_name: Some("y".into()),
                     field_type: DataType::Array(ArrayElemTypeDef::AngleBracket(Box::new(
                         DataType::Struct(Default::default(), StructBracketKind::AngleBrackets)
-                    )))
+                    ))),
+                    options: None,
                 },
             ]
         },
@@ -1073,22 +1207,24 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::Boolean(true)),],
+            values: vec![Expr::Value(Value::Boolean(true).with_empty_span())],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Bool
+                field_type: DataType::Bool,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedByteStringLiteral(
-                "abc".into()
-            )),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedByteStringLiteral("abc".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Bytes(Some(42))
+                field_type: DataType::Bytes(Some(42)),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -1099,45 +1235,53 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(4, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedString(
-                "2011-05-05".to_string()
-            )),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedString("2011-05-05".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Date
+                field_type: DataType::Date,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Datetime(None),
-                value: "1999-01-01 01:23:34.45".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1999-01-01 01:23:34.45".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Datetime(None)
+                field_type: DataType::Datetime(None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5.0")),],
+            values: vec![Expr::value(number("5.0"))],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Float64
+                field_type: DataType::Float64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[2])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("1")),],
+            values: vec![Expr::value(number("1"))],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Int64
+                field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[3])
@@ -1149,28 +1293,41 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(
         &Expr::Struct {
             values: vec![Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString("1".to_string()))),
+                value: Box::new(Expr::Value(
+                    Value::SingleQuotedString("1".into()).with_empty_span()
+                )),
                 leading_field: Some(DateTimeField::Month),
                 leading_precision: None,
                 last_field: None,
                 fractional_seconds_precision: None
-            }),],
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Interval
+                field_type: DataType::Interval {
+                    fields: None,
+                    precision: None
+                },
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::JSON,
-                value: r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString(
+                        r#"{"class" : {"students" : [{"name" : "Jane"}]}}"#.into()
+                    ),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::JSON
+                field_type: DataType::JSON,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -1181,23 +1338,33 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(3, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedString("foo".to_string())),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedString("foo".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::String(Some(42))
+                field_type: DataType::String(Some(42)),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Timestamp(None, TimezoneInfo::None),
-                value: "2008-12-25 15:30:00 America/Los_Angeles".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString(
+                        "2008-12-25 15:30:00 America/Los_Angeles".into()
+                    ),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Timestamp(None, TimezoneInfo::None)
+                field_type: DataType::Timestamp(None, TimezoneInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -1205,13 +1372,18 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
 
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Time(None, TimezoneInfo::None),
-                value: "15:30:00".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("15:30:00".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Time(None, TimezoneInfo::None)
+                field_type: DataType::Time(None, TimezoneInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[2])
@@ -1222,26 +1394,36 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::Numeric(ExactNumberInfo::None),
-                value: "1".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::Numeric(ExactNumberInfo::None)
+                field_type: DataType::Numeric(ExactNumberInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::TypedString {
+            values: vec![Expr::TypedString(TypedString {
                 data_type: DataType::BigNumeric(ExactNumberInfo::None),
-                value: "1".to_string()
-            },],
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("1".into()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false
+            })],
             fields: vec![StructField {
                 field_name: None,
-                field_type: DataType::BigNumeric(ExactNumberInfo::None)
+                field_type: DataType::BigNumeric(ExactNumberInfo::None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
@@ -1250,44 +1432,50 @@ fn parse_typed_struct_syntax_bigquery_and_generic() {
 
 #[test]
 fn parse_typed_struct_with_field_name_bigquery() {
-    let sql = r#"SELECT STRUCT<x INT64>(5), STRUCT<y STRING>("foo")"#;
+    let sql = r#"SELECT STRUCT<x INT64>(5), STRUCT<y STRING>("foo")"#; // line 1, column 1
     let select = bigquery().verified_only_select(sql);
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5"))],
             fields: vec![StructField {
                 field_name: Some(Ident::from("x")),
-                field_type: DataType::Int64
+                field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::DoubleQuotedString("foo".to_string())),],
+            values: vec![Expr::Value(
+                Value::DoubleQuotedString("foo".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: Some(Ident::from("y")),
-                field_type: DataType::String(None)
+                field_type: DataType::String(None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
     );
 
-    let sql = r#"SELECT STRUCT<x INT64, y INT64>(5, 5)"#;
+    let sql = r#"SELECT STRUCT<x INT64, y INT64>(5, 5)"#; // line 1, column 1
     let select = bigquery().verified_only_select(sql);
     assert_eq!(1, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")), Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5")), Expr::value(number("5")),],
             fields: vec![
                 StructField {
                     field_name: Some(Ident::from("x")),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 },
                 StructField {
                     field_name: Some(Ident::from("y")),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 }
             ]
         },
@@ -1297,44 +1485,50 @@ fn parse_typed_struct_with_field_name_bigquery() {
 
 #[test]
 fn parse_typed_struct_with_field_name_bigquery_and_generic() {
-    let sql = r#"SELECT STRUCT<x INT64>(5), STRUCT<y STRING>('foo')"#;
+    let sql = r#"SELECT STRUCT<x INT64>(5), STRUCT<y STRING>('foo')"#; // line 1, column 1
     let select = bigquery().verified_only_select(sql);
     assert_eq!(2, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5"))],
             fields: vec![StructField {
                 field_name: Some(Ident::from("x")),
-                field_type: DataType::Int64
+                field_type: DataType::Int64,
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(Value::SingleQuotedString("foo".to_string())),],
+            values: vec![Expr::Value(
+                Value::SingleQuotedString("foo".into()).with_empty_span()
+            )],
             fields: vec![StructField {
                 field_name: Some(Ident::from("y")),
-                field_type: DataType::String(None)
+                field_type: DataType::String(None),
+                options: None,
             }]
         },
         expr_from_projection(&select.projection[1])
     );
 
-    let sql = r#"SELECT STRUCT<x INT64, y INT64>(5, 5)"#;
+    let sql = r#"SELECT STRUCT<x INT64, y INT64>(5, 5)"#; // line 1, column 1
     let select = bigquery_and_generic().verified_only_select(sql);
     assert_eq!(1, select.projection.len());
     assert_eq!(
         &Expr::Struct {
-            values: vec![Expr::Value(number("5")), Expr::Value(number("5")),],
+            values: vec![Expr::value(number("5")), Expr::value(number("5")),],
             fields: vec![
                 StructField {
                     field_name: Some(Ident::from("x")),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 },
                 StructField {
                     field_name: Some(Ident::from("y")),
-                    field_type: DataType::Int64
+                    field_type: DataType::Int64,
+                    options: None,
                 }
             ]
         },
@@ -1365,15 +1559,7 @@ fn parse_table_identifiers() {
         assert_eq!(
             select.from,
             vec![TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(expected),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(expected)),
                 joins: vec![]
             },]
         );
@@ -1507,6 +1693,20 @@ fn parse_hyphenated_table_identifiers() {
         "SELECT * FROM foo-bar AS f JOIN baz-qux AS b ON f.id = b.id",
     );
 
+    assert_eq!(
+        bigquery()
+            .verified_only_select_with_canonical(
+                "select * from foo-123.bar",
+                "SELECT * FROM foo-123.bar"
+            )
+            .from[0]
+            .relation,
+        table_from_name(ObjectName::from(vec![
+            Ident::new("foo-123"),
+            Ident::new("bar")
+        ])),
+    );
+
     assert_eq!(
         bigquery()
             .verified_only_select_with_canonical(
@@ -1523,29 +1723,29 @@ fn parse_hyphenated_table_identifiers() {
             ]))
         })
     );
-
-    let error_sql = "select foo-bar.* from foo-bar";
-    assert!(bigquery().parse_sql_statements(error_sql).is_err());
 }
 
 #[test]
 fn parse_table_time_travel() {
     let version = "2023-08-18 23:08:18".to_string();
-    let sql = format!("SELECT 1 FROM t1 FOR SYSTEM_TIME AS OF '{version}'");
+    let sql = format!("SELECT 1 FROM t1 FOR SYSTEM_TIME AS OF '{version}'"); // line 1, column 1
     let select = bigquery().verified_only_select(&sql);
     assert_eq!(
         select.from,
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("t1")]),
+                name: ObjectName::from(vec![Ident::new("t1")]),
                 alias: None,
                 args: None,
                 with_hints: vec![],
                 version: Some(TableVersion::ForSystemTimeAsOf(Expr::Value(
-                    Value::SingleQuotedString(version)
+                    Value::SingleQuotedString(version).with_empty_span()
                 ))),
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             joins: vec![]
         },]
@@ -1576,7 +1776,7 @@ fn parse_join_constraint_unnest_alias() {
                 with_ordinality: false,
             },
             global: false,
-            join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+            join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
                 left: Box::new(Expr::Identifier("c1".into())),
                 op: BinaryOperator::Eq,
                 right: Box::new(Expr::Identifier("c2".into())),
@@ -1608,21 +1808,22 @@ fn parse_merge() {
         columns: vec![Ident::new("product"), Ident::new("quantity")],
         kind: MergeInsertKind::Values(Values {
             explicit_row: false,
-            rows: vec![vec![Expr::Value(number("1")), Expr::Value(number("2"))]],
+            rows: vec![vec![Expr::value(number("1")), Expr::value(number("2"))]],
         }),
     });
     let update_action = MergeAction::Update {
         assignments: vec![
             Assignment {
-                target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new("a")])),
-                value: Expr::Value(number("1")),
+                target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new("a")])),
+                value: Expr::value(number("1")),
             },
             Assignment {
-                target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new("b")])),
-                value: Expr::Value(number("2")),
+                target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new("b")])),
+                value: Expr::value(number("2")),
             },
         ],
     };
+
     match bigquery_and_generic().verified_stmt(sql) {
         Statement::Merge {
             into,
@@ -1630,11 +1831,12 @@ fn parse_merge() {
             source,
             on,
             clauses,
+            ..
         } => {
             assert!(!into);
             assert_eq!(
                 TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("inventory")]),
+                    name: ObjectName::from(vec![Ident::new("inventory")]),
                     alias: Some(TableAlias {
                         name: Ident::new("T"),
                         columns: vec![],
@@ -1644,12 +1846,15 @@ fn parse_merge() {
                     version: Default::default(),
                     partitions: Default::default(),
                     with_ordinality: false,
+                    json_path: None,
+                    sample: None,
+                    index_hints: vec![],
                 },
                 table
             );
             assert_eq!(
                 TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("newArrivals")]),
+                    name: ObjectName::from(vec![Ident::new("newArrivals")]),
                     alias: Some(TableAlias {
                         name: Ident::new("S"),
                         columns: vec![],
@@ -1659,20 +1864,23 @@ fn parse_merge() {
                     version: Default::default(),
                     partitions: Default::default(),
                     with_ordinality: false,
+                    json_path: None,
+                    sample: None,
+                    index_hints: vec![],
                 },
                 source
             );
-            assert_eq!(Expr::Value(Value::Boolean(false)), *on);
+            assert_eq!(Expr::Value(Value::Boolean(false).with_empty_span()), *on);
             assert_eq!(
                 vec![
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatched,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: insert_action.clone(),
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatchedByTarget,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: insert_action.clone(),
                     },
                     MergeClause {
@@ -1682,7 +1890,7 @@ fn parse_merge() {
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatchedBySource,
-                        predicate: Some(Expr::Value(number("2"))),
+                        predicate: Some(Expr::value(number("2"))),
                         action: MergeAction::Delete
                     },
                     MergeClause {
@@ -1692,12 +1900,12 @@ fn parse_merge() {
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatchedBySource,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: update_action.clone(),
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatched,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: MergeAction::Insert(MergeInsertExpr {
                             columns: vec![Ident::new("product"), Ident::new("quantity"),],
                             kind: MergeInsertKind::Row,
@@ -1713,7 +1921,7 @@ fn parse_merge() {
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::NotMatched,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: MergeAction::Insert(MergeInsertExpr {
                             columns: vec![],
                             kind: MergeInsertKind::Row
@@ -1729,7 +1937,7 @@ fn parse_merge() {
                     },
                     MergeClause {
                         clause_kind: MergeClauseKind::Matched,
-                        predicate: Some(Expr::Value(number("1"))),
+                        predicate: Some(Expr::value(number("1"))),
                         action: MergeAction::Delete,
                     },
                     MergeClause {
@@ -1745,7 +1953,7 @@ fn parse_merge() {
                             kind: MergeInsertKind::Values(Values {
                                 explicit_row: false,
                                 rows: vec![vec![
-                                    Expr::Value(number("1")),
+                                    Expr::value(number("1")),
                                     Expr::Identifier(Ident::new("DEFAULT")),
                                 ]]
                             })
@@ -1759,7 +1967,7 @@ fn parse_merge() {
                             kind: MergeInsertKind::Values(Values {
                                 explicit_row: false,
                                 rows: vec![vec![
-                                    Expr::Value(number("1")),
+                                    Expr::value(number("1")),
                                     Expr::Identifier(Ident::new("DEFAULT")),
                                 ]]
                             })
@@ -1875,7 +2083,7 @@ fn parse_array_agg_func() {
 fn parse_big_query_declare() {
     for (sql, expected_names, expected_data_type, expected_assigned_expr) in [
         (
-            "DECLARE x INT64",
+            "DECLARE x INT64", // line 1, column 1
             vec![Ident::new("x")],
             Some(DataType::Int64),
             None,
@@ -1884,25 +2092,25 @@ fn parse_big_query_declare() {
             "DECLARE x INT64 DEFAULT 42",
             vec![Ident::new("x")],
             Some(DataType::Int64),
-            Some(DeclareAssignment::Default(Box::new(Expr::Value(number(
-                "42",
-            ))))),
+            Some(DeclareAssignment::Default(Box::new(Expr::Value(
+                number("42").with_empty_span(),
+            )))),
         ),
         (
             "DECLARE x, y, z INT64 DEFAULT 42",
             vec![Ident::new("x"), Ident::new("y"), Ident::new("z")],
             Some(DataType::Int64),
-            Some(DeclareAssignment::Default(Box::new(Expr::Value(number(
-                "42",
-            ))))),
+            Some(DeclareAssignment::Default(Box::new(Expr::Value(
+                number("42").with_empty_span(),
+            )))),
         ),
         (
             "DECLARE x DEFAULT 42",
             vec![Ident::new("x")],
             None,
-            Some(DeclareAssignment::Default(Box::new(Expr::Value(number(
-                "42",
-            ))))),
+            Some(DeclareAssignment::Default(Box::new(Expr::Value(
+                number("42").with_empty_span(),
+            )))),
         ),
     ] {
         match bigquery().verified_stmt(sql) {
@@ -1951,27 +2159,47 @@ fn parse_map_access_expr() {
     let sql = "users[-1][safe_offset(2)].a.b";
     let expr = bigquery().verified_expr(sql);
 
-    fn map_access_key(key: Expr, syntax: MapAccessSyntax) -> MapAccessKey {
-        MapAccessKey { key, syntax }
-    }
-    let expected = Expr::MapAccess {
-        column: Expr::Identifier(Ident::new("users")).into(),
-        keys: vec![
-            map_access_key(
-                Expr::UnaryOp {
+    let expected = Expr::CompoundFieldAccess {
+        root: Box::new(Expr::Identifier(Ident::with_span(
+            Span::new(Location::of(1, 1), Location::of(1, 6)),
+            "users",
+        ))),
+        access_chain: vec![
+            AccessExpr::Subscript(Subscript::Index {
+                index: Expr::UnaryOp {
                     op: UnaryOperator::Minus,
-                    expr: Expr::Value(number("1")).into(),
+                    expr: Expr::value(number("1")).into(),
                 },
-                MapAccessSyntax::Bracket,
-            ),
-            map_access_key(
-                call("safe_offset", [Expr::Value(number("2"))]),
-                MapAccessSyntax::Bracket,
-            ),
-            map_access_key(
-                Expr::CompoundIdentifier(vec![Ident::new("a"), Ident::new("b")]),
-                MapAccessSyntax::Period,
-            ),
+            }),
+            AccessExpr::Subscript(Subscript::Index {
+                index: Expr::Function(Function {
+                    name: ObjectName::from(vec![Ident::with_span(
+                        Span::new(Location::of(1, 11), Location::of(1, 22)),
+                        "safe_offset",
+                    )]),
+                    parameters: FunctionArguments::None,
+                    args: FunctionArguments::List(FunctionArgumentList {
+                        duplicate_treatment: None,
+                        args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            number("2").with_empty_span(),
+                        )))],
+                        clauses: vec![],
+                    }),
+                    filter: None,
+                    null_treatment: None,
+                    over: None,
+                    within_group: vec![],
+                    uses_odbc_syntax: false,
+                }),
+            }),
+            AccessExpr::Dot(Expr::Identifier(Ident::with_span(
+                Span::new(Location::of(1, 24), Location::of(1, 25)),
+                "a",
+            ))),
+            AccessExpr::Dot(Expr::Identifier(Ident::with_span(
+                Span::new(Location::of(1, 26), Location::of(1, 27)),
+                "b",
+            ))),
         ],
     };
     assert_eq!(expr, expected);
@@ -1993,23 +2221,24 @@ fn test_bigquery_create_function() {
     let stmt = bigquery().verified_stmt(sql);
     assert_eq!(
         stmt,
-        Statement::CreateFunction {
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace: true,
             temporary: true,
             if_not_exists: false,
-            name: ObjectName(vec![
+            name: ObjectName::from(vec![
                 Ident::new("project1"),
                 Ident::new("mydataset"),
                 Ident::new("myfunction"),
             ]),
             args: Some(vec![OperateFunctionArg::with_name("x", DataType::Float64),]),
             return_type: Some(DataType::Float64),
-            function_body: Some(CreateFunctionBody::AsAfterOptions(Expr::Value(number(
-                "42"
-            )))),
+            function_body: Some(CreateFunctionBody::AsAfterOptions(Expr::Value(
+                number("42").with_empty_span()
+            ))),
             options: Some(vec![SqlOption::KeyValue {
                 key: Ident::new("x"),
-                value: Expr::Value(Value::SingleQuotedString("y".into())),
+                value: Expr::Value(Value::SingleQuotedString("y".into()).with_empty_span()),
             }]),
             behavior: None,
             using: None,
@@ -2018,7 +2247,7 @@ fn test_bigquery_create_function() {
             remote_connection: None,
             called_on_null: None,
             parallel: None,
-        }
+        })
     );
 
     let sqls = [
@@ -2128,10 +2357,14 @@ fn test_bigquery_trim() {
     let select = bigquery().verified_only_select(sql_only_select);
     assert_eq!(
         &Expr::Trim {
-            expr: Box::new(Expr::Value(Value::SingleQuotedString("xyz".to_owned()))),
+            expr: Box::new(Expr::Value(
+                Value::SingleQuotedString("xyz".to_owned()).with_empty_span()
+            )),
             trim_where: None,
             trim_what: None,
-            trim_characters: Some(vec![Expr::Value(Value::SingleQuotedString("a".to_owned()))]),
+            trim_characters: Some(vec![Expr::Value(
+                Value::SingleQuotedString("a".to_owned()).with_empty_span()
+            )]),
         },
         expr_from_projection(only(&select.projection))
     );
@@ -2158,22 +2391,78 @@ fn parse_extract_weekday() {
     );
 }
 
+#[test]
+fn bigquery_select_expr_star() {
+    bigquery()
+        .verified_only_select("SELECT STRUCT<STRING>((SELECT foo FROM T WHERE true)).* FROM T");
+    bigquery().verified_only_select("SELECT [STRUCT<STRING>('foo')][0].* EXCEPT (foo) FROM T");
+    bigquery().verified_only_select("SELECT myfunc()[0].* FROM T");
+}
+
 #[test]
 fn test_select_as_struct() {
-    bigquery().verified_only_select("SELECT * FROM (SELECT AS VALUE STRUCT(123 AS a, false AS b))");
+    for (sql, parse_to) in [
+        (
+            "SELECT * FROM (SELECT AS STRUCT STRUCT(123 AS a, false AS b))",
+            "SELECT * FROM (SELECT AS STRUCT STRUCT(123 AS a, false AS b))",
+        ),
+        (
+            "SELECT * FROM (SELECT DISTINCT AS STRUCT STRUCT(123 AS a, false AS b))",
+            "SELECT * FROM (SELECT DISTINCT AS STRUCT STRUCT(123 AS a, false AS b))",
+        ),
+        (
+            "SELECT * FROM (SELECT ALL AS STRUCT STRUCT(123 AS a, false AS b))",
+            "SELECT * FROM (SELECT AS STRUCT STRUCT(123 AS a, false AS b))",
+        ),
+    ] {
+        bigquery().one_statement_parses_to(sql, parse_to);
+    }
+
     let select = bigquery().verified_only_select("SELECT AS STRUCT 1 AS a, 2 AS b");
     assert_eq!(Some(ValueTableMode::AsStruct), select.value_table_mode);
 }
 
 #[test]
 fn test_select_as_value() {
-    bigquery().verified_only_select(
-        "SELECT * FROM (SELECT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
-    );
+    for (sql, parse_to) in [
+        (
+            "SELECT * FROM (SELECT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+            "SELECT * FROM (SELECT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+        ),
+        (
+            "SELECT * FROM (SELECT DISTINCT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+            "SELECT * FROM (SELECT DISTINCT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+        ),
+        (
+            "SELECT * FROM (SELECT ALL AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+            "SELECT * FROM (SELECT AS VALUE STRUCT(5 AS star_rating, false AS up_down_rating))",
+        ),
+    ] {
+        bigquery().one_statement_parses_to(sql, parse_to);
+    }
+
     let select = bigquery().verified_only_select("SELECT AS VALUE STRUCT(1 AS a, 2 AS b) AS xyz");
     assert_eq!(Some(ValueTableMode::AsValue), select.value_table_mode);
 }
 
+#[test]
+fn test_triple_quote_typed_strings() {
+    bigquery().verified_expr(r#"JSON '''{"foo":"bar's"}'''"#);
+
+    let expr = bigquery().verified_expr(r#"JSON """{"foo":"bar's"}""""#);
+    assert_eq!(
+        Expr::TypedString(TypedString {
+            data_type: DataType::JSON,
+            value: ValueWithSpan {
+                value: Value::TripleDoubleQuotedString(r#"{"foo":"bar's"}"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
+        expr
+    );
+}
+
 #[test]
 fn test_array_agg() {
     bigquery_and_generic().verified_expr("ARRAY_AGG(state)");
@@ -2194,3 +2483,345 @@ fn test_any_value() {
     bigquery_and_generic().verified_expr("ANY_VALUE(fruit HAVING MAX sold)");
     bigquery_and_generic().verified_expr("ANY_VALUE(fruit HAVING MIN sold)");
 }
+
+#[test]
+fn test_any_type() {
+    bigquery().verified_stmt(concat!(
+        "CREATE OR REPLACE TEMPORARY FUNCTION ",
+        "my_function(param1 ANY TYPE) ",
+        "AS (",
+        "(SELECT 1)",
+        ")",
+    ));
+}
+
+#[test]
+fn test_any_type_dont_break_custom_type() {
+    bigquery_and_generic().verified_stmt("CREATE TABLE foo (x ANY)");
+}
+
+#[test]
+fn test_struct_field_options() {
+    bigquery().verified_stmt(concat!(
+        "CREATE TABLE my_table (",
+        "f0 STRUCT<a STRING, b INT64>, ",
+        "f1 STRUCT<",
+        "a STRING OPTIONS(description = 'This is a string', type = 'string'), ",
+        "b INT64",
+        "> OPTIONS(description = 'This is a struct field')",
+        ")",
+    ));
+}
+
+#[test]
+fn test_struct_trailing_and_nested_bracket() {
+    bigquery().verified_stmt(concat!(
+        "CREATE TABLE my_table (",
+        "f0 STRING, ",
+        "f1 STRUCT<a STRING, b STRUCT<c INT64, d STRING>>, ",
+        "f2 STRING",
+        ")",
+    ));
+
+    // More complex nested structs
+    bigquery().verified_stmt(concat!(
+        "CREATE TABLE my_table (",
+        "f0 STRING, ",
+        "f1 STRUCT<a STRING, b STRUCT<c INT64, d STRUCT<e STRING>>>, ",
+        "f2 STRUCT<h STRING, i STRUCT<j INT64, k STRUCT<l STRUCT<m STRING>>>>, ",
+        "f3 STRUCT<e STRING, f STRUCT<c INT64>>",
+        ")",
+    ));
+
+    // Bad case with missing closing bracket
+    assert_eq!(
+        ParserError::ParserError("Expected: >, found: )".to_owned()),
+        bigquery()
+            .parse_sql_statements("CREATE TABLE my_table(f1 STRUCT<a STRING, b INT64)")
+            .unwrap_err()
+    );
+
+    // Bad case with redundant closing bracket
+    assert_eq!(
+        ParserError::ParserError(
+            "unmatched > after parsing data type STRUCT<a STRING, b INT64>)".to_owned()
+        ),
+        bigquery()
+            .parse_sql_statements("CREATE TABLE my_table(f1 STRUCT<a STRING, b INT64>>)")
+            .unwrap_err()
+    );
+
+    // Base case with redundant closing bracket in nested struct
+    assert_eq!(
+        ParserError::ParserError(
+            "Expected: ',' or ')' after column definition, found: >".to_owned()
+        ),
+        bigquery()
+            .parse_sql_statements("CREATE TABLE my_table(f1 STRUCT<a STRUCT<b INT>>>, c INT64)")
+            .unwrap_err()
+    );
+
+    let sql = "SELECT STRUCT<INT64>>(NULL)";
+    assert_eq!(
+        bigquery_and_generic()
+            .parse_sql_statements(sql)
+            .unwrap_err(),
+        ParserError::ParserError("unmatched > in STRUCT literal".to_string())
+    );
+
+    let sql = "SELECT STRUCT<STRUCT<INT64>>>(NULL)";
+    assert_eq!(
+        bigquery_and_generic()
+            .parse_sql_statements(sql)
+            .unwrap_err(),
+        ParserError::ParserError("Expected: (, found: >".to_string())
+    );
+
+    let sql = "CREATE TABLE table (x STRUCT<STRUCT<INT64>>>)";
+    assert_eq!(
+        bigquery_and_generic()
+            .parse_sql_statements(sql)
+            .unwrap_err(),
+        ParserError::ParserError(
+            "Expected: ',' or ')' after column definition, found: >".to_string()
+        )
+    );
+}
+
+#[test]
+fn test_export_data() {
+    let stmt = bigquery().verified_stmt(concat!(
+        "EXPORT DATA OPTIONS(",
+        "uri = 'gs://bucket/folder/*', ",
+        "format = 'PARQUET', ",
+        "overwrite = true",
+        ") AS ",
+        "SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 LIMIT 10",
+    ));
+    assert_eq!(
+        stmt,
+        Statement::ExportData(ExportData {
+            options: vec![
+                SqlOption::KeyValue {
+                    key: Ident::new("uri"),
+                    value: Expr::Value(
+                        Value::SingleQuotedString("gs://bucket/folder/*".to_owned())
+                            .with_empty_span()
+                    ),
+                },
+                SqlOption::KeyValue {
+                    key: Ident::new("format"),
+                    value: Expr::Value(
+                        Value::SingleQuotedString("PARQUET".to_owned()).with_empty_span()
+                    ),
+                },
+                SqlOption::KeyValue {
+                    key: Ident::new("overwrite"),
+                    value: Expr::Value(Value::Boolean(true).with_empty_span()),
+                },
+            ],
+            connection: None,
+            query: Box::new(Query {
+                with: None,
+                body: Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken(TokenWithSpan::new(
+                        Token::Word(Word {
+                            value: "SELECT".to_string(),
+                            quote_style: None,
+                            keyword: Keyword::SELECT,
+                        }),
+                        Span::empty()
+                    )),
+                    distinct: None,
+                    top: None,
+                    top_before_distinct: false,
+                    projection: vec![
+                        SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("field1"))),
+                        SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("field2"))),
+                    ],
+                    exclude: None,
+                    into: None,
+                    from: vec![TableWithJoins {
+                        relation: table_from_name(ObjectName::from(vec![
+                            Ident::new("mydataset"),
+                            Ident::new("table1")
+                        ])),
+                        joins: vec![],
+                    }],
+                    lateral_views: vec![],
+                    prewhere: None,
+                    selection: None,
+                    group_by: GroupByExpr::Expressions(vec![], vec![]),
+                    cluster_by: vec![],
+                    distribute_by: vec![],
+                    sort_by: vec![],
+                    having: None,
+                    named_window: vec![],
+                    qualify: None,
+                    window_before_qualify: false,
+                    value_table_mode: None,
+                    connect_by: None,
+                    flavor: SelectFlavor::Standard,
+                }))),
+                order_by: Some(OrderBy {
+                    kind: OrderByKind::Expressions(vec![OrderByExpr {
+                        expr: Expr::Identifier(Ident::new("field1")),
+                        options: OrderByOptions {
+                            asc: None,
+                            nulls_first: None,
+                        },
+                        with_fill: None,
+                    },]),
+                    interpolate: None,
+                }),
+                limit_clause: Some(LimitClause::LimitOffset {
+                    limit: Some(Expr::Value(number("10").with_empty_span())),
+                    offset: None,
+                    limit_by: vec![],
+                }),
+                fetch: None,
+                locks: vec![],
+                for_clause: None,
+                settings: None,
+                format_clause: None,
+                pipe_operators: vec![],
+            })
+        })
+    );
+
+    let stmt = bigquery().verified_stmt(concat!(
+        "EXPORT DATA WITH CONNECTION myconnection.myproject.us OPTIONS(",
+        "uri = 'gs://bucket/folder/*', ",
+        "format = 'PARQUET', ",
+        "overwrite = true",
+        ") AS ",
+        "SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 LIMIT 10",
+    ));
+
+    assert_eq!(
+        stmt,
+        Statement::ExportData(ExportData {
+            options: vec![
+                SqlOption::KeyValue {
+                    key: Ident::new("uri"),
+                    value: Expr::Value(
+                        Value::SingleQuotedString("gs://bucket/folder/*".to_owned())
+                            .with_empty_span()
+                    ),
+                },
+                SqlOption::KeyValue {
+                    key: Ident::new("format"),
+                    value: Expr::Value(
+                        Value::SingleQuotedString("PARQUET".to_owned()).with_empty_span()
+                    ),
+                },
+                SqlOption::KeyValue {
+                    key: Ident::new("overwrite"),
+                    value: Expr::Value(Value::Boolean(true).with_empty_span()),
+                },
+            ],
+            connection: Some(ObjectName::from(vec![
+                Ident::new("myconnection"),
+                Ident::new("myproject"),
+                Ident::new("us")
+            ])),
+            query: Box::new(Query {
+                with: None,
+                body: Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken(TokenWithSpan::new(
+                        Token::Word(Word {
+                            value: "SELECT".to_string(),
+                            quote_style: None,
+                            keyword: Keyword::SELECT,
+                        }),
+                        Span::empty()
+                    )),
+                    distinct: None,
+                    top: None,
+                    top_before_distinct: false,
+                    projection: vec![
+                        SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("field1"))),
+                        SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("field2"))),
+                    ],
+                    exclude: None,
+                    into: None,
+                    from: vec![TableWithJoins {
+                        relation: table_from_name(ObjectName::from(vec![
+                            Ident::new("mydataset"),
+                            Ident::new("table1")
+                        ])),
+                        joins: vec![],
+                    }],
+                    lateral_views: vec![],
+                    prewhere: None,
+                    selection: None,
+                    group_by: GroupByExpr::Expressions(vec![], vec![]),
+                    cluster_by: vec![],
+                    distribute_by: vec![],
+                    sort_by: vec![],
+                    having: None,
+                    named_window: vec![],
+                    qualify: None,
+                    window_before_qualify: false,
+                    value_table_mode: None,
+                    connect_by: None,
+                    flavor: SelectFlavor::Standard,
+                }))),
+                order_by: Some(OrderBy {
+                    kind: OrderByKind::Expressions(vec![OrderByExpr {
+                        expr: Expr::Identifier(Ident::new("field1")),
+                        options: OrderByOptions {
+                            asc: None,
+                            nulls_first: None,
+                        },
+                        with_fill: None,
+                    },]),
+                    interpolate: None,
+                }),
+                limit_clause: Some(LimitClause::LimitOffset {
+                    limit: Some(Expr::Value(number("10").with_empty_span())),
+                    offset: None,
+                    limit_by: vec![],
+                }),
+                fetch: None,
+                locks: vec![],
+                for_clause: None,
+                settings: None,
+                format_clause: None,
+                pipe_operators: vec![],
+            })
+        })
+    );
+
+    // at least one option (uri) is required
+    let err = bigquery()
+        .parse_sql_statements(concat!(
+            "EXPORT DATA OPTIONS() AS ",
+            "SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 LIMIT 10",
+        ))
+        .unwrap_err();
+    assert_eq!(
+        err.to_string(),
+        "sql parser error: Expected: identifier, found: )"
+    );
+
+    let err = bigquery()
+        .parse_sql_statements(concat!(
+            "EXPORT DATA AS SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 LIMIT 10",
+        ))
+        .unwrap_err();
+    assert_eq!(
+        err.to_string(),
+        "sql parser error: Expected: OPTIONS, found: AS"
+    );
+}
+
+#[test]
+fn test_begin_transaction() {
+    bigquery().verified_stmt("BEGIN TRANSACTION");
+}
+
+#[test]
+fn test_begin_statement() {
+    bigquery().verified_stmt("BEGIN");
+}
diff --git a/tests/sqlparser_clickhouse.rs b/tests/sqlparser_clickhouse.rs
index a71871115..bc1431f9c 100644
--- a/tests/sqlparser_clickhouse.rs
+++ b/tests/sqlparser_clickhouse.rs
@@ -21,12 +21,14 @@
 #[macro_use]
 mod test_utils;
 
+use helpers::attached_token::AttachedToken;
+use sqlparser::tokenizer::Span;
 use test_utils::*;
 
-use sqlparser::ast::Expr::{BinaryOp, Identifier, MapAccess};
+use sqlparser::ast::Expr::{BinaryOp, Identifier};
 use sqlparser::ast::SelectItem::UnnamedExpr;
 use sqlparser::ast::TableFactor::Table;
-use sqlparser::ast::Value::Number;
+use sqlparser::ast::Value::Boolean;
 use sqlparser::ast::*;
 use sqlparser::dialect::ClickHouseDialect;
 use sqlparser::dialect::GenericDialect;
@@ -39,35 +41,29 @@ fn parse_map_access_expr() {
     assert_eq!(
         Select {
             distinct: None,
+            select_token: AttachedToken::empty(),
             top: None,
             top_before_distinct: false,
-            projection: vec![UnnamedExpr(MapAccess {
-                column: Box::new(Identifier(Ident {
+            projection: vec![UnnamedExpr(Expr::CompoundFieldAccess {
+                root: Box::new(Identifier(Ident {
                     value: "string_values".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 })),
-                keys: vec![MapAccessKey {
-                    key: call(
+                access_chain: vec![AccessExpr::Subscript(Subscript::Index {
+                    index: call(
                         "indexOf",
                         [
                             Expr::Identifier(Ident::new("string_names")),
-                            Expr::Value(Value::SingleQuotedString("endpoint".to_string()))
+                            Expr::value(Value::SingleQuotedString("endpoint".to_string()))
                         ]
                     ),
-                    syntax: MapAccessSyntax::Bracket
-                }],
+                })],
             })],
+            exclude: None,
             into: None,
             from: vec![TableWithJoins {
-                relation: Table {
-                    name: ObjectName(vec![Ident::new("foos")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec![Ident::new("foos")])),
                 joins: vec![],
             }],
             lateral_views: vec![],
@@ -76,25 +72,24 @@ fn parse_map_access_expr() {
                 left: Box::new(BinaryOp {
                     left: Box::new(Identifier(Ident::new("id"))),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString("test".to_string()))),
+                    right: Box::new(Expr::value(Value::SingleQuotedString("test".to_string()))),
                 }),
                 op: BinaryOperator::And,
                 right: Box::new(BinaryOp {
-                    left: Box::new(MapAccess {
-                        column: Box::new(Identifier(Ident::new("string_value"))),
-                        keys: vec![MapAccessKey {
-                            key: call(
+                    left: Box::new(Expr::CompoundFieldAccess {
+                        root: Box::new(Identifier(Ident::new("string_value"))),
+                        access_chain: vec![AccessExpr::Subscript(Subscript::Index {
+                            index: call(
                                 "indexOf",
                                 [
                                     Expr::Identifier(Ident::new("string_name")),
-                                    Expr::Value(Value::SingleQuotedString("app".to_string()))
+                                    Expr::value(Value::SingleQuotedString("app".to_string()))
                                 ]
                             ),
-                            syntax: MapAccessSyntax::Bracket
-                        }],
+                        })],
                     }),
                     op: BinaryOperator::NotEq,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString("foo".to_string()))),
+                    right: Box::new(Expr::value(Value::SingleQuotedString("foo".to_string()))),
                 }),
             }),
             group_by: GroupByExpr::Expressions(vec![], vec![]),
@@ -107,6 +102,7 @@ fn parse_map_access_expr() {
             qualify: None,
             value_table_mode: None,
             connect_by: None,
+            flavor: SelectFlavor::Standard,
         },
         select
     );
@@ -119,8 +115,8 @@ fn parse_array_expr() {
     assert_eq!(
         &Expr::Array(Array {
             elem: vec![
-                Expr::Value(Value::SingleQuotedString("1".to_string())),
-                Expr::Value(Value::SingleQuotedString("2".to_string())),
+                Expr::value(Value::SingleQuotedString("1".to_string())),
+                Expr::value(Value::SingleQuotedString("2".to_string())),
             ],
             named: false,
         }),
@@ -170,10 +166,12 @@ fn parse_delimited_identifiers() {
             args,
             with_hints,
             version,
-            with_ordinality: _,
-            partitions: _,
+            ..
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -192,7 +190,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -221,13 +220,23 @@ fn parse_delimited_identifiers() {
 
 #[test]
 fn parse_create_table() {
-    clickhouse().verified_stmt(r#"CREATE TABLE "x" ("a" "int") ENGINE=MergeTree ORDER BY ("x")"#);
-    clickhouse().verified_stmt(r#"CREATE TABLE "x" ("a" "int") ENGINE=MergeTree ORDER BY "x""#);
+    clickhouse().verified_stmt(r#"CREATE TABLE "x" ("a" "int") ENGINE = MergeTree ORDER BY ("x")"#);
+    clickhouse().verified_stmt(r#"CREATE TABLE "x" ("a" "int") ENGINE = MergeTree ORDER BY "x""#);
     clickhouse().verified_stmt(
-        r#"CREATE TABLE "x" ("a" "int") ENGINE=MergeTree ORDER BY "x" AS SELECT * FROM "t" WHERE true"#,
+        r#"CREATE TABLE "x" ("a" "int") ENGINE = MergeTree ORDER BY "x" AS SELECT * FROM "t" WHERE true"#,
+    );
+    clickhouse().one_statement_parses_to(
+        "CREATE TABLE x (a int) ENGINE = MergeTree() ORDER BY a",
+        "CREATE TABLE x (a INT) ENGINE = MergeTree ORDER BY a",
     );
 }
 
+#[test]
+fn parse_insert_into_function() {
+    clickhouse().verified_stmt(r#"INSERT INTO TABLE FUNCTION remote('localhost', default.simple_table) VALUES (100, 'inserted via remote()')"#);
+    clickhouse().verified_stmt(r#"INSERT INTO FUNCTION remote('localhost', default.simple_table) VALUES (100, 'inserted via remote()')"#);
+}
+
 #[test]
 fn parse_alter_table_attach_and_detach_partition() {
     for operation in &["ATTACH", "DETACH"] {
@@ -302,7 +311,7 @@ fn parse_alter_table_add_projection() {
         Statement::AlterTable {
             name, operations, ..
         } => {
-            assert_eq!(name, ObjectName(vec!["t0".into()]));
+            assert_eq!(name, ObjectName::from(vec!["t0".into()]));
             assert_eq!(1, operations.len());
             assert_eq!(
                 operations[0],
@@ -319,12 +328,14 @@ fn parse_alter_table_add_projection() {
                             vec![]
                         )),
                         order_by: Some(OrderBy {
-                            exprs: vec![OrderByExpr {
+                            kind: OrderByKind::Expressions(vec![OrderByExpr {
                                 expr: Identifier(Ident::new("b")),
-                                asc: None,
-                                nulls_first: None,
+                                options: OrderByOptions {
+                                    asc: None,
+                                    nulls_first: None,
+                                },
                                 with_fill: None,
-                            }],
+                            }]),
                             interpolate: None,
                         }),
                     }
@@ -372,7 +383,7 @@ fn parse_alter_table_drop_projection() {
         Statement::AlterTable {
             name, operations, ..
         } => {
-            assert_eq!(name, ObjectName(vec!["t0".into()]));
+            assert_eq!(name, ObjectName::from(vec!["t0".into()]));
             assert_eq!(1, operations.len());
             assert_eq!(
                 operations[0],
@@ -405,7 +416,7 @@ fn parse_alter_table_clear_and_materialize_projection() {
             Statement::AlterTable {
                 name, operations, ..
             } => {
-                assert_eq!(name, ObjectName(vec!["t0".into()]));
+                assert_eq!(name, ObjectName::from(vec!["t0".into()]));
                 assert_eq!(1, operations.len());
                 assert_eq!(
                     operations[0],
@@ -524,7 +535,6 @@ fn column_def(name: Ident, data_type: DataType) -> ColumnDef {
     ColumnDef {
         name,
         data_type,
-        collation: None,
         options: vec![],
     }
 }
@@ -549,7 +559,7 @@ fn parse_clickhouse_data_types() {
 
     match clickhouse_and_generic().one_statement_parses_to(sql, &canonical_sql) {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
-            assert_eq!(name, ObjectName(vec!["table".into()]));
+            assert_eq!(name, ObjectName::from(vec!["table".into()]));
             assert_eq!(
                 columns,
                 vec![
@@ -584,13 +594,13 @@ fn parse_clickhouse_data_types() {
 
 #[test]
 fn parse_create_table_with_nullable() {
-    let sql = r#"CREATE TABLE table (k UInt8, `a` Nullable(String), `b` Nullable(DateTime64(9, 'UTC')), c Nullable(DateTime64(9)), d Date32 NULL) ENGINE=MergeTree ORDER BY (`k`)"#;
+    let sql = r#"CREATE TABLE table (k UInt8, `a` Nullable(String), `b` Nullable(DateTime64(9, 'UTC')), c Nullable(DateTime64(9)), d Date32 NULL) ENGINE = MergeTree ORDER BY (`k`)"#;
     // ClickHouse has a case-sensitive definition of data type, but canonical representation is not
     let canonical_sql = sql.replace("String", "STRING");
 
     match clickhouse_and_generic().one_statement_parses_to(sql, &canonical_sql) {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
-            assert_eq!(name, ObjectName(vec!["table".into()]));
+            assert_eq!(name, ObjectName::from(vec!["table".into()]));
             assert_eq!(
                 columns,
                 vec![
@@ -613,7 +623,6 @@ fn parse_create_table_with_nullable() {
                     ColumnDef {
                         name: "d".into(),
                         data_type: DataType::Date32,
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Null
@@ -639,7 +648,7 @@ fn parse_create_table_with_nested_data_types() {
 
     match clickhouse().one_statement_parses_to(sql, "") {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
-            assert_eq!(name, ObjectName(vec!["table".into()]));
+            assert_eq!(name, ObjectName::from(vec!["table".into()]));
             assert_eq!(
                 columns,
                 vec![
@@ -657,7 +666,6 @@ fn parse_create_table_with_nested_data_types() {
                                 DataType::LowCardinality(Box::new(DataType::String(None)))
                             )
                         ]),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
@@ -666,15 +674,16 @@ fn parse_create_table_with_nested_data_types() {
                             DataType::Tuple(vec![
                                 StructField {
                                     field_name: None,
-                                    field_type: DataType::FixedString(128)
+                                    field_type: DataType::FixedString(128),
+                                    options: None,
                                 },
                                 StructField {
                                     field_name: None,
-                                    field_type: DataType::Int128
+                                    field_type: DataType::Int128,
+                                    options: None,
                                 }
                             ])
                         ))),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
@@ -683,15 +692,16 @@ fn parse_create_table_with_nested_data_types() {
                             StructField {
                                 field_name: Some("a".into()),
                                 field_type: DataType::Datetime64(9, None),
+                                options: None,
                             },
                             StructField {
                                 field_name: Some("b".into()),
                                 field_type: DataType::Array(ArrayElemTypeDef::Parenthesis(
                                     Box::new(DataType::Uuid)
-                                ))
+                                )),
+                                options: None,
                             },
                         ]),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
@@ -700,7 +710,6 @@ fn parse_create_table_with_nested_data_types() {
                             Box::new(DataType::String(None)),
                             Box::new(DataType::UInt16)
                         ),
-                        collation: None,
                         options: vec![],
                     },
                 ]
@@ -714,14 +723,14 @@ fn parse_create_table_with_nested_data_types() {
 fn parse_create_table_with_primary_key() {
     match clickhouse_and_generic().verified_stmt(concat!(
         r#"CREATE TABLE db.table (`i` INT, `k` INT)"#,
-        " ENGINE=SharedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')",
+        " ENGINE = SharedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}')",
         " PRIMARY KEY tuple(i)",
         " ORDER BY tuple(i)",
     )) {
         Statement::CreateTable(CreateTable {
             name,
             columns,
-            engine,
+            table_options,
             primary_key,
             order_by,
             ..
@@ -732,30 +741,35 @@ fn parse_create_table_with_primary_key() {
                     ColumnDef {
                         name: Ident::with_quote('`', "i"),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::with_quote('`', "k"),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                 ],
                 columns
             );
-            assert_eq!(
-                engine,
-                Some(TableEngine {
-                    name: "SharedMergeTree".to_string(),
-                    parameters: Some(vec![
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::NamedParenthesizedList(
+                NamedParenthesizedList {
+                    key: Ident::new("ENGINE"),
+                    name: Some(Ident::new("SharedMergeTree")),
+                    values: vec![
                         Ident::with_quote('\'', "/clickhouse/tables/{uuid}/{shard}"),
                         Ident::with_quote('\'', "{replica}"),
-                    ]),
-                })
-            );
+                    ]
+                }
+            )));
+
             fn assert_function(actual: &Function, name: &str, arg: &str) -> bool {
-                assert_eq!(actual.name, ObjectName(vec![Ident::new(name)]));
+                assert_eq!(actual.name, ObjectName::from(vec![Ident::new(name)]));
                 assert_eq!(
                     actual.args,
                     FunctionArguments::List(FunctionArgumentList {
@@ -800,7 +814,7 @@ fn parse_create_table_with_variant_default_expressions() {
         " b DATETIME EPHEMERAL now(),",
         " c DATETIME EPHEMERAL,",
         " d STRING ALIAS toString(c)",
-        ") ENGINE=MergeTree"
+        ") ENGINE = MergeTree"
     );
     match clickhouse_and_generic().verified_stmt(sql) {
         Statement::CreateTable(CreateTable { columns, .. }) => {
@@ -810,11 +824,11 @@ fn parse_create_table_with_variant_default_expressions() {
                     ColumnDef {
                         name: Ident::new("a"),
                         data_type: DataType::Datetime(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Materialized(Expr::Function(Function {
-                                name: ObjectName(vec![Ident::new("now")]),
+                                name: ObjectName::from(vec![Ident::new("now")]),
+                                uses_odbc_syntax: false,
                                 args: FunctionArguments::List(FunctionArgumentList {
                                     args: vec![],
                                     duplicate_treatment: None,
@@ -831,11 +845,11 @@ fn parse_create_table_with_variant_default_expressions() {
                     ColumnDef {
                         name: Ident::new("b"),
                         data_type: DataType::Datetime(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Ephemeral(Some(Expr::Function(Function {
-                                name: ObjectName(vec![Ident::new("now")]),
+                                name: ObjectName::from(vec![Ident::new("now")]),
+                                uses_odbc_syntax: false,
                                 args: FunctionArguments::List(FunctionArgumentList {
                                     args: vec![],
                                     duplicate_treatment: None,
@@ -852,7 +866,6 @@ fn parse_create_table_with_variant_default_expressions() {
                     ColumnDef {
                         name: Ident::new("c"),
                         data_type: DataType::Datetime(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Ephemeral(None)
@@ -861,11 +874,11 @@ fn parse_create_table_with_variant_default_expressions() {
                     ColumnDef {
                         name: Ident::new("d"),
                         data_type: DataType::String(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Alias(Expr::Function(Function {
-                                name: ObjectName(vec![Ident::new("toString")]),
+                                name: ObjectName::from(vec![Ident::new("toString")]),
+                                uses_odbc_syntax: false,
                                 args: FunctionArguments::List(FunctionArgumentList {
                                     args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
                                         Identifier(Ident::new("c"))
@@ -892,31 +905,33 @@ fn parse_create_table_with_variant_default_expressions() {
 fn parse_create_view_with_fields_data_types() {
     match clickhouse().verified_stmt(r#"CREATE VIEW v (i "int", f "String") AS SELECT * FROM t"#) {
         Statement::CreateView { name, columns, .. } => {
-            assert_eq!(name, ObjectName(vec!["v".into()]));
+            assert_eq!(name, ObjectName::from(vec!["v".into()]));
             assert_eq!(
                 columns,
                 vec![
                     ViewColumnDef {
                         name: "i".into(),
                         data_type: Some(DataType::Custom(
-                            ObjectName(vec![Ident {
+                            ObjectName::from(vec![Ident {
                                 value: "int".into(),
-                                quote_style: Some('"')
+                                quote_style: Some('"'),
+                                span: Span::empty(),
                             }]),
                             vec![]
                         )),
-                        options: None
+                        options: None,
                     },
                     ViewColumnDef {
                         name: "f".into(),
                         data_type: Some(DataType::Custom(
-                            ObjectName(vec![Ident {
+                            ObjectName::from(vec![Ident {
                                 value: "String".into(),
-                                quote_style: Some('"')
+                                quote_style: Some('"'),
+                                span: Span::empty(),
                             }]),
                             vec![]
                         )),
-                        options: None
+                        options: None,
                     },
                 ]
             );
@@ -945,42 +960,113 @@ fn parse_limit_by() {
     clickhouse_and_generic().verified_stmt(
         r#"SELECT * FROM default.last_asset_runs_mv ORDER BY created_at DESC LIMIT 1 BY asset, toStartOfDay(created_at)"#,
     );
+    clickhouse_and_generic().parse_sql_statements(
+        r#"SELECT * FROM default.last_asset_runs_mv ORDER BY created_at DESC BY asset, toStartOfDay(created_at)"#,
+    ).expect_err("BY without LIMIT");
+    clickhouse_and_generic()
+        .parse_sql_statements("SELECT * FROM T OFFSET 5 BY foo")
+        .expect_err("BY with OFFSET but without LIMIT");
 }
 
 #[test]
 fn parse_settings_in_query() {
-    match clickhouse_and_generic()
-        .verified_stmt(r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"#)
-    {
-        Statement::Query(query) => {
-            assert_eq!(
-                query.settings,
-                Some(vec![
-                    Setting {
-                        key: Ident::new("max_threads"),
-                        value: Number("1".parse().unwrap(), false)
-                    },
-                    Setting {
-                        key: Ident::new("max_block_size"),
-                        value: Number("10000".parse().unwrap(), false)
-                    },
-                ])
-            );
+    fn check_settings(sql: &str, expected: Vec<Setting>) {
+        match clickhouse_and_generic().verified_stmt(sql) {
+            Statement::Query(q) => {
+                assert_eq!(q.settings, Some(expected));
+            }
+            _ => unreachable!(),
         }
-        _ => unreachable!(),
+    }
+
+    for (sql, expected_settings) in [
+        (
+            r#"SELECT * FROM t SETTINGS max_threads = 1, max_block_size = 10000"#,
+            vec![
+                Setting {
+                    key: Ident::new("max_threads"),
+                    value: Expr::value(number("1")),
+                },
+                Setting {
+                    key: Ident::new("max_block_size"),
+                    value: Expr::value(number("10000")),
+                },
+            ],
+        ),
+        (
+            r#"SELECT * FROM t SETTINGS additional_table_filters = {'table_1': 'x != 2'}"#,
+            vec![Setting {
+                key: Ident::new("additional_table_filters"),
+                value: Expr::Dictionary(vec![DictionaryField {
+                    key: Ident::with_quote('\'', "table_1"),
+                    value: Expr::value(single_quoted_string("x != 2")).into(),
+                }]),
+            }],
+        ),
+        (
+            r#"SELECT * FROM t SETTINGS additional_result_filter = 'x != 2', query_plan_optimize_lazy_materialization = false"#,
+            vec![
+                Setting {
+                    key: Ident::new("additional_result_filter"),
+                    value: Expr::value(single_quoted_string("x != 2")),
+                },
+                Setting {
+                    key: Ident::new("query_plan_optimize_lazy_materialization"),
+                    value: Expr::value(Boolean(false)),
+                },
+            ],
+        ),
+    ] {
+        check_settings(sql, expected_settings);
     }
 
     let invalid_cases = vec![
-        "SELECT * FROM t SETTINGS a",
-        "SELECT * FROM t SETTINGS a=",
-        "SELECT * FROM t SETTINGS a=1, b",
-        "SELECT * FROM t SETTINGS a=1, b=",
-        "SELECT * FROM t SETTINGS a=1, b=c",
+        ("SELECT * FROM t SETTINGS a", "Expected: =, found: EOF"),
+        (
+            "SELECT * FROM t SETTINGS a=",
+            "Expected: an expression, found: EOF",
+        ),
+        ("SELECT * FROM t SETTINGS a=1, b", "Expected: =, found: EOF"),
+        (
+            "SELECT * FROM t SETTINGS a=1, b=",
+            "Expected: an expression, found: EOF",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {",
+            "Expected: identifier, found: EOF",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {'b'",
+            "Expected: :, found: EOF",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {'b': ",
+            "Expected: an expression, found: EOF",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {'b': 'c',}",
+            "Expected: identifier, found: }",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {'b': 'c', 'd'}",
+            "Expected: :, found: }",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {'b': 'c', 'd': }",
+            "Expected: an expression, found: }",
+        ),
+        (
+            "SELECT * FROM t SETTINGS a = {ANY(b)}",
+            "Expected: :, found: (",
+        ),
     ];
-    for sql in invalid_cases {
-        clickhouse_and_generic()
-            .parse_sql_statements(sql)
-            .expect_err("Expected: SETTINGS key = value, found: ");
+    for (sql, error_msg) in invalid_cases {
+        assert_eq!(
+            clickhouse_and_generic()
+                .parse_sql_statements(sql)
+                .unwrap_err(),
+            ParserError(error_msg.to_string())
+        );
     }
 }
 #[test]
@@ -1017,17 +1103,15 @@ fn parse_select_parametric_function() {
                     assert_eq!(parameters.args.len(), 2);
                     assert_eq!(
                         parameters.args[0],
-                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(Value::Number(
-                            "0.5".parse().unwrap(),
-                            false
-                        ))))
+                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            (Value::Number("0.5".parse().unwrap(), false)).with_empty_span()
+                        )))
                     );
                     assert_eq!(
                         parameters.args[1],
-                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(Value::Number(
-                            "0.6".parse().unwrap(),
-                            false
-                        ))))
+                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            (Value::Number("0.6".parse().unwrap(), false)).with_empty_span()
+                        )))
                     );
                 }
                 _ => unreachable!(),
@@ -1060,61 +1144,6 @@ fn parse_create_materialized_view() {
     clickhouse_and_generic().verified_stmt(sql);
 }
 
-#[test]
-fn parse_group_by_with_modifier() {
-    let clauses = ["x", "a, b", "ALL"];
-    let modifiers = [
-        "WITH ROLLUP",
-        "WITH CUBE",
-        "WITH TOTALS",
-        "WITH ROLLUP WITH CUBE",
-    ];
-    let expected_modifiers = [
-        vec![GroupByWithModifier::Rollup],
-        vec![GroupByWithModifier::Cube],
-        vec![GroupByWithModifier::Totals],
-        vec![GroupByWithModifier::Rollup, GroupByWithModifier::Cube],
-    ];
-    for clause in &clauses {
-        for (modifier, expected_modifier) in modifiers.iter().zip(expected_modifiers.iter()) {
-            let sql = format!("SELECT * FROM t GROUP BY {clause} {modifier}");
-            match clickhouse_and_generic().verified_stmt(&sql) {
-                Statement::Query(query) => {
-                    let group_by = &query.body.as_select().unwrap().group_by;
-                    if clause == &"ALL" {
-                        assert_eq!(group_by, &GroupByExpr::All(expected_modifier.to_vec()));
-                    } else {
-                        assert_eq!(
-                            group_by,
-                            &GroupByExpr::Expressions(
-                                clause
-                                    .split(", ")
-                                    .map(|c| Identifier(Ident::new(c)))
-                                    .collect(),
-                                expected_modifier.to_vec()
-                            )
-                        );
-                    }
-                }
-                _ => unreachable!(),
-            }
-        }
-    }
-
-    // invalid cases
-    let invalid_cases = [
-        "SELECT * FROM t GROUP BY x WITH",
-        "SELECT * FROM t GROUP BY x WITH ROLLUP CUBE",
-        "SELECT * FROM t GROUP BY x WITH WITH ROLLUP",
-        "SELECT * FROM t GROUP BY WITH ROLLUP",
-    ];
-    for sql in invalid_cases {
-        clickhouse_and_generic()
-            .parse_sql_statements(sql)
-            .expect_err("Expected: one of ROLLUP or CUBE or TOTALS, found: WITH");
-    }
-}
-
 #[test]
 fn parse_select_order_by_with_fill_interpolate() {
     let sql = "SELECT id, fname, lname FROM customer WHERE id < 5 \
@@ -1126,42 +1155,53 @@ fn parse_select_order_by_with_fill_interpolate() {
     let select = clickhouse().verified_query(sql);
     assert_eq!(
         OrderBy {
-            exprs: vec![
+            kind: OrderByKind::Expressions(vec![
                 OrderByExpr {
                     expr: Expr::Identifier(Ident::new("fname")),
-                    asc: Some(true),
-                    nulls_first: Some(true),
+                    options: OrderByOptions {
+                        asc: Some(true),
+                        nulls_first: Some(true),
+                    },
                     with_fill: Some(WithFill {
-                        from: Some(Expr::Value(number("10"))),
-                        to: Some(Expr::Value(number("20"))),
-                        step: Some(Expr::Value(number("2"))),
+                        from: Some(Expr::value(number("10"))),
+                        to: Some(Expr::value(number("20"))),
+                        step: Some(Expr::value(number("2"))),
                     }),
                 },
                 OrderByExpr {
                     expr: Expr::Identifier(Ident::new("lname")),
-                    asc: Some(false),
-                    nulls_first: Some(false),
+                    options: OrderByOptions {
+                        asc: Some(false),
+                        nulls_first: Some(false),
+                    },
                     with_fill: Some(WithFill {
-                        from: Some(Expr::Value(number("30"))),
-                        to: Some(Expr::Value(number("40"))),
-                        step: Some(Expr::Value(number("3"))),
+                        from: Some(Expr::value(number("30"))),
+                        to: Some(Expr::value(number("40"))),
+                        step: Some(Expr::value(number("3"))),
                     }),
                 },
-            ],
+            ]),
             interpolate: Some(Interpolate {
                 exprs: Some(vec![InterpolateExpr {
                     column: Ident::new("col1"),
                     expr: Some(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("col1"))),
                         op: BinaryOperator::Plus,
-                        right: Box::new(Expr::Value(number("1"))),
+                        right: Box::new(Expr::value(number("1"))),
                     }),
                 }])
             })
         },
         select.order_by.expect("ORDER BY expected")
     );
-    assert_eq!(Some(Expr::Value(number("2"))), select.limit);
+    assert_eq!(
+        select.limit_clause,
+        Some(LimitClause::LimitOffset {
+            limit: Some(Expr::value(number("2"))),
+            offset: None,
+            limit_by: vec![]
+        })
+    );
 }
 
 #[test]
@@ -1202,11 +1242,15 @@ fn parse_with_fill() {
     let select = clickhouse().verified_query(sql);
     assert_eq!(
         Some(WithFill {
-            from: Some(Expr::Value(number("10"))),
-            to: Some(Expr::Value(number("20"))),
-            step: Some(Expr::Value(number("2"))),
-        }),
-        select.order_by.expect("ORDER BY expected").exprs[0].with_fill
+            from: Some(Expr::value(number("10"))),
+            to: Some(Expr::value(number("20"))),
+            step: Some(Expr::value(number("2"))),
+        })
+        .as_ref(),
+        match select.order_by.expect("ORDER BY expected").kind {
+            OrderByKind::Expressions(ref exprs) => exprs[0].with_fill.as_ref(),
+            _ => None,
+        }
     );
 }
 
@@ -1241,7 +1285,7 @@ fn parse_interpolate_body_with_columns() {
                     expr: Some(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("col1"))),
                         op: BinaryOperator::Plus,
-                        right: Box::new(Expr::Value(number("1"))),
+                        right: Box::new(Expr::value(number("1"))),
                     }),
                 },
                 InterpolateExpr {
@@ -1253,12 +1297,17 @@ fn parse_interpolate_body_with_columns() {
                     expr: Some(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("col4"))),
                         op: BinaryOperator::Plus,
-                        right: Box::new(Expr::Value(number("4"))),
+                        right: Box::new(Expr::value(number("4"))),
                     }),
                 },
             ])
-        }),
-        select.order_by.expect("ORDER BY expected").interpolate
+        })
+        .as_ref(),
+        select
+            .order_by
+            .expect("ORDER BY expected")
+            .interpolate
+            .as_ref()
     );
 }
 
@@ -1267,8 +1316,12 @@ fn parse_interpolate_without_body() {
     let sql = "SELECT fname FROM customer ORDER BY fname WITH FILL INTERPOLATE";
     let select = clickhouse().verified_query(sql);
     assert_eq!(
-        Some(Interpolate { exprs: None }),
-        select.order_by.expect("ORDER BY expected").interpolate
+        Some(Interpolate { exprs: None }).as_ref(),
+        select
+            .order_by
+            .expect("ORDER BY expected")
+            .interpolate
+            .as_ref()
     );
 }
 
@@ -1279,8 +1332,13 @@ fn parse_interpolate_with_empty_body() {
     assert_eq!(
         Some(Interpolate {
             exprs: Some(vec![])
-        }),
-        select.order_by.expect("ORDER BY expected").interpolate
+        })
+        .as_ref(),
+        select
+            .order_by
+            .expect("ORDER BY expected")
+            .interpolate
+            .as_ref()
     );
 }
 
@@ -1294,7 +1352,9 @@ fn test_prewhere() {
                 Some(&BinaryOp {
                     left: Box::new(Identifier(Ident::new("x"))),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                    right: Box::new(Expr::Value(
+                        (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                    )),
                 })
             );
             let selection = query.as_ref().body.as_select().unwrap().selection.as_ref();
@@ -1303,7 +1363,9 @@ fn test_prewhere() {
                 Some(&BinaryOp {
                     left: Box::new(Identifier(Ident::new("y"))),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::Number("2".parse().unwrap(), false))),
+                    right: Box::new(Expr::Value(
+                        (Value::Number("2".parse().unwrap(), false)).with_empty_span()
+                    )),
                 })
             );
         }
@@ -1319,13 +1381,17 @@ fn test_prewhere() {
                     left: Box::new(BinaryOp {
                         left: Box::new(Identifier(Ident::new("x"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }),
                     op: BinaryOperator::And,
                     right: Box::new(BinaryOp {
                         left: Box::new(Identifier(Ident::new("y"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("2".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("2".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }),
                 })
             );
@@ -1349,16 +1415,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            clickhouse().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            clickhouse().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                clickhouse().verified_stmt(&format!("USE {0}{1}{0}", quote, object_name)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                clickhouse().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -1371,7 +1437,7 @@ fn parse_use() {
 fn test_query_with_format_clause() {
     let format_options = vec!["TabSeparated", "JSONCompact", "NULL"];
     for format in &format_options {
-        let sql = format!("SELECT * FROM t FORMAT {}", format);
+        let sql = format!("SELECT * FROM t FORMAT {format}");
         match clickhouse_and_generic().verified_stmt(&sql) {
             Statement::Query(query) => {
                 if *format == "NULL" {
@@ -1399,6 +1465,26 @@ fn test_query_with_format_clause() {
     }
 }
 
+#[test]
+fn test_insert_query_with_format_clause() {
+    let cases = [
+        r#"INSERT INTO tbl FORMAT JSONEachRow {"id": 1, "value": "foo"}, {"id": 2, "value": "bar"}"#,
+        r#"INSERT INTO tbl FORMAT JSONEachRow ["first", "second", "third"]"#,
+        r#"INSERT INTO tbl FORMAT JSONEachRow [{"first": 1}]"#,
+        r#"INSERT INTO tbl (foo) FORMAT JSONAsObject {"foo": {"bar": {"x": "y"}, "baz": 1}}"#,
+        r#"INSERT INTO tbl (foo, bar) FORMAT JSON {"foo": 1, "bar": 2}"#,
+        r#"INSERT INTO tbl FORMAT CSV col1, col2, col3"#,
+        r#"INSERT INTO tbl FORMAT LineAsString "I love apple", "I love banana", "I love orange""#,
+        r#"INSERT INTO tbl (foo) SETTINGS input_format_json_read_bools_as_numbers = true FORMAT JSONEachRow {"id": 1, "value": "foo"}"#,
+        r#"INSERT INTO tbl SETTINGS format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format' FORMAT Template"#,
+        r#"INSERT INTO tbl SETTINGS input_format_json_read_bools_as_numbers = true FORMAT JSONEachRow {"id": 1, "value": "foo"}"#,
+    ];
+
+    for sql in &cases {
+        clickhouse().verified_stmt(sql);
+    }
+}
+
 #[test]
 fn parse_create_table_on_commit_and_as_query() {
     let sql = r#"CREATE LOCAL TEMPORARY TABLE test ON COMMIT PRESERVE ROWS AS SELECT 1"#;
@@ -1413,10 +1499,9 @@ fn parse_create_table_on_commit_and_as_query() {
             assert_eq!(on_commit, Some(OnCommit::PreserveRows));
             assert_eq!(
                 query.unwrap().body.as_select().unwrap().projection,
-                vec![UnnamedExpr(Expr::Value(Value::Number(
-                    "1".parse().unwrap(),
-                    false
-                )))]
+                vec![UnnamedExpr(Expr::Value(
+                    (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                ))]
             );
         }
         _ => unreachable!(),
@@ -1429,9 +1514,9 @@ fn parse_freeze_and_unfreeze_partition() {
     for operation_name in &["FREEZE", "UNFREEZE"] {
         let sql = format!("ALTER TABLE t {operation_name} PARTITION '2024-08-14'");
 
-        let expected_partition = Partition::Expr(Expr::Value(Value::SingleQuotedString(
-            "2024-08-14".to_string(),
-        )));
+        let expected_partition = Partition::Expr(Expr::Value(
+            Value::SingleQuotedString("2024-08-14".to_string()).with_empty_span(),
+        ));
         match clickhouse_and_generic().verified_stmt(&sql) {
             Statement::AlterTable { operations, .. } => {
                 assert_eq!(operations.len(), 1);
@@ -1459,9 +1544,9 @@ fn parse_freeze_and_unfreeze_partition() {
         match clickhouse_and_generic().verified_stmt(&sql) {
             Statement::AlterTable { operations, .. } => {
                 assert_eq!(operations.len(), 1);
-                let expected_partition = Partition::Expr(Expr::Value(Value::SingleQuotedString(
-                    "2024-08-14".to_string(),
-                )));
+                let expected_partition = Partition::Expr(Expr::Value(
+                    Value::SingleQuotedString("2024-08-14".to_string()).with_empty_span(),
+                ));
                 let expected_operation = if operation_name == &"FREEZE" {
                     AlterTableOperation::FreezePartition {
                         partition: expected_partition,
@@ -1535,11 +1620,11 @@ fn parse_select_table_function_settings() {
             settings: Some(vec![
                 Setting {
                     key: "s0".into(),
-                    value: Value::Number("3".parse().unwrap(), false),
+                    value: Expr::value(number("3")),
                 },
                 Setting {
                     key: "s1".into(),
-                    value: Value::SingleQuotedString("s".into()),
+                    value: Expr::value(single_quoted_string("s")),
                 },
             ]),
         },
@@ -1560,11 +1645,11 @@ fn parse_select_table_function_settings() {
             settings: Some(vec![
                 Setting {
                     key: "s0".into(),
-                    value: Value::Number("3".parse().unwrap(), false),
+                    value: Expr::value(number("3")),
                 },
                 Setting {
                     key: "s1".into(),
-                    value: Value::SingleQuotedString("s".into()),
+                    value: Expr::value(single_quoted_string("s")),
                 },
             ]),
         },
@@ -1574,7 +1659,6 @@ fn parse_select_table_function_settings() {
         "SELECT * FROM t(SETTINGS a=)",
         "SELECT * FROM t(SETTINGS a=1, b)",
         "SELECT * FROM t(SETTINGS a=1, b=)",
-        "SELECT * FROM t(SETTINGS a=1, b=c)",
     ];
     for sql in invalid_cases {
         clickhouse_and_generic()
@@ -1613,6 +1697,38 @@ fn parse_explain_table() {
     }
 }
 
+#[test]
+fn parse_table_sample() {
+    clickhouse().verified_stmt("SELECT * FROM tbl SAMPLE 0.1");
+    clickhouse().verified_stmt("SELECT * FROM tbl SAMPLE 1000");
+    clickhouse().verified_stmt("SELECT * FROM tbl SAMPLE 1 / 10");
+    clickhouse().verified_stmt("SELECT * FROM tbl SAMPLE 1 / 10 OFFSET 1 / 2");
+}
+
+#[test]
+fn test_parse_not_null_in_column_options() {
+    // In addition to DEFAULT and CHECK ClickHouse also supports MATERIALIZED, all of which
+    // can contain `IS NOT NULL` and thus `NOT NULL` as an alias.
+    let canonical = concat!(
+        "CREATE TABLE foo (",
+        "abc INT DEFAULT (42 IS NOT NULL) NOT NULL,",
+        " not_null BOOL MATERIALIZED (abc IS NOT NULL),",
+        " CHECK (abc IS NOT NULL)",
+        ")",
+    );
+    clickhouse().verified_stmt(canonical);
+    clickhouse().one_statement_parses_to(
+        concat!(
+            "CREATE TABLE foo (",
+            "abc INT DEFAULT (42 NOT NULL) NOT NULL,",
+            " not_null BOOL MATERIALIZED (abc NOT NULL),",
+            " CHECK (abc NOT NULL)",
+            ")",
+        ),
+        canonical,
+    );
+}
+
 fn clickhouse() -> TestedDialects {
     TestedDialects::new(vec![Box::new(ClickHouseDialect {})])
 }
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index 3d9ba5da2..7eff55039 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -25,7 +25,10 @@
 
 extern crate core;
 
+use helpers::attached_token::AttachedToken;
 use matches::assert_matches;
+use sqlparser::ast::helpers::key_value_options::*;
+use sqlparser::ast::helpers::key_value_options::{KeyValueOptions, KeyValueOptionsDelimiter};
 use sqlparser::ast::SelectItem::UnnamedExpr;
 use sqlparser::ast::TableFactor::{Pivot, Unpivot};
 use sqlparser::ast::*;
@@ -34,12 +37,14 @@ use sqlparser::dialect::{
     GenericDialect, HiveDialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect,
     SQLiteDialect, SnowflakeDialect,
 };
-use sqlparser::keywords::ALL_KEYWORDS;
+use sqlparser::keywords::{Keyword, ALL_KEYWORDS};
 use sqlparser::parser::{Parser, ParserError, ParserOptions};
 use sqlparser::tokenizer::Tokenizer;
+use sqlparser::tokenizer::{Location, Span};
 use test_utils::{
-    all_dialects, all_dialects_where, alter_table_op, assert_eq_vec, call, expr_from_projection,
-    join, number, only, table, table_alias, TestedDialects,
+    all_dialects, all_dialects_where, all_dialects_with_options, alter_table_op, assert_eq_vec,
+    call, expr_from_projection, join, number, only, table, table_alias, table_from_name,
+    TestedDialects,
 };
 
 #[macro_use]
@@ -48,15 +53,54 @@ mod test_utils;
 #[cfg(test)]
 use pretty_assertions::assert_eq;
 use sqlparser::ast::ColumnOption::Comment;
+use sqlparser::ast::DateTimeField::Seconds;
 use sqlparser::ast::Expr::{Identifier, UnaryOp};
+use sqlparser::ast::Value::Number;
 use sqlparser::test_utils::all_dialects_except;
 
+#[test]
+fn parse_numeric_literal_underscore() {
+    let dialects = all_dialects_where(|d| d.supports_numeric_literal_underscores());
+
+    let canonical = if cfg!(feature = "bigdecimal") {
+        "SELECT 10000"
+    } else {
+        "SELECT 10_000"
+    };
+
+    let select = dialects.verified_only_select_with_canonical("SELECT 10_000", canonical);
+
+    assert_eq!(
+        select.projection,
+        vec![UnnamedExpr(Expr::Value(
+            (number("10_000")).with_empty_span()
+        ))]
+    );
+}
+
+#[test]
+fn parse_function_object_name() {
+    let select = verified_only_select("SELECT a.b.c.d(1, 2, 3) FROM T");
+    let Expr::Function(func) = expr_from_projection(&select.projection[0]) else {
+        unreachable!()
+    };
+    assert_eq!(
+        ObjectName::from(
+            ["a", "b", "c", "d"]
+                .into_iter()
+                .map(Ident::new)
+                .collect::<Vec<_>>()
+        ),
+        func.name,
+    );
+}
+
 #[test]
 fn parse_insert_values() {
     let row = vec![
-        Expr::Value(number("1")),
-        Expr::Value(number("2")),
-        Expr::Value(number("3")),
+        Expr::value(number("1")),
+        Expr::value(number("2")),
+        Expr::value(number("3")),
     ];
     let rows1 = vec![row.clone()];
     let rows2 = vec![row.clone(), row];
@@ -92,7 +136,7 @@ fn parse_insert_values() {
     ) {
         match verified_stmt(sql) {
             Statement::Insert(Insert {
-                table_name,
+                table: table_name,
                 columns,
                 source: Some(source),
                 ..
@@ -116,6 +160,12 @@ fn parse_insert_values() {
     verified_stmt("INSERT INTO customer WITH foo AS (SELECT 1) SELECT * FROM foo UNION VALUES (1)");
 }
 
+#[test]
+fn parse_insert_set() {
+    let dialects = all_dialects_where(|d| d.supports_insert_set());
+    dialects.verified_stmt("INSERT INTO tbl1 SET col1 = 1, col2 = 'abc', col3 = current_date()");
+}
+
 #[test]
 fn parse_replace_into() {
     let dialect = PostgreSqlDialect {};
@@ -139,7 +189,7 @@ fn parse_insert_default_values() {
             partitioned,
             returning,
             source,
-            table_name,
+            table: table_name,
             ..
         }) => {
             assert_eq!(columns, vec![]);
@@ -148,7 +198,10 @@ fn parse_insert_default_values() {
             assert_eq!(partitioned, None);
             assert_eq!(returning, None);
             assert_eq!(source, None);
-            assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
+            assert_eq!(
+                table_name,
+                TableObject::TableName(ObjectName::from(vec!["test_table".into()]))
+            );
         }
         _ => unreachable!(),
     }
@@ -164,7 +217,7 @@ fn parse_insert_default_values() {
             partitioned,
             returning,
             source,
-            table_name,
+            table: table_name,
             ..
         }) => {
             assert_eq!(after_columns, vec![]);
@@ -173,7 +226,10 @@ fn parse_insert_default_values() {
             assert_eq!(partitioned, None);
             assert!(returning.is_some());
             assert_eq!(source, None);
-            assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
+            assert_eq!(
+                table_name,
+                TableObject::TableName(ObjectName::from(vec!["test_table".into()]))
+            );
         }
         _ => unreachable!(),
     }
@@ -189,7 +245,7 @@ fn parse_insert_default_values() {
             partitioned,
             returning,
             source,
-            table_name,
+            table: table_name,
             ..
         }) => {
             assert_eq!(after_columns, vec![]);
@@ -198,7 +254,10 @@ fn parse_insert_default_values() {
             assert_eq!(partitioned, None);
             assert_eq!(returning, None);
             assert_eq!(source, None);
-            assert_eq!(table_name, ObjectName(vec!["test_table".into()]));
+            assert_eq!(
+                table_name,
+                TableObject::TableName(ObjectName::from(vec!["test_table".into()]))
+            );
         }
         _ => unreachable!(),
     }
@@ -234,8 +293,13 @@ fn parse_insert_default_values() {
 
 #[test]
 fn parse_insert_select_returning() {
-    verified_stmt("INSERT INTO t SELECT 1 RETURNING 2");
-    let stmt = verified_stmt("INSERT INTO t SELECT x RETURNING x AS y");
+    // Dialects that support `RETURNING` as a column identifier do
+    // not support this syntax.
+    let dialects =
+        all_dialects_where(|d| !d.is_column_alias(&Keyword::RETURNING, &mut Parser::new(d)));
+
+    dialects.verified_stmt("INSERT INTO t SELECT 1 RETURNING 2");
+    let stmt = dialects.verified_stmt("INSERT INTO t SELECT x RETURNING x AS y");
     match stmt {
         Statement::Insert(Insert {
             returning: Some(ret),
@@ -246,6 +310,27 @@ fn parse_insert_select_returning() {
     }
 }
 
+#[test]
+fn parse_insert_select_from_returning() {
+    let sql = "INSERT INTO table1 SELECT * FROM table2 RETURNING id";
+    match verified_stmt(sql) {
+        Statement::Insert(Insert {
+            table: TableObject::TableName(table_name),
+            source: Some(source),
+            returning: Some(returning),
+            ..
+        }) => {
+            assert_eq!("table1", table_name.to_string());
+            assert!(matches!(*source.body, SetExpr::Select(_)));
+            assert_eq!(
+                returning,
+                vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("id"))),]
+            );
+        }
+        bad_stmt => unreachable!("Expected valid insert, got {:?}", bad_stmt),
+    }
+}
+
 #[test]
 fn parse_returning_as_column_alias() {
     verified_stmt("SELECT 1 AS RETURNING");
@@ -303,16 +388,16 @@ fn parse_update() {
                 assignments,
                 vec![
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["a".into()])),
-                        value: Expr::Value(number("1")),
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec!["a".into()])),
+                        value: Expr::value(number("1")),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["b".into()])),
-                        value: Expr::Value(number("2")),
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec!["b".into()])),
+                        value: Expr::value(number("2")),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["c".into()])),
-                        value: Expr::Value(number("3")),
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec!["c".into()])),
+                        value: Expr::value(number("3")),
                     },
                 ]
             );
@@ -356,27 +441,20 @@ fn parse_update_set_from() {
         stmt,
         Statement::Update {
             table: TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("t1")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec![Ident::new("t1")])),
                 joins: vec![],
             },
             assignments: vec![Assignment {
-                target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new("name")])),
+                target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new("name")])),
                 value: Expr::CompoundIdentifier(vec![Ident::new("t2"), Ident::new("name")])
             }],
-            from: Some(TableWithJoins {
+            from: Some(UpdateTableFromKind::AfterSet(vec![TableWithJoins {
                 relation: TableFactor::Derived {
                     lateral: false,
                     subquery: Box::new(Query {
                         with: None,
                         body: Box::new(SetExpr::Select(Box::new(Select {
+                            select_token: AttachedToken::empty(),
                             distinct: None,
                             top: None,
                             top_before_distinct: false,
@@ -384,17 +462,10 @@ fn parse_update_set_from() {
                                 SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("name"))),
                                 SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("id"))),
                             ],
+                            exclude: None,
                             into: None,
                             from: vec![TableWithJoins {
-                                relation: TableFactor::Table {
-                                    name: ObjectName(vec![Ident::new("t1")]),
-                                    alias: None,
-                                    args: None,
-                                    with_hints: vec![],
-                                    version: None,
-                                    partitions: vec![],
-                                    with_ordinality: false,
-                                },
+                                relation: table_from_name(ObjectName::from(vec![Ident::new("t1")])),
                                 joins: vec![],
                             }],
                             lateral_views: vec![],
@@ -413,24 +484,24 @@ fn parse_update_set_from() {
                             window_before_qualify: false,
                             value_table_mode: None,
                             connect_by: None,
+                            flavor: SelectFlavor::Standard,
                         }))),
                         order_by: None,
-                        limit: None,
-                        limit_by: vec![],
-                        offset: None,
+                        limit_clause: None,
                         fetch: None,
                         locks: vec![],
                         for_clause: None,
                         settings: None,
                         format_clause: None,
+                        pipe_operators: vec![],
                     }),
                     alias: Some(TableAlias {
                         name: Ident::new("t2"),
                         columns: vec![],
                     })
                 },
-                joins: vec![],
-            }),
+                joins: vec![]
+            }])),
             selection: Some(Expr::BinaryOp {
                 left: Box::new(Expr::CompoundIdentifier(vec![
                     Ident::new("t1"),
@@ -446,6 +517,9 @@ fn parse_update_set_from() {
             or: None,
         }
     );
+
+    let sql = "UPDATE T SET a = b FROM U, (SELECT foo FROM V) AS W WHERE 1 = 1";
+    dialects.verified_stmt(sql);
 }
 
 #[test]
@@ -463,7 +537,7 @@ fn parse_update_with_table_alias() {
             assert_eq!(
                 TableWithJoins {
                     relation: TableFactor::Table {
-                        name: ObjectName(vec![Ident::new("users")]),
+                        name: ObjectName::from(vec![Ident::new("users")]),
                         alias: Some(TableAlias {
                             name: Ident::new("u"),
                             columns: vec![],
@@ -473,6 +547,9 @@ fn parse_update_with_table_alias() {
                         version: None,
                         partitions: vec![],
                         with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
                     },
                     joins: vec![],
                 },
@@ -480,11 +557,13 @@ fn parse_update_with_table_alias() {
             );
             assert_eq!(
                 vec![Assignment {
-                    target: AssignmentTarget::ColumnName(ObjectName(vec![
+                    target: AssignmentTarget::ColumnName(ObjectName::from(vec![
                         Ident::new("u"),
                         Ident::new("username")
                     ])),
-                    value: Expr::Value(Value::SingleQuotedString("new_user".to_string())),
+                    value: Expr::Value(
+                        (Value::SingleQuotedString("new_user".to_string())).with_empty_span()
+                    ),
                 }],
                 assignments
             );
@@ -495,9 +574,9 @@ fn parse_update_with_table_alias() {
                         Ident::new("username"),
                     ])),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "old_user".to_string()
-                    ))),
+                    right: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("old_user".to_string())).with_empty_span()
+                    )),
                 }),
                 selection
             );
@@ -550,7 +629,7 @@ fn parse_select_with_table_alias() {
         select.from,
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("lineitem")]),
+                name: ObjectName::from(vec![Ident::new("lineitem")]),
                 alias: Some(TableAlias {
                     name: Ident::new("l"),
                     columns: vec![
@@ -564,12 +643,21 @@ fn parse_select_with_table_alias() {
                 version: None,
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             joins: vec![],
         }]
     );
 }
 
+#[test]
+fn parse_analyze() {
+    verified_stmt("ANALYZE TABLE test_table");
+    verified_stmt("ANALYZE test_table");
+}
+
 #[test]
 fn parse_invalid_table_name() {
     let ast = all_dialects().run_parser_method("db.public..customer", |parser| {
@@ -593,15 +681,7 @@ fn parse_delete_statement() {
             ..
         }) => {
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::with_quote('"', "table")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![Ident::with_quote('"', "table")])),
                 from[0].relation
             );
         }
@@ -632,35 +712,25 @@ fn parse_delete_statement_for_multi_tables() {
             ..
         }) => {
             assert_eq!(
-                ObjectName(vec![Ident::new("schema1"), Ident::new("table1")]),
+                ObjectName::from(vec![Ident::new("schema1"), Ident::new("table1")]),
                 tables[0]
             );
             assert_eq!(
-                ObjectName(vec![Ident::new("schema2"), Ident::new("table2")]),
+                ObjectName::from(vec![Ident::new("schema2"), Ident::new("table2")]),
                 tables[1]
             );
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema1"), Ident::new("table1")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema1"),
+                    Ident::new("table1")
+                ])),
                 from[0].relation
             );
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema2"), Ident::new("table2")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema2"),
+                    Ident::new("table2")
+                ])),
                 from[0].joins[0].relation
             );
         }
@@ -678,51 +748,31 @@ fn parse_delete_statement_for_multi_tables_with_using() {
             ..
         }) => {
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema1"), Ident::new("table1")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema1"),
+                    Ident::new("table1")
+                ])),
                 from[0].relation
             );
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema2"), Ident::new("table2")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema2"),
+                    Ident::new("table2")
+                ])),
                 from[1].relation
             );
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema1"), Ident::new("table1")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema1"),
+                    Ident::new("table1")
+                ])),
                 using[0].relation
             );
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("schema2"), Ident::new("table2")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![
+                    Ident::new("schema2"),
+                    Ident::new("table2")
+                ])),
                 using[0].joins[0].relation
             );
         }
@@ -745,15 +795,7 @@ fn parse_where_delete_statement() {
             ..
         }) => {
             assert_eq!(
-                TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("foo")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                table_from_name(ObjectName::from(vec![Ident::new("foo")])),
                 from[0].relation,
             );
 
@@ -762,7 +804,7 @@ fn parse_where_delete_statement() {
                 Expr::BinaryOp {
                     left: Box::new(Expr::Identifier(Ident::new("name"))),
                     op: Eq,
-                    right: Box::new(Expr::Value(number("5"))),
+                    right: Box::new(Expr::value(number("5"))),
                 },
                 selection.unwrap(),
             );
@@ -788,7 +830,7 @@ fn parse_where_delete_with_alias_statement() {
         }) => {
             assert_eq!(
                 TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("basket")]),
+                    name: ObjectName::from(vec![Ident::new("basket")]),
                     alias: Some(TableAlias {
                         name: Ident::new("a"),
                         columns: vec![],
@@ -798,13 +840,16 @@ fn parse_where_delete_with_alias_statement() {
                     version: None,
                     partitions: vec![],
                     with_ordinality: false,
+                    json_path: None,
+                    sample: None,
+                    index_hints: vec![],
                 },
                 from[0].relation,
             );
             assert_eq!(
                 Some(vec![TableWithJoins {
                     relation: TableFactor::Table {
-                        name: ObjectName(vec![Ident::new("basket")]),
+                        name: ObjectName::from(vec![Ident::new("basket")]),
                         alias: Some(TableAlias {
                             name: Ident::new("b"),
                             columns: vec![],
@@ -814,6 +859,9 @@ fn parse_where_delete_with_alias_statement() {
                         version: None,
                         partitions: vec![],
                         with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
                     },
                     joins: vec![],
                 }]),
@@ -855,7 +903,12 @@ fn parse_simple_select() {
     assert!(select.distinct.is_none());
     assert_eq!(3, select.projection.len());
     let select = verified_query(sql);
-    assert_eq!(Some(Expr::Value(number("5"))), select.limit);
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("5"))),
+        offset: None,
+        limit_by: vec![],
+    };
+    assert_eq!(Some(expected_limit_clause), select.limit_clause);
 }
 
 #[test]
@@ -863,14 +916,31 @@ fn parse_limit() {
     verified_stmt("SELECT * FROM user LIMIT 1");
 }
 
+#[test]
+fn parse_invalid_limit_by() {
+    all_dialects()
+        .parse_sql_statements("SELECT * FROM user BY name")
+        .expect_err("BY without LIMIT");
+}
+
 #[test]
 fn parse_limit_is_not_an_alias() {
     // In dialects supporting LIMIT it shouldn't be parsed as a table alias
     let ast = verified_query("SELECT id FROM customer LIMIT 1");
-    assert_eq!(Some(Expr::Value(number("1"))), ast.limit);
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("1"))),
+        offset: None,
+        limit_by: vec![],
+    };
+    assert_eq!(Some(expected_limit_clause), ast.limit_clause);
 
     let ast = verified_query("SELECT 1 LIMIT 5");
-    assert_eq!(Some(Expr::Value(number("5"))), ast.limit);
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("5"))),
+        offset: None,
+        limit_by: vec![],
+    };
+    assert_eq!(Some(expected_limit_clause), ast.limit_clause);
 }
 
 #[test]
@@ -912,6 +982,44 @@ fn parse_select_distinct_tuple() {
     );
 }
 
+#[test]
+fn parse_outer_join_operator() {
+    let dialects = all_dialects_where(|d| d.supports_outer_join_operator());
+
+    let select = dialects.verified_only_select("SELECT 1 FROM T WHERE a = b (+)");
+    assert_eq!(
+        select.selection,
+        Some(Expr::BinaryOp {
+            left: Box::new(Expr::Identifier(Ident::new("a"))),
+            op: BinaryOperator::Eq,
+            right: Box::new(Expr::OuterJoin(Box::new(Expr::Identifier(Ident::new("b")))))
+        })
+    );
+
+    let select = dialects.verified_only_select("SELECT 1 FROM T WHERE t1.c1 = t2.c2.d3 (+)");
+    assert_eq!(
+        select.selection,
+        Some(Expr::BinaryOp {
+            left: Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("t1"),
+                Ident::new("c1")
+            ])),
+            op: BinaryOperator::Eq,
+            right: Box::new(Expr::OuterJoin(Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("t2"),
+                Ident::new("c2"),
+                Ident::new("d3"),
+            ]))))
+        })
+    );
+
+    let res = dialects.parse_sql_statements("SELECT 1 FROM T WHERE 1 = 2 (+)");
+    assert_eq!(
+        ParserError::ParserError("Expected: column identifier before (+), found: 2".to_string()),
+        res.unwrap_err()
+    );
+}
+
 #[test]
 fn parse_select_distinct_on() {
     let sql = "SELECT DISTINCT ON (album_id) name FROM track ORDER BY album_id, milliseconds";
@@ -969,7 +1077,7 @@ fn parse_select_into() {
             temporary: false,
             unlogged: false,
             table: false,
-            name: ObjectName(vec![Ident::new("table0")]),
+            name: ObjectName::from(vec![Ident::new("table0")]),
         },
         only(&select.into)
     );
@@ -1002,7 +1110,7 @@ fn parse_select_wildcard() {
     let select = verified_only_select(sql);
     assert_eq!(
         &SelectItem::QualifiedWildcard(
-            ObjectName(vec![Ident::new("foo")]),
+            SelectItemQualifiedWildcardKind::ObjectName(ObjectName::from(vec![Ident::new("foo")])),
             WildcardAdditionalOptions::default()
         ),
         only(&select.projection)
@@ -1012,7 +1120,10 @@ fn parse_select_wildcard() {
     let select = verified_only_select(sql);
     assert_eq!(
         &SelectItem::QualifiedWildcard(
-            ObjectName(vec![Ident::new("myschema"), Ident::new("mytable"),]),
+            SelectItemQualifiedWildcardKind::ObjectName(ObjectName::from(vec![
+                Ident::new("myschema"),
+                Ident::new("mytable"),
+            ])),
             WildcardAdditionalOptions::default(),
         ),
         only(&select.projection)
@@ -1047,7 +1158,7 @@ fn parse_column_aliases() {
     } = only(&select.projection)
     {
         assert_eq!(&BinaryOperator::Plus, op);
-        assert_eq!(&Expr::Value(number("1")), right.as_ref());
+        assert_eq!(&Expr::value(number("1")), right.as_ref());
         assert_eq!(&Ident::new("newname"), alias);
     } else {
         panic!("Expected: ExprWithAlias")
@@ -1057,6 +1168,88 @@ fn parse_column_aliases() {
     one_statement_parses_to("SELECT a.col + 1 newname FROM foo AS a", sql);
 }
 
+#[test]
+fn parse_select_expr_star() {
+    let dialects = all_dialects_where(|d| d.supports_select_expr_star());
+
+    // Identifier wildcard expansion.
+    let select = dialects.verified_only_select("SELECT foo.bar.* FROM T");
+    let SelectItem::QualifiedWildcard(SelectItemQualifiedWildcardKind::ObjectName(object_name), _) =
+        only(&select.projection)
+    else {
+        unreachable!(
+            "expected wildcard select item: got {:?}",
+            &select.projection[0]
+        )
+    };
+    assert_eq!(
+        &ObjectName::from(
+            ["foo", "bar"]
+                .into_iter()
+                .map(Ident::new)
+                .collect::<Vec<_>>()
+        ),
+        object_name
+    );
+
+    // Arbitrary compound expression with wildcard expansion.
+    let select = dialects.verified_only_select("SELECT foo - bar.* FROM T");
+    let SelectItem::QualifiedWildcard(
+        SelectItemQualifiedWildcardKind::Expr(Expr::BinaryOp { left, op, right }),
+        _,
+    ) = only(&select.projection)
+    else {
+        unreachable!(
+            "expected wildcard select item: got {:?}",
+            &select.projection[0]
+        )
+    };
+    let (Expr::Identifier(left), BinaryOperator::Minus, Expr::Identifier(right)) =
+        (left.as_ref(), op, right.as_ref())
+    else {
+        unreachable!("expected binary op expr: got {:?}", &select.projection[0])
+    };
+    assert_eq!(&Ident::new("foo"), left);
+    assert_eq!(&Ident::new("bar"), right);
+
+    // Arbitrary expression wildcard expansion.
+    let select = dialects.verified_only_select("SELECT myfunc().foo.* FROM T");
+    let SelectItem::QualifiedWildcard(
+        SelectItemQualifiedWildcardKind::Expr(Expr::CompoundFieldAccess { root, access_chain }),
+        _,
+    ) = only(&select.projection)
+    else {
+        unreachable!("expected wildcard expr: got {:?}", &select.projection[0])
+    };
+    assert!(matches!(root.as_ref(), Expr::Function(_)));
+    assert_eq!(1, access_chain.len());
+    assert!(matches!(
+        &access_chain[0],
+        AccessExpr::Dot(Expr::Identifier(_))
+    ));
+
+    dialects.one_statement_parses_to(
+        "SELECT 2. * 3 FROM T",
+        #[cfg(feature = "bigdecimal")]
+        "SELECT 2 * 3 FROM T",
+        #[cfg(not(feature = "bigdecimal"))]
+        "SELECT 2. * 3 FROM T",
+    );
+    dialects.verified_only_select("SELECT myfunc().* FROM T");
+
+    // Invalid
+    let res = dialects.parse_sql_statements("SELECT foo.*.* FROM T");
+    assert_eq!(
+        ParserError::ParserError("Expected: end of statement, found: .".to_string()),
+        res.unwrap_err()
+    );
+
+    let dialects = all_dialects_where(|d| {
+        d.supports_select_expr_star() && d.supports_select_wildcard_except()
+    });
+    dialects.verified_only_select("SELECT myfunc().* EXCEPT (foo) FROM T");
+}
+
 #[test]
 fn test_eof_after_as() {
     let res = parse_sql_statements("SELECT foo AS");
@@ -1089,7 +1282,8 @@ fn parse_select_count_wildcard() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("COUNT")]),
+            name: ObjectName::from(vec![Ident::new("COUNT")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -1111,7 +1305,8 @@ fn parse_select_count_distinct() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("COUNT")]),
+            name: ObjectName::from(vec![Ident::new("COUNT")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: Some(DuplicateTreatment::Distinct),
@@ -1194,7 +1389,7 @@ fn parse_null_in_select() {
     let sql = "SELECT NULL";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::Value(Value::Null),
+        &Expr::Value((Value::Null).with_empty_span()),
         expr_from_projection(only(&select.projection)),
     );
 }
@@ -1230,18 +1425,18 @@ fn parse_exponent_in_select() -> Result<(), ParserError> {
 
     assert_eq!(
         &vec![
-            SelectItem::UnnamedExpr(Expr::Value(number("10e-20"))),
-            SelectItem::UnnamedExpr(Expr::Value(number("1e3"))),
-            SelectItem::UnnamedExpr(Expr::Value(number("1e+3"))),
+            SelectItem::UnnamedExpr(Expr::Value((number("10e-20")).with_empty_span())),
+            SelectItem::UnnamedExpr(Expr::value(number("1e3"))),
+            SelectItem::UnnamedExpr(Expr::Value((number("1e+3")).with_empty_span())),
             SelectItem::ExprWithAlias {
-                expr: Expr::Value(number("1e3")),
+                expr: Expr::value(number("1e3")),
                 alias: Ident::new("a")
             },
             SelectItem::ExprWithAlias {
-                expr: Expr::Value(number("1")),
+                expr: Expr::value(number("1")),
                 alias: Ident::new("e")
             },
-            SelectItem::UnnamedExpr(Expr::Value(number("0.5e2"))),
+            SelectItem::UnnamedExpr(Expr::value(number("0.5e2"))),
         ],
         &select.projection
     );
@@ -1257,6 +1452,7 @@ fn parse_select_with_date_column_name() {
         &Expr::Identifier(Ident {
             value: "date".into(),
             quote_style: None,
+            span: Span::empty(),
         }),
         expr_from_projection(only(&select.projection)),
     );
@@ -1274,9 +1470,9 @@ fn parse_escaped_single_quote_string_predicate_with_escape() {
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("salary"))),
             op: NotEq,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "Jim's salary".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("Jim's salary".to_string())).with_empty_span()
+            )),
         }),
         ast.selection,
     );
@@ -1300,9 +1496,9 @@ fn parse_escaped_single_quote_string_predicate_with_no_escape() {
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("salary"))),
             op: NotEq,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "Jim''s salary".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("Jim''s salary".to_string())).with_empty_span()
+            )),
         }),
         ast.selection,
     );
@@ -1315,11 +1511,14 @@ fn parse_number() {
     #[cfg(feature = "bigdecimal")]
     assert_eq!(
         expr,
-        Expr::Value(Value::Number(bigdecimal::BigDecimal::from(1), false))
+        Expr::Value((Value::Number(bigdecimal::BigDecimal::from(1), false)).with_empty_span())
     );
 
     #[cfg(not(feature = "bigdecimal"))]
-    assert_eq!(expr, Expr::Value(Value::Number("1.0".into(), false)));
+    assert_eq!(
+        expr,
+        Expr::Value((Value::Number("1.0".into(), false)).with_empty_span())
+    );
 }
 
 #[test]
@@ -1458,49 +1657,226 @@ fn parse_json_ops_without_colon() {
 }
 
 #[test]
-fn parse_mod_no_spaces() {
-    use self::Expr::*;
-    let canonical = "a1 % b1";
-    let sqls = ["a1 % b1", "a1% b1", "a1 %b1", "a1%b1"];
-    for sql in sqls {
-        println!("Parsing {sql}");
-        assert_eq!(
-            BinaryOp {
-                left: Box::new(Identifier(Ident::new("a1"))),
-                op: BinaryOperator::Modulo,
-                right: Box::new(Identifier(Ident::new("b1"))),
-            },
-            pg_and_generic().expr_parses_to(sql, canonical)
-        );
+fn parse_json_object() {
+    let dialects = TestedDialects::new(vec![
+        Box::new(MsSqlDialect {}),
+        Box::new(PostgreSqlDialect {}),
+    ]);
+    let select = dialects.verified_only_select("SELECT JSON_OBJECT('name' : 'value', 'type' : 1)");
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, .. }),
+            ..
+        }) => assert_eq!(
+            &[
+                FunctionArg::ExprNamed {
+                    name: Expr::Value((Value::SingleQuotedString("name".into())).with_empty_span()),
+                    arg: FunctionArgExpr::Expr(Expr::Value(
+                        (Value::SingleQuotedString("value".into())).with_empty_span()
+                    )),
+                    operator: FunctionArgOperator::Colon
+                },
+                FunctionArg::ExprNamed {
+                    name: Expr::Value((Value::SingleQuotedString("type".into())).with_empty_span()),
+                    arg: FunctionArgExpr::Expr(Expr::value(number("1"))),
+                    operator: FunctionArgOperator::Colon
+                }
+            ],
+            &args[..]
+        ),
+        _ => unreachable!(),
     }
-}
-
-#[test]
-fn parse_is_null() {
-    use self::Expr::*;
-    let sql = "a IS NULL";
-    assert_eq!(
-        IsNull(Box::new(Identifier(Ident::new("a")))),
-        verified_expr(sql)
-    );
-}
-
-#[test]
-fn parse_is_not_null() {
-    use self::Expr::*;
-    let sql = "a IS NOT NULL";
-    assert_eq!(
-        IsNotNull(Box::new(Identifier(Ident::new("a")))),
-        verified_expr(sql)
-    );
-}
-
-#[test]
-fn parse_is_distinct_from() {
-    use self::Expr::*;
-    let sql = "a IS DISTINCT FROM b";
-    assert_eq!(
-        IsDistinctFrom(
+    let select = dialects
+        .verified_only_select("SELECT JSON_OBJECT('name' : 'value', 'type' : NULL ABSENT ON NULL)");
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
+            ..
+        }) => {
+            assert_eq!(
+                &[
+                    FunctionArg::ExprNamed {
+                        name: Expr::Value(
+                            (Value::SingleQuotedString("name".into())).with_empty_span()
+                        ),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("value".into())).with_empty_span()
+                        )),
+                        operator: FunctionArgOperator::Colon
+                    },
+                    FunctionArg::ExprNamed {
+                        name: Expr::Value(
+                            (Value::SingleQuotedString("type".into())).with_empty_span()
+                        ),
+                        arg: FunctionArgExpr::Expr(Expr::Value((Value::Null).with_empty_span())),
+                        operator: FunctionArgOperator::Colon
+                    }
+                ],
+                &args[..]
+            );
+            assert_eq!(
+                &[FunctionArgumentClause::JsonNullClause(
+                    JsonNullClause::AbsentOnNull
+                )],
+                &clauses[..]
+            );
+        }
+        _ => unreachable!(),
+    }
+    let select = dialects.verified_only_select("SELECT JSON_OBJECT(NULL ON NULL)");
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
+            ..
+        }) => {
+            assert!(args.is_empty());
+            assert_eq!(
+                &[FunctionArgumentClause::JsonNullClause(
+                    JsonNullClause::NullOnNull
+                )],
+                &clauses[..]
+            );
+        }
+        _ => unreachable!(),
+    }
+    let select = dialects.verified_only_select("SELECT JSON_OBJECT(ABSENT ON NULL)");
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
+            ..
+        }) => {
+            assert!(args.is_empty());
+            assert_eq!(
+                &[FunctionArgumentClause::JsonNullClause(
+                    JsonNullClause::AbsentOnNull
+                )],
+                &clauses[..]
+            );
+        }
+        _ => unreachable!(),
+    }
+    let select = dialects.verified_only_select(
+        "SELECT JSON_OBJECT('name' : 'value', 'type' : JSON_ARRAY(1, 2) ABSENT ON NULL)",
+    );
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
+            ..
+        }) => {
+            assert_eq!(
+                &FunctionArg::ExprNamed {
+                    name: Expr::Value((Value::SingleQuotedString("name".into())).with_empty_span()),
+                    arg: FunctionArgExpr::Expr(Expr::Value(
+                        (Value::SingleQuotedString("value".into())).with_empty_span()
+                    )),
+                    operator: FunctionArgOperator::Colon
+                },
+                &args[0]
+            );
+            assert!(matches!(
+                args[1],
+                FunctionArg::ExprNamed {
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
+                    arg: FunctionArgExpr::Expr(Expr::Function(_)),
+                    operator: FunctionArgOperator::Colon
+                }
+            ));
+            assert_eq!(
+                &[FunctionArgumentClause::JsonNullClause(
+                    JsonNullClause::AbsentOnNull
+                )],
+                &clauses[..]
+            );
+        }
+        _ => unreachable!(),
+    }
+    let select = dialects.verified_only_select(
+        "SELECT JSON_OBJECT('name' : 'value', 'type' : JSON_OBJECT('type_id' : 1, 'name' : 'a') NULL ON NULL)",
+    );
+    match expr_from_projection(&select.projection[0]) {
+        Expr::Function(Function {
+            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
+            ..
+        }) => {
+            assert_eq!(
+                &FunctionArg::ExprNamed {
+                    name: Expr::Value((Value::SingleQuotedString("name".into())).with_empty_span()),
+                    arg: FunctionArgExpr::Expr(Expr::Value(
+                        (Value::SingleQuotedString("value".into())).with_empty_span()
+                    )),
+                    operator: FunctionArgOperator::Colon
+                },
+                &args[0]
+            );
+            assert!(matches!(
+                args[1],
+                FunctionArg::ExprNamed {
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
+                    arg: FunctionArgExpr::Expr(Expr::Function(_)),
+                    operator: FunctionArgOperator::Colon
+                }
+            ));
+            assert_eq!(
+                &[FunctionArgumentClause::JsonNullClause(
+                    JsonNullClause::NullOnNull
+                )],
+                &clauses[..]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_mod_no_spaces() {
+    use self::Expr::*;
+    let canonical = "a1 % b1";
+    let sqls = ["a1 % b1", "a1% b1", "a1 %b1", "a1%b1"];
+    for sql in sqls {
+        println!("Parsing {sql}");
+        assert_eq!(
+            BinaryOp {
+                left: Box::new(Identifier(Ident::new("a1"))),
+                op: BinaryOperator::Modulo,
+                right: Box::new(Identifier(Ident::new("b1"))),
+            },
+            pg_and_generic().expr_parses_to(sql, canonical)
+        );
+    }
+}
+
+#[test]
+fn parse_is_null() {
+    use self::Expr::*;
+    let sql = "a IS NULL";
+    assert_eq!(
+        IsNull(Box::new(Identifier(Ident::new("a")))),
+        verified_expr(sql)
+    );
+}
+
+#[test]
+fn parse_is_not_null() {
+    use self::Expr::*;
+    let sql = "a IS NOT NULL";
+    assert_eq!(
+        IsNotNull(Box::new(Identifier(Ident::new("a")))),
+        verified_expr(sql)
+    );
+}
+
+#[test]
+fn parse_is_distinct_from() {
+    use self::Expr::*;
+    let sql = "a IS DISTINCT FROM b";
+    assert_eq!(
+        IsDistinctFrom(
             Box::new(Identifier(Ident::new("a"))),
             Box::new(Identifier(Ident::new("b"))),
         ),
@@ -1550,9 +1926,9 @@ fn parse_not_precedence() {
         Expr::UnaryOp {
             op: UnaryOperator::Not,
             expr: Box::new(Expr::Between {
-                expr: Box::new(Expr::Value(number("1"))),
-                low: Box::new(Expr::Value(number("1"))),
-                high: Box::new(Expr::Value(number("2"))),
+                expr: Box::new(Expr::value(number("1"))),
+                low: Box::new(Expr::value(number("1"))),
+                high: Box::new(Expr::value(number("2"))),
                 negated: true,
             }),
         },
@@ -1565,9 +1941,13 @@ fn parse_not_precedence() {
         Expr::UnaryOp {
             op: UnaryOperator::Not,
             expr: Box::new(Expr::Like {
-                expr: Box::new(Expr::Value(Value::SingleQuotedString("a".into()))),
+                expr: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("a".into())).with_empty_span()
+                )),
                 negated: true,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("b".into()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("b".into())).with_empty_span()
+                )),
                 escape_char: None,
                 any: false,
             }),
@@ -1582,7 +1962,9 @@ fn parse_not_precedence() {
             op: UnaryOperator::Not,
             expr: Box::new(Expr::InList {
                 expr: Box::new(Expr::Identifier("a".into())),
-                list: vec![Expr::Value(Value::SingleQuotedString("a".into()))],
+                list: vec![Expr::Value(
+                    (Value::SingleQuotedString("a".into())).with_empty_span()
+                )],
                 negated: true,
             }),
         },
@@ -1602,12 +1984,13 @@ fn parse_null_like() {
                 expr: Box::new(Expr::Identifier(Ident::new("column1"))),
                 any: false,
                 negated: false,
-                pattern: Box::new(Expr::Value(Value::Null)),
+                pattern: Box::new(Expr::Value((Value::Null).with_empty_span())),
                 escape_char: None,
             },
             alias: Ident {
                 value: "col_null".to_owned(),
                 quote_style: None,
+                span: Span::empty(),
             },
         },
         select.projection[0]
@@ -1615,7 +1998,7 @@ fn parse_null_like() {
     assert_eq!(
         SelectItem::ExprWithAlias {
             expr: Expr::Like {
-                expr: Box::new(Expr::Value(Value::Null)),
+                expr: Box::new(Expr::Value((Value::Null).with_empty_span())),
                 any: false,
                 negated: false,
                 pattern: Box::new(Expr::Identifier(Ident::new("column1"))),
@@ -1624,6 +2007,7 @@ fn parse_null_like() {
             alias: Ident {
                 value: "null_col".to_owned(),
                 quote_style: None,
+                span: Span::empty(),
             },
         },
         select.projection[1]
@@ -1642,7 +2026,9 @@ fn parse_ilike() {
             Expr::ILike {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
                 escape_char: None,
                 any: false,
             },
@@ -1659,8 +2045,10 @@ fn parse_ilike() {
             Expr::ILike {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
-                escape_char: Some('^'.to_string()),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
+                escape_char: Some(Value::SingleQuotedString('^'.to_string())),
                 any: false,
             },
             select.selection.unwrap()
@@ -1677,7 +2065,9 @@ fn parse_ilike() {
             Expr::IsNull(Box::new(Expr::ILike {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
                 escape_char: None,
                 any: false,
             })),
@@ -1700,7 +2090,9 @@ fn parse_like() {
             Expr::Like {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
                 escape_char: None,
                 any: false,
             },
@@ -1717,8 +2109,10 @@ fn parse_like() {
             Expr::Like {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
-                escape_char: Some('^'.to_string()),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
+                escape_char: Some(Value::SingleQuotedString('^'.to_string())),
                 any: false,
             },
             select.selection.unwrap()
@@ -1735,7 +2129,9 @@ fn parse_like() {
             Expr::IsNull(Box::new(Expr::Like {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
                 escape_char: None,
                 any: false,
             })),
@@ -1758,7 +2154,9 @@ fn parse_similar_to() {
             Expr::SimilarTo {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
                 escape_char: None,
             },
             select.selection.unwrap()
@@ -1774,8 +2172,27 @@ fn parse_similar_to() {
             Expr::SimilarTo {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
-                escape_char: Some('^'.to_string()),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
+                escape_char: Some(Value::SingleQuotedString('^'.to_string())),
+            },
+            select.selection.unwrap()
+        );
+
+        let sql = &format!(
+            "SELECT * FROM customers WHERE name {}SIMILAR TO '%a' ESCAPE NULL",
+            if negated { "NOT " } else { "" }
+        );
+        let select = verified_only_select(sql);
+        assert_eq!(
+            Expr::SimilarTo {
+                expr: Box::new(Expr::Identifier(Ident::new("name"))),
+                negated,
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
+                escape_char: Some(Value::Null),
             },
             select.selection.unwrap()
         );
@@ -1790,8 +2207,10 @@ fn parse_similar_to() {
             Expr::IsNull(Box::new(Expr::SimilarTo {
                 expr: Box::new(Expr::Identifier(Ident::new("name"))),
                 negated,
-                pattern: Box::new(Expr::Value(Value::SingleQuotedString("%a".to_string()))),
-                escape_char: Some('^'.to_string()),
+                pattern: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("%a".to_string())).with_empty_span()
+                )),
+                escape_char: Some(Value::SingleQuotedString('^'.to_string())),
             })),
             select.selection.unwrap()
         );
@@ -1812,8 +2231,8 @@ fn parse_in_list() {
             Expr::InList {
                 expr: Box::new(Expr::Identifier(Ident::new("segment"))),
                 list: vec![
-                    Expr::Value(Value::SingleQuotedString("HIGH".to_string())),
-                    Expr::Value(Value::SingleQuotedString("MED".to_string())),
+                    Expr::Value((Value::SingleQuotedString("HIGH".to_string())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("MED".to_string())).with_empty_span()),
                 ],
                 negated,
             },
@@ -1838,6 +2257,22 @@ fn parse_in_subquery() {
     );
 }
 
+#[test]
+fn parse_in_union() {
+    let sql = "SELECT * FROM customers WHERE segment IN ((SELECT segm FROM bar) UNION (SELECT segm FROM bar2))";
+    let select = verified_only_select(sql);
+    assert_eq!(
+        Expr::InSubquery {
+            expr: Box::new(Expr::Identifier(Ident::new("segment"))),
+            subquery: Box::new(verified_query(
+                "(SELECT segm FROM bar) UNION (SELECT segm FROM bar2)"
+            )),
+            negated: false,
+        },
+        select.selection.unwrap()
+    );
+}
+
 #[test]
 fn parse_in_unnest() {
     fn chk(negated: bool) {
@@ -1955,8 +2390,8 @@ fn parse_between() {
         assert_eq!(
             Expr::Between {
                 expr: Box::new(Expr::Identifier(Ident::new("age"))),
-                low: Box::new(Expr::Value(number("25"))),
-                high: Box::new(Expr::Value(number("32"))),
+                low: Box::new(Expr::value(number("25"))),
+                high: Box::new(Expr::value(number("32"))),
                 negated,
             },
             select.selection.unwrap()
@@ -1973,16 +2408,16 @@ fn parse_between_with_expr() {
     let select = verified_only_select(sql);
     assert_eq!(
         Expr::IsNull(Box::new(Expr::Between {
-            expr: Box::new(Expr::Value(number("1"))),
+            expr: Box::new(Expr::value(number("1"))),
             low: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("1"))),
+                left: Box::new(Expr::value(number("1"))),
                 op: Plus,
-                right: Box::new(Expr::Value(number("2"))),
+                right: Box::new(Expr::value(number("2"))),
             }),
             high: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("3"))),
+                left: Box::new(Expr::value(number("3"))),
                 op: Plus,
-                right: Box::new(Expr::Value(number("4"))),
+                right: Box::new(Expr::value(number("4"))),
             }),
             negated: false,
         })),
@@ -1994,19 +2429,19 @@ fn parse_between_with_expr() {
     assert_eq!(
         Expr::BinaryOp {
             left: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("1"))),
+                left: Box::new(Expr::value(number("1"))),
                 op: BinaryOperator::Eq,
-                right: Box::new(Expr::Value(number("1"))),
+                right: Box::new(Expr::value(number("1"))),
             }),
             op: BinaryOperator::And,
             right: Box::new(Expr::Between {
                 expr: Box::new(Expr::BinaryOp {
-                    left: Box::new(Expr::Value(number("1"))),
+                    left: Box::new(Expr::value(number("1"))),
                     op: BinaryOperator::Plus,
                     right: Box::new(Expr::Identifier(Ident::new("x"))),
                 }),
-                low: Box::new(Expr::Value(number("1"))),
-                high: Box::new(Expr::Value(number("2"))),
+                low: Box::new(Expr::value(number("1"))),
+                high: Box::new(Expr::value(number("2"))),
                 negated: false,
             }),
         },
@@ -2021,13 +2456,15 @@ fn parse_tuples() {
     assert_eq!(
         vec![
             SelectItem::UnnamedExpr(Expr::Tuple(vec![
-                Expr::Value(number("1")),
-                Expr::Value(number("2")),
+                Expr::value(number("1")),
+                Expr::value(number("2")),
             ])),
-            SelectItem::UnnamedExpr(Expr::Nested(Box::new(Expr::Value(number("1"))))),
+            SelectItem::UnnamedExpr(Expr::Nested(Box::new(Expr::Value(
+                (number("1")).with_empty_span()
+            )))),
             SelectItem::UnnamedExpr(Expr::Tuple(vec![
-                Expr::Value(Value::SingleQuotedString("foo".into())),
-                Expr::Value(number("3")),
+                Expr::Value((Value::SingleQuotedString("foo".into())).with_empty_span()),
+                Expr::value(number("3")),
                 Expr::Identifier(Ident::new("baz")),
             ])),
         ],
@@ -2057,27 +2494,33 @@ fn parse_select_order_by() {
     fn chk(sql: &str) {
         let select = verified_query(sql);
         assert_eq!(
-            vec![
+            OrderByKind::Expressions(vec![
                 OrderByExpr {
                     expr: Expr::Identifier(Ident::new("lname")),
-                    asc: Some(true),
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: Some(true),
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 },
                 OrderByExpr {
                     expr: Expr::Identifier(Ident::new("fname")),
-                    asc: Some(false),
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: Some(false),
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 },
                 OrderByExpr {
                     expr: Expr::Identifier(Ident::new("id")),
-                    asc: None,
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: None,
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 },
-            ],
-            select.order_by.expect("ORDER BY expected").exprs
+            ]),
+            select.order_by.expect("ORDER BY expected").kind
         );
     }
     chk("SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY lname ASC, fname DESC, id");
@@ -2092,23 +2535,164 @@ fn parse_select_order_by_limit() {
                ORDER BY lname ASC, fname DESC LIMIT 2";
     let select = verified_query(sql);
     assert_eq!(
-        vec![
+        OrderByKind::Expressions(vec![
             OrderByExpr {
                 expr: Expr::Identifier(Ident::new("lname")),
-                asc: Some(true),
-                nulls_first: None,
+                options: OrderByOptions {
+                    asc: Some(true),
+                    nulls_first: None,
+                },
                 with_fill: None,
             },
             OrderByExpr {
                 expr: Expr::Identifier(Ident::new("fname")),
-                asc: Some(false),
-                nulls_first: None,
+                options: OrderByOptions {
+                    asc: Some(false),
+                    nulls_first: None,
+                },
                 with_fill: None,
             },
-        ],
-        select.order_by.expect("ORDER BY expected").exprs
+        ]),
+        select.order_by.expect("ORDER BY expected").kind
     );
-    assert_eq!(Some(Expr::Value(number("2"))), select.limit);
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("2"))),
+        offset: None,
+        limit_by: vec![],
+    };
+    assert_eq!(Some(expected_limit_clause), select.limit_clause);
+}
+
+#[test]
+fn parse_select_order_by_all() {
+    fn chk(sql: &str, except_order_by: OrderByKind) {
+        let dialects = all_dialects_where(|d| d.supports_order_by_all());
+        let select = dialects.verified_query(sql);
+        assert_eq!(
+            except_order_by,
+            select.order_by.expect("ORDER BY expected").kind
+        );
+    }
+    let test_cases = [
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL",
+            OrderByKind::All(OrderByOptions {
+                asc: None,
+                nulls_first: None,
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL NULLS FIRST",
+            OrderByKind::All(OrderByOptions {
+                asc: None,
+                nulls_first: Some(true),
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL NULLS LAST",
+            OrderByKind::All(OrderByOptions {
+                asc: None,
+                nulls_first: Some(false),
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer ORDER BY ALL ASC",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(true),
+                nulls_first: None,
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer ORDER BY ALL ASC NULLS FIRST",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(true),
+                nulls_first: Some(true),
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer ORDER BY ALL ASC NULLS LAST",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(true),
+                nulls_first: Some(false),
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL DESC",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(false),
+                nulls_first: None,
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL DESC NULLS FIRST",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(false),
+                nulls_first: Some(true),
+            }),
+        ),
+        (
+            "SELECT id, fname, lname FROM customer WHERE id < 5 ORDER BY ALL DESC NULLS LAST",
+            OrderByKind::All(OrderByOptions {
+                asc: Some(false),
+                nulls_first: Some(false),
+            }),
+        ),
+    ];
+
+    for (sql, expected_order_by) in test_cases {
+        chk(sql, expected_order_by);
+    }
+}
+
+#[test]
+fn parse_select_order_by_not_support_all() {
+    fn chk(sql: &str, except_order_by: OrderByKind) {
+        let dialects = all_dialects_where(|d| !d.supports_order_by_all());
+        let select = dialects.verified_query(sql);
+        assert_eq!(
+            except_order_by,
+            select.order_by.expect("ORDER BY expected").kind
+        );
+    }
+    let test_cases = [
+        (
+            "SELECT id, ALL FROM customer WHERE id < 5 ORDER BY ALL",
+            OrderByKind::Expressions(vec![OrderByExpr {
+                expr: Expr::Identifier(Ident::new("ALL")),
+                options: OrderByOptions {
+                    asc: None,
+                    nulls_first: None,
+                },
+                with_fill: None,
+            }]),
+        ),
+        (
+            "SELECT id, ALL FROM customer ORDER BY ALL ASC NULLS FIRST",
+            OrderByKind::Expressions(vec![OrderByExpr {
+                expr: Expr::Identifier(Ident::new("ALL")),
+                options: OrderByOptions {
+                    asc: Some(true),
+                    nulls_first: Some(true),
+                },
+                with_fill: None,
+            }]),
+        ),
+        (
+            "SELECT id, ALL FROM customer ORDER BY ALL DESC NULLS LAST",
+            OrderByKind::Expressions(vec![OrderByExpr {
+                expr: Expr::Identifier(Ident::new("ALL")),
+                options: OrderByOptions {
+                    asc: Some(false),
+                    nulls_first: Some(false),
+                },
+                with_fill: None,
+            }]),
+        ),
+    ];
+
+    for (sql, expected_order_by) in test_cases {
+        chk(sql, expected_order_by);
+    }
 }
 
 #[test]
@@ -2117,23 +2701,32 @@ fn parse_select_order_by_nulls_order() {
                ORDER BY lname ASC NULLS FIRST, fname DESC NULLS LAST LIMIT 2";
     let select = verified_query(sql);
     assert_eq!(
-        vec![
+        OrderByKind::Expressions(vec![
             OrderByExpr {
                 expr: Expr::Identifier(Ident::new("lname")),
-                asc: Some(true),
-                nulls_first: Some(true),
+                options: OrderByOptions {
+                    asc: Some(true),
+                    nulls_first: Some(true),
+                },
                 with_fill: None,
             },
             OrderByExpr {
                 expr: Expr::Identifier(Ident::new("fname")),
-                asc: Some(false),
-                nulls_first: Some(false),
+                options: OrderByOptions {
+                    asc: Some(false),
+                    nulls_first: Some(false),
+                },
                 with_fill: None,
             },
-        ],
-        select.order_by.expect("ORDER BY expeccted").exprs
+        ]),
+        select.order_by.expect("ORDER BY expeccted").kind
     );
-    assert_eq!(Some(Expr::Value(number("2"))), select.limit);
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("2"))),
+        offset: None,
+        limit_by: vec![],
+    };
+    assert_eq!(Some(expected_limit_clause), select.limit_clause);
 }
 
 #[test]
@@ -2170,6 +2763,124 @@ fn parse_select_group_by_all() {
     );
 }
 
+#[test]
+fn parse_group_by_with_modifier() {
+    let clauses = ["x", "a, b", "ALL"];
+    let modifiers = [
+        "WITH ROLLUP",
+        "WITH CUBE",
+        "WITH TOTALS",
+        "WITH ROLLUP WITH CUBE",
+    ];
+    let expected_modifiers = [
+        vec![GroupByWithModifier::Rollup],
+        vec![GroupByWithModifier::Cube],
+        vec![GroupByWithModifier::Totals],
+        vec![GroupByWithModifier::Rollup, GroupByWithModifier::Cube],
+    ];
+    let dialects = all_dialects_where(|d| d.supports_group_by_with_modifier());
+
+    for clause in &clauses {
+        for (modifier, expected_modifier) in modifiers.iter().zip(expected_modifiers.iter()) {
+            let sql = format!("SELECT * FROM t GROUP BY {clause} {modifier}");
+            match dialects.verified_stmt(&sql) {
+                Statement::Query(query) => {
+                    let group_by = &query.body.as_select().unwrap().group_by;
+                    if clause == &"ALL" {
+                        assert_eq!(group_by, &GroupByExpr::All(expected_modifier.to_vec()));
+                    } else {
+                        assert_eq!(
+                            group_by,
+                            &GroupByExpr::Expressions(
+                                clause
+                                    .split(", ")
+                                    .map(|c| Identifier(Ident::new(c)))
+                                    .collect(),
+                                expected_modifier.to_vec()
+                            )
+                        );
+                    }
+                }
+                _ => unreachable!(),
+            }
+        }
+    }
+
+    // invalid cases
+    let invalid_cases = [
+        "SELECT * FROM t GROUP BY x WITH",
+        "SELECT * FROM t GROUP BY x WITH ROLLUP CUBE",
+        "SELECT * FROM t GROUP BY x WITH WITH ROLLUP",
+        "SELECT * FROM t GROUP BY WITH ROLLUP",
+    ];
+    for sql in invalid_cases {
+        dialects
+            .parse_sql_statements(sql)
+            .expect_err("Expected: one of ROLLUP or CUBE or TOTALS, found: WITH");
+    }
+}
+
+#[test]
+fn parse_group_by_special_grouping_sets() {
+    let sql = "SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ((a, b), (a), (b), ())";
+    match all_dialects().verified_stmt(sql) {
+        Statement::Query(query) => {
+            let group_by = &query.body.as_select().unwrap().group_by;
+            assert_eq!(
+                group_by,
+                &GroupByExpr::Expressions(
+                    vec![
+                        Expr::Identifier(Ident::new("a")),
+                        Expr::Identifier(Ident::new("b"))
+                    ],
+                    vec![GroupByWithModifier::GroupingSets(Expr::GroupingSets(vec![
+                        vec![
+                            Expr::Identifier(Ident::new("a")),
+                            Expr::Identifier(Ident::new("b"))
+                        ],
+                        vec![Expr::Identifier(Ident::new("a")),],
+                        vec![Expr::Identifier(Ident::new("b"))],
+                        vec![]
+                    ]))]
+                )
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_group_by_grouping_sets_single_values() {
+    let sql = "SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ((a, b), a, (b), c, ())";
+    let canonical =
+        "SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ((a, b), (a), (b), (c), ())";
+    match all_dialects().one_statement_parses_to(sql, canonical) {
+        Statement::Query(query) => {
+            let group_by = &query.body.as_select().unwrap().group_by;
+            assert_eq!(
+                group_by,
+                &GroupByExpr::Expressions(
+                    vec![
+                        Expr::Identifier(Ident::new("a")),
+                        Expr::Identifier(Ident::new("b"))
+                    ],
+                    vec![GroupByWithModifier::GroupingSets(Expr::GroupingSets(vec![
+                        vec![
+                            Expr::Identifier(Ident::new("a")),
+                            Expr::Identifier(Ident::new("b"))
+                        ],
+                        vec![Expr::Identifier(Ident::new("a"))],
+                        vec![Expr::Identifier(Ident::new("b"))],
+                        vec![Expr::Identifier(Ident::new("c"))],
+                        vec![]
+                    ]))]
+                )
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
 #[test]
 fn parse_select_having() {
     let sql = "SELECT foo FROM bar GROUP BY foo HAVING COUNT(*) > 1";
@@ -2177,7 +2888,8 @@ fn parse_select_having() {
     assert_eq!(
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Function(Function {
-                name: ObjectName(vec![Ident::new("COUNT")]),
+                name: ObjectName::from(vec![Ident::new("COUNT")]),
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::List(FunctionArgumentList {
                     duplicate_treatment: None,
@@ -2190,7 +2902,7 @@ fn parse_select_having() {
                 within_group: vec![]
             })),
             op: BinaryOperator::Gt,
-            right: Box::new(Expr::Value(number("1"))),
+            right: Box::new(Expr::value(number("1"))),
         }),
         select.having
     );
@@ -2207,7 +2919,8 @@ fn parse_select_qualify() {
     assert_eq!(
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Function(Function {
-                name: ObjectName(vec![Ident::new("ROW_NUMBER")]),
+                name: ObjectName::from(vec![Ident::new("ROW_NUMBER")]),
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::List(FunctionArgumentList {
                     duplicate_treatment: None,
@@ -2221,8 +2934,10 @@ fn parse_select_qualify() {
                     partition_by: vec![Expr::Identifier(Ident::new("p"))],
                     order_by: vec![OrderByExpr {
                         expr: Expr::Identifier(Ident::new("o")),
-                        asc: None,
-                        nulls_first: None,
+                        options: OrderByOptions {
+                            asc: None,
+                            nulls_first: None,
+                        },
                         with_fill: None,
                     }],
                     window_frame: None,
@@ -2230,7 +2945,7 @@ fn parse_select_qualify() {
                 within_group: vec![]
             })),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(number("1"))),
+            right: Box::new(Expr::value(number("1"))),
         }),
         select.qualify
     );
@@ -2241,7 +2956,7 @@ fn parse_select_qualify() {
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("row_num"))),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(number("1"))),
+            right: Box::new(Expr::value(number("1"))),
         }),
         select.qualify
     );
@@ -2253,6 +2968,14 @@ fn parse_limit_accepts_all() {
         "SELECT id, fname, lname FROM customer WHERE id = 1 LIMIT ALL",
         "SELECT id, fname, lname FROM customer WHERE id = 1",
     );
+    one_statement_parses_to(
+        "SELECT id, fname, lname FROM customer WHERE id = 1 LIMIT ALL OFFSET 1",
+        "SELECT id, fname, lname FROM customer WHERE id = 1 OFFSET 1",
+    );
+    one_statement_parses_to(
+        "SELECT id, fname, lname FROM customer WHERE id = 1 OFFSET 1 LIMIT ALL",
+        "SELECT id, fname, lname FROM customer WHERE id = 1 OFFSET 1",
+    );
 }
 
 #[test]
@@ -2354,7 +3077,7 @@ fn parse_cast() {
         &Expr::Cast {
             kind: CastKind::Cast,
             expr: Box::new(Expr::Identifier(Ident::new("id"))),
-            data_type: DataType::Varbinary(Some(50)),
+            data_type: DataType::Varbinary(Some(BinaryLength::IntegerLength { length: 50 })),
             format: None,
         },
         expr_from_projection(only(&select.projection))
@@ -2613,7 +3336,8 @@ fn parse_listagg() {
 
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("LISTAGG")]),
+            name: ObjectName::from(vec![Ident::new("LISTAGG")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: Some(DuplicateTreatment::Distinct),
@@ -2622,14 +3346,14 @@ fn parse_listagg() {
                         "dateid"
                     )))),
                     FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                        Value::SingleQuotedString(", ".to_owned())
+                        (Value::SingleQuotedString(", ".to_owned())).with_empty_span()
                     )))
                 ],
                 clauses: vec![FunctionArgumentClause::OnOverflow(
                     ListAggOnOverflow::Truncate {
-                        filler: Some(Box::new(Expr::Value(Value::SingleQuotedString(
-                            "%".to_string(),
-                        )))),
+                        filler: Some(Box::new(Expr::Value(
+                            (Value::SingleQuotedString("%".to_string(),)).with_empty_span()
+                        ))),
                         with_count: false,
                     }
                 )],
@@ -2642,18 +3366,24 @@ fn parse_listagg() {
                     expr: Expr::Identifier(Ident {
                         value: "id".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    asc: None,
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: None,
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 },
                 OrderByExpr {
                     expr: Expr::Identifier(Ident {
                         value: "username".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     }),
-                    asc: None,
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: None,
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 },
             ]
@@ -2765,7 +3495,10 @@ fn parse_window_function_null_treatment_arg() {
         let SelectItem::UnnamedExpr(Expr::Function(actual)) = &projection[i] else {
             unreachable!()
         };
-        assert_eq!(ObjectName(vec![Ident::new("FIRST_VALUE")]), actual.name);
+        assert_eq!(
+            ObjectName::from(vec![Ident::new("FIRST_VALUE")]),
+            actual.name
+        );
         let FunctionArguments::List(arg_list) = &actual.args else {
             panic!("expected argument list")
         };
@@ -2806,6 +3539,138 @@ fn parse_window_function_null_treatment_arg() {
     );
 }
 
+#[test]
+fn test_compound_expr() {
+    let supported_dialects = TestedDialects::new(vec![
+        Box::new(GenericDialect {}),
+        Box::new(DuckDbDialect {}),
+        Box::new(BigQueryDialect {}),
+    ]);
+    let sqls = [
+        "SELECT abc[1].f1 FROM t",
+        "SELECT abc[1].f1.f2 FROM t",
+        "SELECT f1.abc[1] FROM t",
+        "SELECT f1.f2.abc[1] FROM t",
+        "SELECT f1.abc[1].f2 FROM t",
+        "SELECT named_struct('a', 1, 'b', 2).a",
+        "SELECT named_struct('a', 1, 'b', 2).a",
+        "SELECT make_array(1, 2, 3)[1]",
+        "SELECT make_array(named_struct('a', 1))[1].a",
+        "SELECT abc[1][-1].a.b FROM t",
+        "SELECT abc[1][-1].a.b[1] FROM t",
+    ];
+    for sql in sqls {
+        supported_dialects.verified_stmt(sql);
+    }
+}
+
+#[test]
+fn test_double_value() {
+    let dialects = all_dialects();
+    let test_cases = vec![
+        gen_number_case_with_sign("0."),
+        gen_number_case_with_sign("0.0"),
+        gen_number_case_with_sign("0000."),
+        gen_number_case_with_sign("0000.00"),
+        gen_number_case_with_sign(".0"),
+        gen_number_case_with_sign(".00"),
+        gen_number_case_with_sign("0e0"),
+        gen_number_case_with_sign("0e+0"),
+        gen_number_case_with_sign("0e-0"),
+        gen_number_case_with_sign("0.e-0"),
+        gen_number_case_with_sign("0.e+0"),
+        gen_number_case_with_sign(".0e-0"),
+        gen_number_case_with_sign(".0e+0"),
+        gen_number_case_with_sign("00.0e+0"),
+        gen_number_case_with_sign("00.0e-0"),
+    ];
+
+    for (input, expected) in test_cases {
+        for (i, expr) in input.iter().enumerate() {
+            if let Statement::Query(query) =
+                dialects.one_statement_parses_to(&format!("SELECT {expr}"), "")
+            {
+                if let SetExpr::Select(select) = *query.body {
+                    assert_eq!(expected[i], select.projection[0]);
+                } else {
+                    panic!("Expected a SELECT statement");
+                }
+            } else {
+                panic!("Expected a SELECT statement");
+            }
+        }
+    }
+}
+
+fn gen_number_case(value: &str) -> (Vec<String>, Vec<SelectItem>) {
+    let input = vec![
+        value.to_string(),
+        format!("{} col_alias", value),
+        format!("{} AS col_alias", value),
+    ];
+    let expected = vec![
+        SelectItem::UnnamedExpr(Expr::value(number(value))),
+        SelectItem::ExprWithAlias {
+            expr: Expr::value(number(value)),
+            alias: Ident::new("col_alias"),
+        },
+        SelectItem::ExprWithAlias {
+            expr: Expr::value(number(value)),
+            alias: Ident::new("col_alias"),
+        },
+    ];
+    (input, expected)
+}
+
+fn gen_sign_number_case(value: &str, op: UnaryOperator) -> (Vec<String>, Vec<SelectItem>) {
+    match op {
+        UnaryOperator::Plus | UnaryOperator::Minus => {}
+        _ => panic!("Invalid sign"),
+    }
+
+    let input = vec![
+        format!("{}{}", op, value),
+        format!("{}{} col_alias", op, value),
+        format!("{}{} AS col_alias", op, value),
+    ];
+    let expected = vec![
+        SelectItem::UnnamedExpr(Expr::UnaryOp {
+            op,
+            expr: Box::new(Expr::value(number(value))),
+        }),
+        SelectItem::ExprWithAlias {
+            expr: Expr::UnaryOp {
+                op,
+                expr: Box::new(Expr::value(number(value))),
+            },
+            alias: Ident::new("col_alias"),
+        },
+        SelectItem::ExprWithAlias {
+            expr: Expr::UnaryOp {
+                op,
+                expr: Box::new(Expr::value(number(value))),
+            },
+            alias: Ident::new("col_alias"),
+        },
+    ];
+    (input, expected)
+}
+
+/// generate the test cases for signed and unsigned numbers
+/// For example, given "0.0", the test cases will be:
+/// - "0.0"
+/// - "+0.0"
+/// - "-0.0"
+fn gen_number_case_with_sign(number: &str) -> (Vec<String>, Vec<SelectItem>) {
+    let (mut input, mut expected) = gen_number_case(number);
+    for op in [UnaryOperator::Plus, UnaryOperator::Minus] {
+        let (input_sign, expected_sign) = gen_sign_number_case(number, op);
+        input.extend(input_sign);
+        expected.extend(expected_sign);
+    }
+    (input, expected)
+}
+
 #[test]
 fn parse_negative_value() {
     let sql1 = "SELECT -1";
@@ -2851,7 +3716,7 @@ fn parse_create_table() {
             name,
             columns,
             constraints,
-            with_options,
+            table_options,
             if_not_exists: false,
             external: false,
             file_format: None,
@@ -2868,7 +3733,6 @@ fn parse_create_table() {
                             length: 100,
                             unit: None,
                         })),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull,
@@ -2876,8 +3740,7 @@ fn parse_create_table() {
                     },
                     ColumnDef {
                         name: "lat".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Null,
@@ -2885,14 +3748,12 @@ fn parse_create_table() {
                     },
                     ColumnDef {
                         name: "lng".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![],
                     },
                     ColumnDef {
                         name: "constrained".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
@@ -2925,11 +3786,10 @@ fn parse_create_table() {
                     ColumnDef {
                         name: "ref".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::ForeignKey {
-                                foreign_table: ObjectName(vec!["othertable".into()]),
+                                foreign_table: ObjectName::from(vec!["othertable".into()]),
                                 referred_columns: vec!["a".into(), "b".into()],
                                 on_delete: None,
                                 on_update: None,
@@ -2940,11 +3800,10 @@ fn parse_create_table() {
                     ColumnDef {
                         name: "ref2".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::ForeignKey {
-                                foreign_table: ObjectName(vec!["othertable2".into()]),
+                                foreign_table: ObjectName::from(vec!["othertable2".into()]),
                                 referred_columns: vec![],
                                 on_delete: Some(ReferentialAction::Cascade),
                                 on_update: Some(ReferentialAction::NoAction),
@@ -2959,8 +3818,9 @@ fn parse_create_table() {
                 vec![
                     TableConstraint::ForeignKey {
                         name: Some("fkey".into()),
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable3".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable3".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::Restrict),
                         on_update: None,
@@ -2968,8 +3828,9 @@ fn parse_create_table() {
                     },
                     TableConstraint::ForeignKey {
                         name: Some("fkey2".into()),
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::NoAction),
                         on_update: Some(ReferentialAction::Restrict),
@@ -2977,8 +3838,9 @@ fn parse_create_table() {
                     },
                     TableConstraint::ForeignKey {
                         name: None,
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::Cascade),
                         on_update: Some(ReferentialAction::SetDefault),
@@ -2986,8 +3848,9 @@ fn parse_create_table() {
                     },
                     TableConstraint::ForeignKey {
                         name: None,
+                        index_name: None,
                         columns: vec!["lng".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["longitude".into()],
                         on_delete: None,
                         on_update: Some(ReferentialAction::SetNull),
@@ -2995,7 +3858,7 @@ fn parse_create_table() {
                     },
                 ]
             );
-            assert_eq!(with_options, vec![]);
+            assert_eq!(table_options, CreateTableOptions::None);
         }
         _ => unreachable!(),
     }
@@ -3040,7 +3903,7 @@ fn parse_create_table_with_constraint_characteristics() {
             name,
             columns,
             constraints,
-            with_options,
+            table_options,
             if_not_exists: false,
             external: false,
             file_format: None,
@@ -3057,7 +3920,6 @@ fn parse_create_table_with_constraint_characteristics() {
                             length: 100,
                             unit: None,
                         })),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull,
@@ -3065,8 +3927,7 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                     ColumnDef {
                         name: "lat".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Null,
@@ -3074,8 +3935,7 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                     ColumnDef {
                         name: "lng".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![],
                     },
                 ]
@@ -3085,8 +3945,9 @@ fn parse_create_table_with_constraint_characteristics() {
                 vec![
                     TableConstraint::ForeignKey {
                         name: Some("fkey".into()),
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable3".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable3".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::Restrict),
                         on_update: None,
@@ -3098,8 +3959,9 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                     TableConstraint::ForeignKey {
                         name: Some("fkey2".into()),
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::NoAction),
                         on_update: Some(ReferentialAction::Restrict),
@@ -3111,8 +3973,9 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                     TableConstraint::ForeignKey {
                         name: None,
+                        index_name: None,
                         columns: vec!["lat".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["lat".into()],
                         on_delete: Some(ReferentialAction::Cascade),
                         on_update: Some(ReferentialAction::SetDefault),
@@ -3124,8 +3987,9 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                     TableConstraint::ForeignKey {
                         name: None,
+                        index_name: None,
                         columns: vec!["lng".into()],
-                        foreign_table: ObjectName(vec!["othertable4".into()]),
+                        foreign_table: ObjectName::from(vec!["othertable4".into()]),
                         referred_columns: vec!["longitude".into()],
                         on_delete: None,
                         on_update: Some(ReferentialAction::SetNull),
@@ -3137,7 +4001,7 @@ fn parse_create_table_with_constraint_characteristics() {
                     },
                 ]
             );
-            assert_eq!(with_options, vec![]);
+            assert_eq!(table_options, CreateTableOptions::None);
         }
         _ => unreachable!(),
     }
@@ -3184,13 +4048,13 @@ fn parse_create_table_column_constraint_characteristics() {
             syntax
         };
 
-        let sql = format!("CREATE TABLE t (a int UNIQUE {})", syntax);
+        let sql = format!("CREATE TABLE t (a int UNIQUE {syntax})");
         let expected_clause = if syntax.is_empty() {
             String::new()
         } else {
             format!(" {syntax}")
         };
-        let expected = format!("CREATE TABLE t (a INT UNIQUE{})", expected_clause);
+        let expected = format!("CREATE TABLE t (a INT UNIQUE{expected_clause})");
         let ast = one_statement_parses_to(&sql, &expected);
 
         let expected_value = if deferrable.is_some() || initially.is_some() || enforced.is_some() {
@@ -3210,7 +4074,6 @@ fn parse_create_table_column_constraint_characteristics() {
                     vec![ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Unique {
@@ -3318,20 +4181,18 @@ fn parse_create_table_hive_array() {
                 ..
             }) => {
                 assert!(if_not_exists);
-                assert_eq!(name, ObjectName(vec!["something".into()]));
+                assert_eq!(name, ObjectName::from(vec!["something".into()]));
                 assert_eq!(
                     columns,
                     vec![
                         ColumnDef {
                             name: Ident::new("name"),
                             data_type: DataType::Int(None),
-                            collation: None,
                             options: vec![],
                         },
                         ColumnDef {
                             name: Ident::new("val"),
                             data_type: DataType::Array(expected),
-                            collation: None,
                             options: vec![],
                         },
                     ],
@@ -3408,7 +4269,10 @@ fn parse_assert_message() {
             message: Some(message),
         } => {
             match message {
-                Expr::Value(Value::SingleQuotedString(s)) => assert_eq!(s, "No rows in my_table"),
+                Expr::Value(ValueWithSpan {
+                    value: Value::SingleQuotedString(s),
+                    span: _,
+                }) => assert_eq!(s, "No rows in my_table"),
                 _ => unreachable!(),
             };
         }
@@ -3426,6 +4290,15 @@ fn parse_create_schema() {
         }
         _ => unreachable!(),
     }
+
+    verified_stmt(r#"CREATE SCHEMA a.b.c OPTIONS(key1 = 'value1', key2 = 'value2')"#);
+    verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a OPTIONS(key1 = 'value1')"#);
+    verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a OPTIONS()"#);
+    verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a DEFAULT COLLATE 'und:ci' OPTIONS()"#);
+    verified_stmt(r#"CREATE SCHEMA a.b.c WITH (key1 = 'value1', key2 = 'value2')"#);
+    verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a WITH (key1 = 'value1')"#);
+    verified_stmt(r#"CREATE SCHEMA IF NOT EXISTS a WITH ()"#);
+    verified_stmt(r#"CREATE SCHEMA a CLONE b"#);
 }
 
 #[test]
@@ -3477,8 +4350,9 @@ fn parse_create_table_as() {
     // BigQuery allows specifying table schema in CTAS
     // ANSI SQL and PostgreSQL let you only specify the list of columns
     // (without data types) in a CTAS, but we have yet to support that.
+    let dialects = all_dialects_where(|d| d.supports_create_table_multi_schema_info_sources());
     let sql = "CREATE TABLE t (a INT, b INT) AS SELECT 1 AS b, 2 AS a";
-    match verified_stmt(sql) {
+    match dialects.verified_stmt(sql) {
         Statement::CreateTable(CreateTable { columns, query, .. }) => {
             assert_eq!(columns.len(), 2);
             assert_eq!(columns[0].to_string(), "a INT".to_string());
@@ -3503,19 +4377,18 @@ fn parse_create_table_as_table() {
             schema_name: None,
         }))),
         order_by: None,
-        limit: None,
-        limit_by: vec![],
-        offset: None,
+        limit_clause: None,
         fetch: None,
         locks: vec![],
         for_clause: None,
         settings: None,
         format_clause: None,
+        pipe_operators: vec![],
     });
 
     match verified_stmt(sql1) {
         Statement::CreateTable(CreateTable { query, name, .. }) => {
-            assert_eq!(name, ObjectName(vec![Ident::new("new_table")]));
+            assert_eq!(name, ObjectName::from(vec![Ident::new("new_table")]));
             assert_eq!(query.unwrap(), expected_query1);
         }
         _ => unreachable!(),
@@ -3530,19 +4403,18 @@ fn parse_create_table_as_table() {
             schema_name: Some("schema_name".to_string()),
         }))),
         order_by: None,
-        limit: None,
-        limit_by: vec![],
-        offset: None,
+        limit_clause: None,
         fetch: None,
         locks: vec![],
         for_clause: None,
         settings: None,
         format_clause: None,
+        pipe_operators: vec![],
     });
 
     match verified_stmt(sql2) {
         Statement::CreateTable(CreateTable { query, name, .. }) => {
-            assert_eq!(name, ObjectName(vec![Ident::new("new_table")]));
+            assert_eq!(name, ObjectName::from(vec![Ident::new("new_table")]));
             assert_eq!(query.unwrap(), expected_query2);
         }
         _ => unreachable!(),
@@ -3585,20 +4457,6 @@ fn parse_create_or_replace_table() {
         }
         _ => unreachable!(),
     }
-
-    let sql = "CREATE TABLE t (a INT, b INT) AS SELECT 1 AS b, 2 AS a";
-    match verified_stmt(sql) {
-        Statement::CreateTable(CreateTable { columns, query, .. }) => {
-            assert_eq!(columns.len(), 2);
-            assert_eq!(columns[0].to_string(), "a INT".to_string());
-            assert_eq!(columns[1].to_string(), "b INT".to_string());
-            assert_eq!(
-                query,
-                Some(Box::new(verified_query("SELECT 1 AS b, 2 AS a")))
-            );
-        }
-        _ => unreachable!(),
-    }
 }
 
 #[test]
@@ -3621,16 +4479,22 @@ fn parse_create_table_with_options() {
 
     let sql = "CREATE TABLE t (c INT) WITH (foo = 'bar', a = 123)";
     match generic.verified_stmt(sql) {
-        Statement::CreateTable(CreateTable { with_options, .. }) => {
+        Statement::CreateTable(CreateTable { table_options, .. }) => {
+            let with_options = match table_options {
+                CreateTableOptions::With(options) => options,
+                _ => unreachable!(),
+            };
             assert_eq!(
                 vec![
                     SqlOption::KeyValue {
                         key: "foo".into(),
-                        value: Expr::Value(Value::SingleQuotedString("bar".into())),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("bar".into())).with_empty_span()
+                        ),
                     },
                     SqlOption::KeyValue {
                         key: "a".into(),
-                        value: Expr::Value(number("123")),
+                        value: Expr::value(number("123")),
                     },
                 ],
                 with_options
@@ -3645,8 +4509,8 @@ fn parse_create_table_clone() {
     let sql = "CREATE OR REPLACE TABLE a CLONE a_tmp";
     match verified_stmt(sql) {
         Statement::CreateTable(CreateTable { name, clone, .. }) => {
-            assert_eq!(ObjectName(vec![Ident::new("a")]), name);
-            assert_eq!(Some(ObjectName(vec![(Ident::new("a_tmp"))])), clone)
+            assert_eq!(ObjectName::from(vec![Ident::new("a")]), name);
+            assert_eq!(Some(ObjectName::from(vec![(Ident::new("a_tmp"))])), clone)
         }
         _ => unreachable!(),
     }
@@ -3680,7 +4544,7 @@ fn parse_create_external_table() {
             name,
             columns,
             constraints,
-            with_options,
+            table_options,
             if_not_exists,
             external,
             file_format,
@@ -3697,7 +4561,6 @@ fn parse_create_external_table() {
                             length: 100,
                             unit: None,
                         })),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull,
@@ -3705,8 +4568,7 @@ fn parse_create_external_table() {
                     },
                     ColumnDef {
                         name: "lat".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Null,
@@ -3714,8 +4576,7 @@ fn parse_create_external_table() {
                     },
                     ColumnDef {
                         name: "lng".into(),
-                        data_type: DataType::Double,
-                        collation: None,
+                        data_type: DataType::Double(ExactNumberInfo::None),
                         options: vec![],
                     },
                 ]
@@ -3726,7 +4587,7 @@ fn parse_create_external_table() {
             assert_eq!(FileFormat::TEXTFILE, file_format.unwrap());
             assert_eq!("/tmp/example.csv", location.unwrap());
 
-            assert_eq!(with_options, vec![]);
+            assert_eq!(table_options, CreateTableOptions::None);
             assert!(!if_not_exists);
         }
         _ => unreachable!(),
@@ -3751,7 +4612,7 @@ fn parse_create_or_replace_external_table() {
             name,
             columns,
             constraints,
-            with_options,
+            table_options,
             if_not_exists,
             external,
             file_format,
@@ -3768,7 +4629,6 @@ fn parse_create_or_replace_external_table() {
                         length: 100,
                         unit: None,
                     })),
-                    collation: None,
                     options: vec![ColumnOptionDef {
                         name: None,
                         option: ColumnOption::NotNull,
@@ -3781,7 +4641,7 @@ fn parse_create_or_replace_external_table() {
             assert_eq!(FileFormat::TEXTFILE, file_format.unwrap());
             assert_eq!("/tmp/example.csv", location.unwrap());
 
-            assert_eq!(with_options, vec![]);
+            assert_eq!(table_options, CreateTableOptions::None);
             assert!(!if_not_exists);
             assert!(or_replace);
         }
@@ -3832,7 +4692,21 @@ fn parse_alter_table() {
     let rename_table = "ALTER TABLE tab RENAME TO new_tab";
     match alter_table_op(verified_stmt(rename_table)) {
         AlterTableOperation::RenameTable { table_name } => {
-            assert_eq!("new_tab", table_name.to_string());
+            assert_eq!(
+                RenameTableNameKind::To(ObjectName::from(vec![Ident::new("new_tab")])),
+                table_name
+            );
+        }
+        _ => unreachable!(),
+    };
+
+    let rename_table_as = "ALTER TABLE tab RENAME AS new_tab";
+    match alter_table_op(verified_stmt(rename_table_as)) {
+        AlterTableOperation::RenameTable { table_name } => {
+            assert_eq!(
+                RenameTableNameKind::As(ObjectName::from(vec![Ident::new("new_tab")])),
+                table_name
+            );
         }
         _ => unreachable!(),
     };
@@ -3857,14 +4731,104 @@ fn parse_alter_table() {
                 [SqlOption::KeyValue {
                     key: Ident {
                         value: "classification".to_string(),
-                        quote_style: Some('\'')
+                        quote_style: Some('\''),
+                        span: Span::empty(),
                     },
-                    value: Expr::Value(Value::SingleQuotedString("parquet".to_string())),
+                    value: Expr::Value(
+                        (Value::SingleQuotedString("parquet".to_string())).with_empty_span()
+                    ),
                 }],
             );
         }
         _ => unreachable!(),
     }
+
+    let set_storage_parameters = "ALTER TABLE tab SET (autovacuum_vacuum_scale_factor = 0.01, autovacuum_vacuum_threshold = 500)";
+    match alter_table_op(verified_stmt(set_storage_parameters)) {
+        AlterTableOperation::SetOptionsParens { options } => {
+            assert_eq!(
+                options,
+                [
+                    SqlOption::KeyValue {
+                        key: Ident {
+                            value: "autovacuum_vacuum_scale_factor".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        },
+                        value: Expr::Value(test_utils::number("0.01").with_empty_span()),
+                    },
+                    SqlOption::KeyValue {
+                        key: Ident {
+                            value: "autovacuum_vacuum_threshold".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        },
+                        value: Expr::Value(test_utils::number("500").with_empty_span()),
+                    }
+                ],
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_rename_table() {
+    match verified_stmt("RENAME TABLE test.test1 TO test_db.test2") {
+        Statement::RenameTable(rename_tables) => {
+            assert_eq!(
+                vec![RenameTable {
+                    old_name: ObjectName::from(vec![
+                        Ident::new("test".to_string()),
+                        Ident::new("test1".to_string()),
+                    ]),
+                    new_name: ObjectName::from(vec![
+                        Ident::new("test_db".to_string()),
+                        Ident::new("test2".to_string()),
+                    ]),
+                }],
+                rename_tables
+            );
+        }
+        _ => unreachable!(),
+    };
+
+    match verified_stmt(
+        "RENAME TABLE old_table1 TO new_table1, old_table2 TO new_table2, old_table3 TO new_table3",
+    ) {
+        Statement::RenameTable(rename_tables) => {
+            assert_eq!(
+                vec![
+                    RenameTable {
+                        old_name: ObjectName::from(vec![Ident::new("old_table1".to_string())]),
+                        new_name: ObjectName::from(vec![Ident::new("new_table1".to_string())]),
+                    },
+                    RenameTable {
+                        old_name: ObjectName::from(vec![Ident::new("old_table2".to_string())]),
+                        new_name: ObjectName::from(vec![Ident::new("new_table2".to_string())]),
+                    },
+                    RenameTable {
+                        old_name: ObjectName::from(vec![Ident::new("old_table3".to_string())]),
+                        new_name: ObjectName::from(vec![Ident::new("new_table3".to_string())]),
+                    }
+                ],
+                rename_tables
+            );
+        }
+        _ => unreachable!(),
+    };
+
+    assert_eq!(
+        parse_sql_statements("RENAME TABLE old_table TO new_table a").unwrap_err(),
+        ParserError::ParserError("Expected: end of statement, found: a".to_string())
+    );
+
+    assert_eq!(
+        parse_sql_statements("RENAME TABLE1 old_table TO new_table a").unwrap_err(),
+        ParserError::ParserError(
+            "Expected: KEYWORD `TABLE` after RENAME, found: TABLE1".to_string()
+        )
+    );
 }
 
 #[test]
@@ -3875,8 +4839,8 @@ fn test_alter_table_with_on_cluster() {
         Statement::AlterTable {
             name, on_cluster, ..
         } => {
-            std::assert_eq!(name.to_string(), "t");
-            std::assert_eq!(on_cluster, Some(Ident::with_quote('\'', "cluster")));
+            assert_eq!(name.to_string(), "t");
+            assert_eq!(on_cluster, Some(Ident::with_quote('\'', "cluster")));
         }
         _ => unreachable!(),
     }
@@ -3887,15 +4851,15 @@ fn test_alter_table_with_on_cluster() {
         Statement::AlterTable {
             name, on_cluster, ..
         } => {
-            std::assert_eq!(name.to_string(), "t");
-            std::assert_eq!(on_cluster, Some(Ident::new("cluster_name")));
+            assert_eq!(name.to_string(), "t");
+            assert_eq!(on_cluster, Some(Ident::new("cluster_name")));
         }
         _ => unreachable!(),
     }
 
     let res = all_dialects()
         .parse_sql_statements("ALTER TABLE t ON CLUSTER 123 ADD CONSTRAINT bar PRIMARY KEY (baz)");
-    std::assert_eq!(
+    assert_eq!(
         res.unwrap_err(),
         ParserError::ParserError("Expected: identifier, found: 123".to_string())
     )
@@ -3944,11 +4908,13 @@ fn parse_alter_view_with_options() {
                 vec![
                     SqlOption::KeyValue {
                         key: "foo".into(),
-                        value: Expr::Value(Value::SingleQuotedString("bar".into())),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("bar".into())).with_empty_span()
+                        ),
                     },
                     SqlOption::KeyValue {
                         key: "a".into(),
-                        value: Expr::Value(number("123")),
+                        value: Expr::value(number("123")),
                     },
                 ],
                 with_options
@@ -4039,12 +5005,13 @@ fn parse_alter_table_constraints() {
     check_one("UNIQUE (id)");
     check_one("FOREIGN KEY (foo, bar) REFERENCES AnotherTable(foo, bar)");
     check_one("CHECK (end_date > start_date OR end_date IS NULL)");
+    check_one("CONSTRAINT fk FOREIGN KEY (lng) REFERENCES othertable4");
 
     fn check_one(constraint_text: &str) {
         match alter_table_op(verified_stmt(&format!(
             "ALTER TABLE tab ADD {constraint_text}"
         ))) {
-            AlterTableOperation::AddConstraint(constraint) => {
+            AlterTableOperation::AddConstraint { constraint, .. } => {
                 assert_eq!(constraint_text, constraint.to_string());
             }
             _ => unreachable!(),
@@ -4055,26 +5022,36 @@ fn parse_alter_table_constraints() {
 
 #[test]
 fn parse_alter_table_drop_column() {
+    check_one("DROP COLUMN IF EXISTS is_active");
     check_one("DROP COLUMN IF EXISTS is_active CASCADE");
+    check_one("DROP COLUMN IF EXISTS is_active RESTRICT");
     one_statement_parses_to(
-        "ALTER TABLE tab DROP IF EXISTS is_active CASCADE",
+        "ALTER TABLE tab DROP COLUMN IF EXISTS is_active CASCADE",
         "ALTER TABLE tab DROP COLUMN IF EXISTS is_active CASCADE",
     );
     one_statement_parses_to(
         "ALTER TABLE tab DROP is_active CASCADE",
-        "ALTER TABLE tab DROP COLUMN is_active CASCADE",
+        "ALTER TABLE tab DROP is_active CASCADE",
     );
 
+    let dialects = all_dialects_where(|d| d.supports_comma_separated_drop_column_list());
+    dialects.verified_stmt("ALTER TABLE tbl DROP COLUMN c1, c2, c3");
+
     fn check_one(constraint_text: &str) {
         match alter_table_op(verified_stmt(&format!("ALTER TABLE tab {constraint_text}"))) {
             AlterTableOperation::DropColumn {
-                column_name,
+                has_column_keyword: true,
+                column_names,
                 if_exists,
-                cascade,
+                drop_behavior,
             } => {
-                assert_eq!("is_active", column_name.to_string());
+                assert_eq!("is_active", column_names.first().unwrap().to_string());
                 assert!(if_exists);
-                assert!(cascade);
+                match drop_behavior {
+                    None => assert!(constraint_text.ends_with(" is_active")),
+                    Some(DropBehavior::Restrict) => assert!(constraint_text.ends_with(" RESTRICT")),
+                    Some(DropBehavior::Cascade) => assert!(constraint_text.ends_with(" CASCADE")),
+                }
             }
             _ => unreachable!(),
         }
@@ -4107,7 +5084,7 @@ fn parse_alter_table_alter_column() {
             assert_eq!(
                 op,
                 AlterColumnOperation::SetDefault {
-                    value: Expr::Value(test_utils::number("0"))
+                    value: Expr::Value((test_utils::number("0")).with_empty_span())
                 }
             );
         }
@@ -4138,22 +5115,21 @@ fn parse_alter_table_alter_column_type() {
                 AlterColumnOperation::SetDataType {
                     data_type: DataType::Text,
                     using: None,
+                    had_set: true,
                 }
             );
         }
         _ => unreachable!(),
     }
+    verified_stmt(&format!("{alter_stmt} ALTER COLUMN is_active TYPE TEXT"));
 
-    let dialect = TestedDialects::new(vec![Box::new(GenericDialect {})]);
-
-    let res =
-        dialect.parse_sql_statements(&format!("{alter_stmt} ALTER COLUMN is_active TYPE TEXT"));
-    assert_eq!(
-        ParserError::ParserError("Expected: SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after ALTER COLUMN, found: TYPE".to_string()),
-        res.unwrap_err()
-    );
+    let dialects = all_dialects_where(|d| d.supports_alter_column_type_using());
+    dialects.verified_stmt(&format!(
+        "{alter_stmt} ALTER COLUMN is_active SET DATA TYPE TEXT USING 'text'"
+    ));
 
-    let res = dialect.parse_sql_statements(&format!(
+    let dialects = all_dialects_except(|d| d.supports_alter_column_type_using());
+    let res = dialects.parse_sql_statements(&format!(
         "{alter_stmt} ALTER COLUMN is_active SET DATA TYPE TEXT USING 'text'"
     ));
     assert_eq!(
@@ -4164,37 +5140,29 @@ fn parse_alter_table_alter_column_type() {
 
 #[test]
 fn parse_alter_table_drop_constraint() {
-    let alter_stmt = "ALTER TABLE tab";
-    match alter_table_op(verified_stmt(
-        "ALTER TABLE tab DROP CONSTRAINT constraint_name CASCADE",
-    )) {
-        AlterTableOperation::DropConstraint {
-            name: constr_name,
-            if_exists,
-            cascade,
-        } => {
-            assert_eq!("constraint_name", constr_name.to_string());
-            assert!(!if_exists);
-            assert!(cascade);
+    check_one("DROP CONSTRAINT IF EXISTS constraint_name");
+    check_one("DROP CONSTRAINT IF EXISTS constraint_name RESTRICT");
+    check_one("DROP CONSTRAINT IF EXISTS constraint_name CASCADE");
+    fn check_one(constraint_text: &str) {
+        match alter_table_op(verified_stmt(&format!("ALTER TABLE tab {constraint_text}"))) {
+            AlterTableOperation::DropConstraint {
+                name: constr_name,
+                if_exists,
+                drop_behavior,
+            } => {
+                assert_eq!("constraint_name", constr_name.to_string());
+                assert!(if_exists);
+                match drop_behavior {
+                    None => assert!(constraint_text.ends_with(" constraint_name")),
+                    Some(DropBehavior::Restrict) => assert!(constraint_text.ends_with(" RESTRICT")),
+                    Some(DropBehavior::Cascade) => assert!(constraint_text.ends_with(" CASCADE")),
+                }
+            }
+            _ => unreachable!(),
         }
-        _ => unreachable!(),
-    }
-    match alter_table_op(verified_stmt(
-        "ALTER TABLE tab DROP CONSTRAINT IF EXISTS constraint_name",
-    )) {
-        AlterTableOperation::DropConstraint {
-            name: constr_name,
-            if_exists,
-            cascade,
-        } => {
-            assert_eq!("constraint_name", constr_name.to_string());
-            assert!(if_exists);
-            assert!(!cascade);
-        }
-        _ => unreachable!(),
     }
 
-    let res = parse_sql_statements(&format!("{alter_stmt} DROP CONSTRAINT is_active TEXT"));
+    let res = parse_sql_statements("ALTER TABLE tab DROP CONSTRAINT is_active TEXT");
     assert_eq!(
         ParserError::ParserError("Expected: end of statement, found: TEXT".to_string()),
         res.unwrap_err()
@@ -4238,8 +5206,8 @@ fn run_explain_analyze(
     query: &str,
     expected_verbose: bool,
     expected_analyze: bool,
-    expected_format: Option<AnalyzeFormat>,
-    exepcted_options: Option<Vec<UtilityOption>>,
+    expected_format: Option<AnalyzeFormatKind>,
+    expected_options: Option<Vec<UtilityOption>>,
 ) {
     match dialect.verified_stmt(query) {
         Statement::Explain {
@@ -4247,6 +5215,7 @@ fn run_explain_analyze(
             analyze,
             verbose,
             query_plan,
+            estimate,
             statement,
             format,
             options,
@@ -4254,8 +5223,9 @@ fn run_explain_analyze(
             assert_eq!(verbose, expected_verbose);
             assert_eq!(analyze, expected_analyze);
             assert_eq!(format, expected_format);
-            assert_eq!(options, exepcted_options);
+            assert_eq!(options, expected_options);
             assert!(!query_plan);
+            assert!(!estimate);
             assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
         }
         _ => panic!("Unexpected Statement, must be Explain"),
@@ -4347,7 +5317,7 @@ fn parse_explain_analyze_with_simple_select() {
         "EXPLAIN ANALYZE FORMAT GRAPHVIZ SELECT sqrt(id) FROM foo",
         false,
         true,
-        Some(AnalyzeFormat::GRAPHVIZ),
+        Some(AnalyzeFormatKind::Keyword(AnalyzeFormat::GRAPHVIZ)),
         None,
     );
 
@@ -4356,7 +5326,16 @@ fn parse_explain_analyze_with_simple_select() {
         "EXPLAIN ANALYZE VERBOSE FORMAT JSON SELECT sqrt(id) FROM foo",
         true,
         true,
-        Some(AnalyzeFormat::JSON),
+        Some(AnalyzeFormatKind::Keyword(AnalyzeFormat::JSON)),
+        None,
+    );
+
+    run_explain_analyze(
+        all_dialects(),
+        "EXPLAIN ANALYZE VERBOSE FORMAT=JSON SELECT sqrt(id) FROM foo",
+        true,
+        true,
+        Some(AnalyzeFormatKind::Assignment(AnalyzeFormat::JSON)),
         None,
     );
 
@@ -4365,7 +5344,7 @@ fn parse_explain_analyze_with_simple_select() {
         "EXPLAIN VERBOSE FORMAT TEXT SELECT sqrt(id) FROM foo",
         true,
         false,
-        Some(AnalyzeFormat::TEXT),
+        Some(AnalyzeFormatKind::Keyword(AnalyzeFormat::TEXT)),
         None,
     );
 }
@@ -4400,31 +5379,63 @@ fn parse_explain_query_plan() {
     );
 }
 
+#[test]
+fn parse_explain_estimate() {
+    let statement = all_dialects().verified_stmt("EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo");
+
+    match &statement {
+        Statement::Explain {
+            query_plan,
+            estimate,
+            analyze,
+            verbose,
+            statement,
+            ..
+        } => {
+            assert!(estimate);
+            assert!(!query_plan);
+            assert!(!analyze);
+            assert!(!verbose);
+            assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
+        }
+        _ => unreachable!(),
+    }
+
+    assert_eq!(
+        "EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo",
+        statement.to_string()
+    );
+}
+
 #[test]
 fn parse_named_argument_function() {
-    let dialects = all_dialects_where(|d| d.supports_named_fn_args_with_rarrow_operator());
+    let dialects = all_dialects_where(|d| {
+        d.supports_named_fn_args_with_rarrow_operator()
+            && !d.supports_named_fn_args_with_expr_name()
+    });
     let sql = "SELECT FUN(a => '1', b => '2') FROM foo";
     let select = dialects.verified_only_select(sql);
 
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("FUN")]),
+            name: ObjectName::from(vec![Ident::new("FUN")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
                 args: vec![
                     FunctionArg::Named {
                         name: Ident::new("a"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "1".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("1".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::RightArrow
                     },
                     FunctionArg::Named {
                         name: Ident::new("b"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "2".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("2".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::RightArrow
                     },
                 ],
@@ -4447,23 +5458,24 @@ fn parse_named_argument_function_with_eq_operator() {
         .verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("FUN")]),
+            name: ObjectName::from(vec![Ident::new("FUN")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
                 args: vec![
                     FunctionArg::Named {
                         name: Ident::new("a"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "1".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("1".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::Equals
                     },
                     FunctionArg::Named {
                         name: Ident::new("b"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "2".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("2".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::Equals
                     },
                 ],
@@ -4487,7 +5499,7 @@ fn parse_named_argument_function_with_eq_operator() {
             [Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("bar"))),
                 op: BinaryOperator::Eq,
-                right: Box::new(Expr::Value(number("42"))),
+                right: Box::new(Expr::value(number("42"))),
             }]
         ),
     );
@@ -4521,7 +5533,8 @@ fn parse_window_functions() {
 
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("row_number")]),
+            name: ObjectName::from(vec![Ident::new("row_number")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -4535,8 +5548,10 @@ fn parse_window_functions() {
                 partition_by: vec![],
                 order_by: vec![OrderByExpr {
                     expr: Expr::Identifier(Ident::new("dt")),
-                    asc: Some(false),
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: Some(false),
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 }],
                 window_frame: None,
@@ -4576,7 +5591,8 @@ fn parse_named_window_functions() {
                WINDOW w AS (PARTITION BY x), win AS (ORDER BY y)";
     supported_dialects.verified_stmt(sql);
 
-    let select = verified_only_select(sql);
+    let select = all_dialects_except(|d| d.is_table_alias(&Keyword::WINDOW, &mut Parser::new(d)))
+        .verified_only_select(sql);
 
     const EXPECTED_PROJ_QTY: usize = 2;
     assert_eq!(EXPECTED_PROJ_QTY, select.projection.len());
@@ -4606,6 +5622,7 @@ fn parse_named_window_functions() {
 
 #[test]
 fn parse_window_clause() {
+    let dialects = all_dialects_except(|d| d.is_table_alias(&Keyword::WINDOW, &mut Parser::new(d)));
     let sql = "SELECT * \
     FROM mytable \
     WINDOW \
@@ -4618,10 +5635,14 @@ fn parse_window_clause() {
         window7 AS (window1 ROWS UNBOUNDED PRECEDING), \
         window8 AS (window1 PARTITION BY a ORDER BY b ROWS UNBOUNDED PRECEDING) \
     ORDER BY C3";
-    verified_only_select(sql);
+    dialects.verified_only_select(sql);
 
     let sql = "SELECT * from mytable WINDOW window1 AS window2";
-    let dialects = all_dialects_except(|d| d.is::<BigQueryDialect>() || d.is::<GenericDialect>());
+    let dialects = all_dialects_except(|d| {
+        d.is::<BigQueryDialect>()
+            || d.is::<GenericDialect>()
+            || d.is_table_alias(&Keyword::WINDOW, &mut Parser::new(d))
+    });
     let res = dialects.parse_sql_statements(sql);
     assert_eq!(
         ParserError::ParserError("Expected: (, found: window2".to_string()),
@@ -4631,6 +5652,7 @@ fn parse_window_clause() {
 
 #[test]
 fn test_parse_named_window() {
+    let dialects = all_dialects_except(|d| d.is_table_alias(&Keyword::WINDOW, &mut Parser::new(d)));
     let sql = "SELECT \
     MIN(c12) OVER window1 AS min1, \
     MAX(c12) OVER window2 AS max1 \
@@ -4638,18 +5660,21 @@ fn test_parse_named_window() {
     WINDOW window1 AS (ORDER BY C12), \
     window2 AS (PARTITION BY C11) \
     ORDER BY C3";
-    let actual_select_only = verified_only_select(sql);
+    let actual_select_only = dialects.verified_only_select(sql);
     let expected = Select {
+        select_token: AttachedToken::empty(),
         distinct: None,
         top: None,
         top_before_distinct: false,
         projection: vec![
             SelectItem::ExprWithAlias {
                 expr: Expr::Function(Function {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "MIN".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     }]),
+                    uses_odbc_syntax: false,
                     parameters: FunctionArguments::None,
                     args: FunctionArguments::List(FunctionArgumentList {
                         duplicate_treatment: None,
@@ -4657,6 +5682,7 @@ fn test_parse_named_window() {
                             Expr::Identifier(Ident {
                                 value: "c12".to_string(),
                                 quote_style: None,
+                                span: Span::empty(),
                             }),
                         ))],
                         clauses: vec![],
@@ -4666,20 +5692,24 @@ fn test_parse_named_window() {
                     over: Some(WindowType::NamedWindow(Ident {
                         value: "window1".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })),
                     within_group: vec![],
                 }),
                 alias: Ident {
                     value: "min1".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },
             },
             SelectItem::ExprWithAlias {
                 expr: Expr::Function(Function {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "MAX".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     }]),
+                    uses_odbc_syntax: false,
                     parameters: FunctionArguments::None,
                     args: FunctionArguments::List(FunctionArgumentList {
                         duplicate_treatment: None,
@@ -4687,6 +5717,7 @@ fn test_parse_named_window() {
                             Expr::Identifier(Ident {
                                 value: "c12".to_string(),
                                 quote_style: None,
+                                span: Span::empty(),
                             }),
                         ))],
                         clauses: vec![],
@@ -4696,29 +5727,25 @@ fn test_parse_named_window() {
                     over: Some(WindowType::NamedWindow(Ident {
                         value: "window2".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })),
                     within_group: vec![],
                 }),
                 alias: Ident {
                     value: "max1".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },
             },
         ],
+        exclude: None,
         into: None,
         from: vec![TableWithJoins {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "aggregate_test_100".to_string(),
-                    quote_style: None,
-                }]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![Ident {
+                value: "aggregate_test_100".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }])),
             joins: vec![],
         }],
         lateral_views: vec![],
@@ -4734,6 +5761,7 @@ fn test_parse_named_window() {
                 Ident {
                     value: "window1".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },
                 NamedWindowExpr::WindowSpec(WindowSpec {
                     window_name: None,
@@ -4742,9 +5770,12 @@ fn test_parse_named_window() {
                         expr: Expr::Identifier(Ident {
                             value: "C12".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         }),
-                        asc: None,
-                        nulls_first: None,
+                        options: OrderByOptions {
+                            asc: None,
+                            nulls_first: None,
+                        },
                         with_fill: None,
                     }],
                     window_frame: None,
@@ -4754,12 +5785,14 @@ fn test_parse_named_window() {
                 Ident {
                     value: "window2".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },
                 NamedWindowExpr::WindowSpec(WindowSpec {
                     window_name: None,
                     partition_by: vec![Expr::Identifier(Ident {
                         value: "C11".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })],
                     order_by: vec![],
                     window_frame: None,
@@ -4770,12 +5803,17 @@ fn test_parse_named_window() {
         window_before_qualify: true,
         value_table_mode: None,
         connect_by: None,
+        flavor: SelectFlavor::Standard,
     };
     assert_eq!(actual_select_only, expected);
 }
 
 #[test]
 fn parse_window_and_qualify_clause() {
+    let dialects = all_dialects_except(|d| {
+        d.is_table_alias(&Keyword::WINDOW, &mut Parser::new(d))
+            || d.is_table_alias(&Keyword::QUALIFY, &mut Parser::new(d))
+    });
     let sql = "SELECT \
     MIN(c12) OVER window1 AS min1 \
     FROM aggregate_test_100 \
@@ -4783,7 +5821,7 @@ fn parse_window_and_qualify_clause() {
     WINDOW window1 AS (ORDER BY C12), \
     window2 AS (PARTITION BY C11) \
     ORDER BY C3";
-    verified_only_select(sql);
+    dialects.verified_only_select(sql);
 
     let sql = "SELECT \
     MIN(c12) OVER window1 AS min1 \
@@ -4792,7 +5830,7 @@ fn parse_window_and_qualify_clause() {
     window2 AS (PARTITION BY C11) \
     QUALIFY ROW_NUMBER() OVER my_window \
     ORDER BY C3";
-    verified_only_select(sql);
+    dialects.verified_only_select(sql);
 }
 
 #[test]
@@ -4823,14 +5861,14 @@ fn parse_literal_integer() {
     let select = verified_only_select(sql);
     assert_eq!(3, select.projection.len());
     assert_eq!(
-        &Expr::Value(number("1")),
+        &Expr::value(number("1")),
         expr_from_projection(&select.projection[0]),
     );
     // negative literal is parsed as a - and expr
     assert_eq!(
         &UnaryOp {
             op: UnaryOperator::Minus,
-            expr: Box::new(Expr::Value(number("10")))
+            expr: Box::new(Expr::value(number("10")))
         },
         expr_from_projection(&select.projection[1]),
     );
@@ -4838,7 +5876,7 @@ fn parse_literal_integer() {
     assert_eq!(
         &UnaryOp {
             op: UnaryOperator::Plus,
-            expr: Box::new(Expr::Value(number("20")))
+            expr: Box::new(Expr::value(number("20")))
         },
         expr_from_projection(&select.projection[2]),
     )
@@ -4852,11 +5890,11 @@ fn parse_literal_decimal() {
     let select = verified_only_select(sql);
     assert_eq!(2, select.projection.len());
     assert_eq!(
-        &Expr::Value(number("0.300000000000000004")),
+        &Expr::value(number("0.300000000000000004")),
         expr_from_projection(&select.projection[0]),
     );
     assert_eq!(
-        &Expr::Value(number("9007199254740993.0")),
+        &Expr::value(number("9007199254740993.0")),
         expr_from_projection(&select.projection[1]),
     )
 }
@@ -4867,15 +5905,17 @@ fn parse_literal_string() {
     let select = verified_only_select(sql);
     assert_eq!(3, select.projection.len());
     assert_eq!(
-        &Expr::Value(Value::SingleQuotedString("one".to_string())),
+        &Expr::Value((Value::SingleQuotedString("one".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
-        &Expr::Value(Value::NationalStringLiteral("national string".to_string())),
+        &Expr::Value(
+            (Value::NationalStringLiteral("national string".to_string())).with_empty_span()
+        ),
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
-        &Expr::Value(Value::HexStringLiteral("deadBEEF".to_string())),
+        &Expr::Value((Value::HexStringLiteral("deadBEEF".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[2])
     );
 
@@ -4888,10 +5928,14 @@ fn parse_literal_date() {
     let sql = "SELECT DATE '1999-01-01'";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::Date,
-            value: "1999-01-01".into(),
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1999-01-01".into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
 }
@@ -4901,10 +5945,14 @@ fn parse_literal_time() {
     let sql = "SELECT TIME '01:23:34'";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::Time(None, TimezoneInfo::None),
-            value: "01:23:34".into(),
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("01:23:34".into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
 }
@@ -4914,10 +5962,14 @@ fn parse_literal_datetime() {
     let sql = "SELECT DATETIME '1999-01-01 01:23:34.45'";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::Datetime(None),
-            value: "1999-01-01 01:23:34.45".into(),
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1999-01-01 01:23:34.45".into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
 }
@@ -4927,10 +5979,14 @@ fn parse_literal_timestamp_without_time_zone() {
     let sql = "SELECT TIMESTAMP '1999-01-01 01:23:34'";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::Timestamp(None, TimezoneInfo::None),
-            value: "1999-01-01 01:23:34".into(),
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1999-01-01 01:23:34".into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
 
@@ -4942,10 +5998,14 @@ fn parse_literal_timestamp_with_time_zone() {
     let sql = "SELECT TIMESTAMPTZ '1999-01-01 01:23:34Z'";
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::Timestamp(None, TimezoneInfo::Tz),
-            value: "1999-01-01 01:23:34Z".into(),
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1999-01-01 01:23:34Z".into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
 
@@ -4960,7 +6020,9 @@ fn parse_interval_all() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from("1-1")))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("1-1"))).with_empty_span()
+            )),
             leading_field: Some(DateTimeField::Year),
             leading_precision: None,
             last_field: Some(DateTimeField::Month),
@@ -4973,9 +6035,9 @@ fn parse_interval_all() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                "01:01.01"
-            )))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("01:01.01"))).with_empty_span()
+            )),
             leading_field: Some(DateTimeField::Minute),
             leading_precision: Some(5),
             last_field: Some(DateTimeField::Second),
@@ -4988,7 +6050,9 @@ fn parse_interval_all() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from("1")))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("1"))).with_empty_span()
+            )),
             leading_field: Some(DateTimeField::Second),
             leading_precision: Some(5),
             last_field: None,
@@ -5001,7 +6065,9 @@ fn parse_interval_all() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from("10")))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("10"))).with_empty_span()
+            )),
             leading_field: Some(DateTimeField::Hour),
             leading_precision: None,
             last_field: None,
@@ -5014,7 +6080,7 @@ fn parse_interval_all() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(number("5"))),
+            value: Box::new(Expr::value(number("5"))),
             leading_field: Some(DateTimeField::Day),
             leading_precision: None,
             last_field: None,
@@ -5023,11 +6089,26 @@ fn parse_interval_all() {
         expr_from_projection(only(&select.projection)),
     );
 
+    let sql = "SELECT INTERVAL 5 DAYS";
+    let select = verified_only_select(sql);
+    assert_eq!(
+        &Expr::Interval(Interval {
+            value: Box::new(Expr::value(number("5"))),
+            leading_field: Some(DateTimeField::Days),
+            leading_precision: None,
+            last_field: None,
+            fractional_seconds_precision: None,
+        }),
+        expr_from_projection(only(&select.projection)),
+    );
+
     let sql = "SELECT INTERVAL '10' HOUR (1)";
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from("10")))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("10"))).with_empty_span()
+            )),
             leading_field: Some(DateTimeField::Hour),
             leading_precision: Some(1),
             last_field: None,
@@ -5050,10 +6131,18 @@ fn parse_interval_all() {
 
     verified_only_select("SELECT INTERVAL '1' YEAR");
     verified_only_select("SELECT INTERVAL '1' MONTH");
+    verified_only_select("SELECT INTERVAL '1' WEEK");
     verified_only_select("SELECT INTERVAL '1' DAY");
     verified_only_select("SELECT INTERVAL '1' HOUR");
     verified_only_select("SELECT INTERVAL '1' MINUTE");
     verified_only_select("SELECT INTERVAL '1' SECOND");
+    verified_only_select("SELECT INTERVAL '1' YEARS");
+    verified_only_select("SELECT INTERVAL '1' MONTHS");
+    verified_only_select("SELECT INTERVAL '1' WEEKS");
+    verified_only_select("SELECT INTERVAL '1' DAYS");
+    verified_only_select("SELECT INTERVAL '1' HOURS");
+    verified_only_select("SELECT INTERVAL '1' MINUTES");
+    verified_only_select("SELECT INTERVAL '1' SECONDS");
     verified_only_select("SELECT INTERVAL '1' YEAR TO MONTH");
     verified_only_select("SELECT INTERVAL '1' DAY TO HOUR");
     verified_only_select("SELECT INTERVAL '1' DAY TO MINUTE");
@@ -5063,10 +6152,21 @@ fn parse_interval_all() {
     verified_only_select("SELECT INTERVAL '1' MINUTE TO SECOND");
     verified_only_select("SELECT INTERVAL 1 YEAR");
     verified_only_select("SELECT INTERVAL 1 MONTH");
+    verified_only_select("SELECT INTERVAL 1 WEEK");
     verified_only_select("SELECT INTERVAL 1 DAY");
     verified_only_select("SELECT INTERVAL 1 HOUR");
     verified_only_select("SELECT INTERVAL 1 MINUTE");
     verified_only_select("SELECT INTERVAL 1 SECOND");
+    verified_only_select("SELECT INTERVAL 1 YEARS");
+    verified_only_select("SELECT INTERVAL 1 MONTHS");
+    verified_only_select("SELECT INTERVAL 1 WEEKS");
+    verified_only_select("SELECT INTERVAL 1 DAYS");
+    verified_only_select("SELECT INTERVAL 1 HOURS");
+    verified_only_select("SELECT INTERVAL 1 MINUTES");
+    verified_only_select("SELECT INTERVAL 1 SECONDS");
+    verified_only_select(
+        "SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::INTERVAL",
+    );
 }
 
 #[test]
@@ -5077,9 +6177,9 @@ fn parse_interval_dont_require_unit() {
     let select = dialects.verified_only_select(sql);
     assert_eq!(
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                "1 DAY"
-            )))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("1 DAY"))).with_empty_span()
+            )),
             leading_field: None,
             leading_precision: None,
             last_field: None,
@@ -5098,7 +6198,6 @@ fn parse_interval_dont_require_unit() {
 #[test]
 fn parse_interval_require_unit() {
     let dialects = all_dialects_where(|d| d.require_interval_qualifier());
-
     let sql = "SELECT INTERVAL '1 DAY'";
     let err = dialects.parse_sql_statements(sql).unwrap_err();
     assert_eq!(
@@ -5117,9 +6216,9 @@ fn parse_interval_require_qualifier() {
         expr_from_projection(only(&select.projection)),
         &Expr::Interval(Interval {
             value: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("1"))),
+                left: Box::new(Expr::value(number("1"))),
                 op: BinaryOperator::Plus,
-                right: Box::new(Expr::Value(number("1"))),
+                right: Box::new(Expr::value(number("1"))),
             }),
             leading_field: Some(DateTimeField::Day),
             leading_precision: None,
@@ -5134,9 +6233,13 @@ fn parse_interval_require_qualifier() {
         expr_from_projection(only(&select.projection)),
         &Expr::Interval(Interval {
             value: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(Value::SingleQuotedString("1".to_string()))),
+                left: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("1".to_string())).with_empty_span()
+                )),
                 op: BinaryOperator::Plus,
-                right: Box::new(Expr::Value(Value::SingleQuotedString("1".to_string()))),
+                right: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("1".to_string())).with_empty_span()
+                )),
             }),
             leading_field: Some(DateTimeField::Day),
             leading_precision: None,
@@ -5152,12 +6255,18 @@ fn parse_interval_require_qualifier() {
         &Expr::Interval(Interval {
             value: Box::new(Expr::BinaryOp {
                 left: Box::new(Expr::BinaryOp {
-                    left: Box::new(Expr::Value(Value::SingleQuotedString("1".to_string()))),
+                    left: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("1".to_string())).with_empty_span()
+                    )),
                     op: BinaryOperator::Plus,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString("2".to_string()))),
+                    right: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("2".to_string())).with_empty_span()
+                    )),
                 }),
                 op: BinaryOperator::Minus,
-                right: Box::new(Expr::Value(Value::SingleQuotedString("3".to_string()))),
+                right: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("3".to_string())).with_empty_span()
+                )),
             }),
             leading_field: Some(DateTimeField::Day),
             leading_precision: None,
@@ -5176,9 +6285,9 @@ fn parse_interval_disallow_interval_expr() {
     assert_eq!(
         expr_from_projection(only(&select.projection)),
         &Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                "1 DAY"
-            )))),
+            value: Box::new(Expr::Value(
+                (Value::SingleQuotedString(String::from("1 DAY"))).with_empty_span()
+            )),
             leading_field: None,
             leading_precision: None,
             last_field: None,
@@ -5199,9 +6308,9 @@ fn parse_interval_disallow_interval_expr() {
         expr_from_projection(only(&select.projection)),
         &Expr::BinaryOp {
             left: Box::new(Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                    "1 DAY"
-                )))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString(String::from("1 DAY"))).with_empty_span()
+                )),
                 leading_field: None,
                 leading_precision: None,
                 last_field: None,
@@ -5209,9 +6318,9 @@ fn parse_interval_disallow_interval_expr() {
             })),
             op: BinaryOperator::Gt,
             right: Box::new(Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString(String::from(
-                    "1 SECOND"
-                )))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString(String::from("1 SECOND"))).with_empty_span()
+                )),
                 leading_field: None,
                 leading_precision: None,
                 last_field: None,
@@ -5229,9 +6338,9 @@ fn interval_disallow_interval_expr_gt() {
         expr,
         Expr::BinaryOp {
             left: Box::new(Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "1 second".to_string()
-                ))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("1 second".to_string())).with_empty_span()
+                )),
                 leading_field: None,
                 leading_precision: None,
                 last_field: None,
@@ -5241,6 +6350,7 @@ fn interval_disallow_interval_expr_gt() {
             right: Box::new(Expr::Identifier(Ident {
                 value: "x".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             })),
         }
     )
@@ -5255,9 +6365,9 @@ fn interval_disallow_interval_expr_double_colon() {
         Expr::Cast {
             kind: CastKind::DoubleColon,
             expr: Box::new(Expr::Interval(Interval {
-                value: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "1 second".to_string()
-                ))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("1 second".to_string())).with_empty_span()
+                )),
                 leading_field: None,
                 leading_precision: None,
                 last_field: None,
@@ -5281,27 +6391,23 @@ fn parse_interval_and_or_xor() {
     let expected_ast = vec![Statement::Query(Box::new(Query {
         with: None,
         body: Box::new(SetExpr::Select(Box::new(Select {
+            select_token: AttachedToken::empty(),
             distinct: None,
             top: None,
             top_before_distinct: false,
             projection: vec![UnnamedExpr(Expr::Identifier(Ident {
                 value: "col".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             }))],
+            exclude: None,
             into: None,
             from: vec![TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec![Ident {
-                        value: "test".to_string(),
-                        quote_style: None,
-                    }]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec![Ident {
+                    value: "test".to_string(),
+                    quote_style: None,
+                    span: Span::empty(),
+                }])),
                 joins: vec![],
             }],
             lateral_views: vec![],
@@ -5311,18 +6417,20 @@ fn parse_interval_and_or_xor() {
                     left: Box::new(Expr::Identifier(Ident {
                         value: "d3_date".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })),
                     op: BinaryOperator::Gt,
                     right: Box::new(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident {
                             value: "d1_date".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         })),
                         op: BinaryOperator::Plus,
                         right: Box::new(Expr::Interval(Interval {
-                            value: Box::new(Expr::Value(Value::SingleQuotedString(
-                                "5 days".to_string(),
-                            ))),
+                            value: Box::new(Expr::Value(
+                                (Value::SingleQuotedString("5 days".to_string())).with_empty_span(),
+                            )),
                             leading_field: None,
                             leading_precision: None,
                             last_field: None,
@@ -5335,18 +6443,20 @@ fn parse_interval_and_or_xor() {
                     left: Box::new(Expr::Identifier(Ident {
                         value: "d2_date".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })),
                     op: BinaryOperator::Gt,
                     right: Box::new(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident {
                             value: "d1_date".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         })),
                         op: BinaryOperator::Plus,
                         right: Box::new(Expr::Interval(Interval {
-                            value: Box::new(Expr::Value(Value::SingleQuotedString(
-                                "3 days".to_string(),
-                            ))),
+                            value: Box::new(Expr::Value(
+                                (Value::SingleQuotedString("3 days".to_string())).with_empty_span(),
+                            )),
                             leading_field: None,
                             leading_precision: None,
                             last_field: None,
@@ -5365,16 +6475,16 @@ fn parse_interval_and_or_xor() {
             window_before_qualify: false,
             value_table_mode: None,
             connect_by: None,
+            flavor: SelectFlavor::Standard,
         }))),
         order_by: None,
-        limit: None,
-        limit_by: vec![],
-        offset: None,
+        limit_clause: None,
         fetch: None,
         locks: vec![],
         for_clause: None,
         settings: None,
         format_clause: None,
+        pipe_operators: vec![],
     }))];
 
     assert_eq!(actual_ast, expected_ast);
@@ -5400,15 +6510,15 @@ fn parse_interval_and_or_xor() {
 
 #[test]
 fn parse_at_timezone() {
-    let zero = Expr::Value(number("0"));
+    let zero = Expr::value(number("0"));
     let sql = "SELECT FROM_UNIXTIME(0) AT TIME ZONE 'UTC-06:00' FROM t";
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::AtTimeZone {
             timestamp: Box::new(call("FROM_UNIXTIME", [zero.clone()])),
-            time_zone: Box::new(Expr::Value(Value::SingleQuotedString(
-                "UTC-06:00".to_string()
-            ))),
+            time_zone: Box::new(Expr::Value(
+                (Value::SingleQuotedString("UTC-06:00".to_string())).with_empty_span()
+            )),
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -5422,16 +6532,19 @@ fn parse_at_timezone() {
                 [
                     Expr::AtTimeZone {
                         timestamp: Box::new(call("FROM_UNIXTIME", [zero])),
-                        time_zone: Box::new(Expr::Value(Value::SingleQuotedString(
-                            "UTC-06:00".to_string()
-                        ))),
+                        time_zone: Box::new(Expr::Value(
+                            (Value::SingleQuotedString("UTC-06:00".to_string())).with_empty_span()
+                        )),
                     },
-                    Expr::Value(Value::SingleQuotedString("%Y-%m-%dT%H".to_string()),)
+                    Expr::Value(
+                        (Value::SingleQuotedString("%Y-%m-%dT%H".to_string())).with_empty_span()
+                    )
                 ]
             ),
             alias: Ident {
                 value: "hour".to_string(),
                 quote_style: Some('"'),
+                span: Span::empty(),
             },
         },
         only(&select.projection),
@@ -5462,9 +6575,11 @@ fn parse_json_keyword() {
 }'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::JSON,
-            value: r#"{
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(
+                    r#"{
   "id": 10,
   "type": "fruit",
   "name": "apple",
@@ -5484,21 +6599,55 @@ fn parse_json_keyword() {
       ]
     }
 }"#
-            .into()
-        },
+                    .to_string()
+                ),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false,
+        }),
         expr_from_projection(only(&select.projection)),
     );
 }
 
+#[test]
+fn parse_typed_strings() {
+    let expr = verified_expr(r#"JSON '{"foo":"bar"}'"#);
+    assert_eq!(
+        Expr::TypedString(TypedString {
+            data_type: DataType::JSON,
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"{"foo":"bar"}"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
+        expr
+    );
+
+    if let Expr::TypedString(TypedString {
+        data_type,
+        value,
+        uses_odbc_syntax: false,
+    }) = expr
+    {
+        assert_eq!(DataType::JSON, data_type);
+        assert_eq!(r#"{"foo":"bar"}"#, value.into_string().unwrap());
+    }
+}
+
 #[test]
 fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '0'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"0"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"0"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '0'");
@@ -5506,10 +6655,14 @@ fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '123456'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"123456"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"123456"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '123456'");
@@ -5517,10 +6670,14 @@ fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '-3.14'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"-3.14"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"-3.14"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '-3.14'");
@@ -5528,10 +6685,14 @@ fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '-0.54321'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"-0.54321"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"-0.54321"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '-0.54321'");
@@ -5539,10 +6700,14 @@ fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '1.23456e05'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"1.23456e05"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"1.23456e05"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '1.23456e05'");
@@ -5550,10 +6715,14 @@ fn parse_bignumeric_keyword() {
     let sql = r#"SELECT BIGNUMERIC '-9.876e-3'"#;
     let select = verified_only_select(sql);
     assert_eq!(
-        &Expr::TypedString {
+        &Expr::TypedString(TypedString {
             data_type: DataType::BigNumeric(ExactNumberInfo::None),
-            value: r#"-9.876e-3"#.into()
-        },
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString(r#"-9.876e-3"#.into()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        }),
         expr_from_projection(only(&select.projection)),
     );
     verified_stmt("SELECT BIGNUMERIC '-9.876e-3'");
@@ -5580,7 +6749,9 @@ fn parse_table_function() {
             assert_eq!(
                 call(
                     "FUN",
-                    [Expr::Value(Value::SingleQuotedString("1".to_owned()))],
+                    [Expr::Value(
+                        (Value::SingleQuotedString("1".to_owned())).with_empty_span()
+                    )],
                 ),
                 expr
             );
@@ -5763,9 +6934,9 @@ fn parse_unnest_in_from_clause() {
                 array_exprs: vec![call(
                     "make_array",
                     [
-                        Expr::Value(number("1")),
-                        Expr::Value(number("2")),
-                        Expr::Value(number("3")),
+                        Expr::value(number("1")),
+                        Expr::value(number("2")),
+                        Expr::value(number("3")),
                     ],
                 )],
                 with_offset: false,
@@ -5789,14 +6960,14 @@ fn parse_unnest_in_from_clause() {
                     call(
                         "make_array",
                         [
-                            Expr::Value(number("1")),
-                            Expr::Value(number("2")),
-                            Expr::Value(number("3")),
+                            Expr::value(number("1")),
+                            Expr::value(number("2")),
+                            Expr::value(number("3")),
                         ],
                     ),
                     call(
                         "make_array",
-                        [Expr::Value(number("5")), Expr::Value(number("6"))],
+                        [Expr::value(number("5")), Expr::value(number("6"))],
                     ),
                 ],
                 with_offset: false,
@@ -5839,26 +7010,32 @@ fn parse_searched_case_expr() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Case {
+            case_token: AttachedToken::empty(),
+            end_token: AttachedToken::empty(),
             operand: None,
             conditions: vec![
-                IsNull(Box::new(Identifier(Ident::new("bar")))),
-                BinaryOp {
-                    left: Box::new(Identifier(Ident::new("bar"))),
-                    op: Eq,
-                    right: Box::new(Expr::Value(number("0"))),
+                CaseWhen {
+                    condition: IsNull(Box::new(Identifier(Ident::new("bar")))),
+                    result: Expr::value(Value::SingleQuotedString("null".to_string())),
+                },
+                CaseWhen {
+                    condition: BinaryOp {
+                        left: Box::new(Identifier(Ident::new("bar"))),
+                        op: Eq,
+                        right: Box::new(Expr::value(number("0"))),
+                    },
+                    result: Expr::value(Value::SingleQuotedString("=0".to_string())),
                 },
-                BinaryOp {
-                    left: Box::new(Identifier(Ident::new("bar"))),
-                    op: GtEq,
-                    right: Box::new(Expr::Value(number("0"))),
+                CaseWhen {
+                    condition: BinaryOp {
+                        left: Box::new(Identifier(Ident::new("bar"))),
+                        op: GtEq,
+                        right: Box::new(Expr::value(number("0"))),
+                    },
+                    result: Expr::value(Value::SingleQuotedString(">=0".to_string())),
                 },
             ],
-            results: vec![
-                Expr::Value(Value::SingleQuotedString("null".to_string())),
-                Expr::Value(Value::SingleQuotedString("=0".to_string())),
-                Expr::Value(Value::SingleQuotedString(">=0".to_string())),
-            ],
-            else_result: Some(Box::new(Expr::Value(Value::SingleQuotedString(
+            else_result: Some(Box::new(Expr::value(Value::SingleQuotedString(
                 "<0".to_string()
             )))),
         },
@@ -5874,10 +7051,14 @@ fn parse_simple_case_expr() {
     use self::Expr::{Case, Identifier};
     assert_eq!(
         &Case {
+            case_token: AttachedToken::empty(),
+            end_token: AttachedToken::empty(),
             operand: Some(Box::new(Identifier(Ident::new("foo")))),
-            conditions: vec![Expr::Value(number("1"))],
-            results: vec![Expr::Value(Value::SingleQuotedString("Y".to_string()))],
-            else_result: Some(Box::new(Expr::Value(Value::SingleQuotedString(
+            conditions: vec![CaseWhen {
+                condition: Expr::value(number("1")),
+                result: Expr::value(Value::SingleQuotedString("Y".to_string())),
+            }],
+            else_result: Some(Box::new(Expr::value(Value::SingleQuotedString(
                 "N".to_string()
             )))),
         },
@@ -5904,27 +7085,11 @@ fn parse_implicit_join() {
     assert_eq!(
         vec![
             TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec!["t1".into()]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec!["t1".into()])),
                 joins: vec![],
             },
             TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec!["t2".into()]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec!["t2".into()])),
                 joins: vec![],
             },
         ],
@@ -5936,51 +7101,19 @@ fn parse_implicit_join() {
     assert_eq!(
         vec![
             TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec!["t1a".into()]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec!["t1a".into()])),
                 joins: vec![Join {
-                    relation: TableFactor::Table {
-                        name: ObjectName(vec!["t1b".into()]),
-                        alias: None,
-                        args: None,
-                        with_hints: vec![],
-                        version: None,
-                        partitions: vec![],
-                        with_ordinality: false,
-                    },
+                    relation: table_from_name(ObjectName::from(vec!["t1b".into()])),
                     global: false,
-                    join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+                    join_operator: JoinOperator::Join(JoinConstraint::Natural),
                 }],
             },
             TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec!["t2a".into()]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec!["t2a".into()])),
                 joins: vec![Join {
-                    relation: TableFactor::Table {
-                        name: ObjectName(vec!["t2b".into()]),
-                        alias: None,
-                        args: None,
-                        with_hints: vec![],
-                        version: None,
-                        partitions: vec![],
-                        with_ordinality: false,
-                    },
+                    relation: table_from_name(ObjectName::from(vec!["t2b".into()])),
                     global: false,
-                    join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+                    join_operator: JoinOperator::Join(JoinConstraint::Natural),
                 }],
             },
         ],
@@ -5994,15 +7127,7 @@ fn parse_cross_join() {
     let select = verified_only_select(sql);
     assert_eq!(
         Join {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("t2")]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![Ident::new("t2")])),
             global: false,
             join_operator: JoinOperator::CrossJoin,
         },
@@ -6020,13 +7145,16 @@ fn parse_joins_on() {
     ) -> Join {
         Join {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new(relation.into())]),
+                name: ObjectName::from(vec![Ident::new(relation.into())]),
                 alias,
                 args: None,
                 with_hints: vec![],
                 version: None,
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             global,
             join_operator: f(JoinConstraint::On(Expr::BinaryOp {
@@ -6043,7 +7171,7 @@ fn parse_joins_on() {
             "t2",
             table_alias("foo"),
             false,
-            JoinOperator::Inner,
+            JoinOperator::Join,
         )]
     );
     one_statement_parses_to(
@@ -6053,10 +7181,18 @@ fn parse_joins_on() {
     // Test parsing of different join operators
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 JOIN t2 ON c1 = c2").from).joins,
+        vec![join_with_constraint("t2", None, false, JoinOperator::Join)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 INNER JOIN t2 ON c1 = c2").from).joins,
         vec![join_with_constraint("t2", None, false, JoinOperator::Inner)]
     );
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2").from).joins,
+        vec![join_with_constraint("t2", None, false, JoinOperator::Left)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 LEFT OUTER JOIN t2 ON c1 = c2").from).joins,
         vec![join_with_constraint(
             "t2",
             None,
@@ -6066,6 +7202,10 @@ fn parse_joins_on() {
     );
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 RIGHT JOIN t2 ON c1 = c2").from).joins,
+        vec![join_with_constraint("t2", None, false, JoinOperator::Right)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 RIGHT OUTER JOIN t2 ON c1 = c2").from).joins,
         vec![join_with_constraint(
             "t2",
             None,
@@ -6147,16 +7287,21 @@ fn parse_joins_using() {
     ) -> Join {
         Join {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new(relation.into())]),
+                name: ObjectName::from(vec![Ident::new(relation.into())]),
                 alias,
                 args: None,
                 with_hints: vec![],
                 version: None,
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             global: false,
-            join_operator: f(JoinConstraint::Using(vec!["c1".into()])),
+            join_operator: f(JoinConstraint::Using(vec![ObjectName::from(vec![
+                "c1".into()
+            ])])),
         }
     }
     // Test parsing of aliases
@@ -6165,7 +7310,7 @@ fn parse_joins_using() {
         vec![join_with_constraint(
             "t2",
             table_alias("foo"),
-            JoinOperator::Inner,
+            JoinOperator::Join,
         )]
     );
     one_statement_parses_to(
@@ -6175,14 +7320,26 @@ fn parse_joins_using() {
     // Test parsing of different join operators
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 JOIN t2 USING(c1)").from).joins,
+        vec![join_with_constraint("t2", None, JoinOperator::Join)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 INNER JOIN t2 USING(c1)").from).joins,
         vec![join_with_constraint("t2", None, JoinOperator::Inner)]
     );
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 LEFT JOIN t2 USING(c1)").from).joins,
+        vec![join_with_constraint("t2", None, JoinOperator::Left)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 LEFT OUTER JOIN t2 USING(c1)").from).joins,
         vec![join_with_constraint("t2", None, JoinOperator::LeftOuter)]
     );
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 RIGHT JOIN t2 USING(c1)").from).joins,
+        vec![join_with_constraint("t2", None, JoinOperator::Right)]
+    );
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 RIGHT OUTER JOIN t2 USING(c1)").from).joins,
         vec![join_with_constraint("t2", None, JoinOperator::RightOuter)]
     );
     assert_eq!(
@@ -6213,6 +7370,7 @@ fn parse_joins_using() {
         only(&verified_only_select("SELECT * FROM t1 FULL JOIN t2 USING(c1)").from).joins,
         vec![join_with_constraint("t2", None, JoinOperator::FullOuter)]
     );
+    verified_stmt("SELECT * FROM tbl1 AS t1 JOIN tbl2 AS t2 USING(t2.col1)");
 }
 
 #[test]
@@ -6220,33 +7378,55 @@ fn parse_natural_join() {
     fn natural_join(f: impl Fn(JoinConstraint) -> JoinOperator, alias: Option<TableAlias>) -> Join {
         Join {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("t2")]),
+                name: ObjectName::from(vec![Ident::new("t2")]),
                 alias,
                 args: None,
                 with_hints: vec![],
                 version: None,
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             global: false,
             join_operator: f(JoinConstraint::Natural),
         }
     }
 
-    // if not specified, inner join as default
+    // unspecified join
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 NATURAL JOIN t2").from).joins,
+        vec![natural_join(JoinOperator::Join, None)]
+    );
+
+    // inner join explicitly
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 NATURAL INNER JOIN t2").from).joins,
         vec![natural_join(JoinOperator::Inner, None)]
     );
+
     // left join explicitly
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 NATURAL LEFT JOIN t2").from).joins,
+        vec![natural_join(JoinOperator::Left, None)]
+    );
+
+    // left outer join explicitly
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 NATURAL LEFT OUTER JOIN t2").from).joins,
         vec![natural_join(JoinOperator::LeftOuter, None)]
     );
 
     // right join explicitly
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 NATURAL RIGHT JOIN t2").from).joins,
+        vec![natural_join(JoinOperator::Right, None)]
+    );
+
+    // right outer join explicitly
+    assert_eq!(
+        only(&verified_only_select("SELECT * FROM t1 NATURAL RIGHT OUTER JOIN t2").from).joins,
         vec![natural_join(JoinOperator::RightOuter, None)]
     );
 
@@ -6259,7 +7439,7 @@ fn parse_natural_join() {
     // natural join another table with alias
     assert_eq!(
         only(&verified_only_select("SELECT * FROM t1 NATURAL JOIN t2 AS t3").from).joins,
-        vec![natural_join(JoinOperator::Inner, table_alias("t3"))]
+        vec![natural_join(JoinOperator::Join, table_alias("t3"))]
     );
 
     let sql = "SELECT * FROM t1 natural";
@@ -6326,24 +7506,19 @@ fn parse_join_nesting() {
 
 #[test]
 fn parse_join_syntax_variants() {
-    one_statement_parses_to(
-        "SELECT c1 FROM t1 INNER JOIN t2 USING(c1)",
-        "SELECT c1 FROM t1 JOIN t2 USING(c1)",
-    );
-    one_statement_parses_to(
-        "SELECT c1 FROM t1 LEFT OUTER JOIN t2 USING(c1)",
-        "SELECT c1 FROM t1 LEFT JOIN t2 USING(c1)",
-    );
-    one_statement_parses_to(
-        "SELECT c1 FROM t1 RIGHT OUTER JOIN t2 USING(c1)",
-        "SELECT c1 FROM t1 RIGHT JOIN t2 USING(c1)",
-    );
+    verified_stmt("SELECT c1 FROM t1 JOIN t2 USING(c1)");
+    verified_stmt("SELECT c1 FROM t1 INNER JOIN t2 USING(c1)");
+    verified_stmt("SELECT c1 FROM t1 LEFT JOIN t2 USING(c1)");
+    verified_stmt("SELECT c1 FROM t1 LEFT OUTER JOIN t2 USING(c1)");
+    verified_stmt("SELECT c1 FROM t1 RIGHT JOIN t2 USING(c1)");
+    verified_stmt("SELECT c1 FROM t1 RIGHT OUTER JOIN t2 USING(c1)");
     one_statement_parses_to(
         "SELECT c1 FROM t1 FULL OUTER JOIN t2 USING(c1)",
         "SELECT c1 FROM t1 FULL JOIN t2 USING(c1)",
     );
 
-    let res = parse_sql_statements("SELECT * FROM a OUTER JOIN b ON 1");
+    let dialects = all_dialects_except(|d| d.is_table_alias(&Keyword::OUTER, &mut Parser::new(d)));
+    let res = dialects.parse_sql_statements("SELECT * FROM a OUTER JOIN b ON 1");
     assert_eq!(
         ParserError::ParserError("Expected: APPLY, found: JOIN".to_string()),
         res.unwrap_err()
@@ -6442,16 +7617,45 @@ fn parse_recursive_cte() {
             name: Ident {
                 value: "nums".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
             columns: vec![TableAliasColumnDef::from_name("val")],
         },
         query: Box::new(cte_query),
         from: None,
         materialized: None,
+        closing_paren_token: AttachedToken::empty(),
     };
     assert_eq!(with.cte_tables.first().unwrap(), &expected);
 }
 
+#[test]
+fn parse_cte_in_data_modification_statements() {
+    match verified_stmt("WITH x AS (SELECT 1) UPDATE t SET bar = (SELECT * FROM x)") {
+        Statement::Query(query) => {
+            assert_eq!(query.with.unwrap().to_string(), "WITH x AS (SELECT 1)");
+            assert!(matches!(*query.body, SetExpr::Update(_)));
+        }
+        other => panic!("Expected: UPDATE, got: {other:?}"),
+    }
+
+    match verified_stmt("WITH t (x) AS (SELECT 9) DELETE FROM q WHERE id IN (SELECT x FROM t)") {
+        Statement::Query(query) => {
+            assert_eq!(query.with.unwrap().to_string(), "WITH t (x) AS (SELECT 9)");
+            assert!(matches!(*query.body, SetExpr::Delete(_)));
+        }
+        other => panic!("Expected: DELETE, got: {other:?}"),
+    }
+
+    match verified_stmt("WITH x AS (SELECT 42) INSERT INTO t SELECT foo FROM x") {
+        Statement::Query(query) => {
+            assert_eq!(query.with.unwrap().to_string(), "WITH x AS (SELECT 42)");
+            assert!(matches!(*query.body, SetExpr::Insert(_)));
+        }
+        other => panic!("Expected: INSERT, got: {other:?}"),
+    }
+}
+
 #[test]
 fn parse_derived_tables() {
     let sql = "SELECT a.x, b.y FROM (SELECT x FROM foo) AS a CROSS JOIN (SELECT y FROM bar) AS b";
@@ -6488,17 +7692,9 @@ fn parse_derived_tables() {
                     }),
                 },
                 joins: vec![Join {
-                    relation: TableFactor::Table {
-                        name: ObjectName(vec!["t2".into()]),
-                        alias: None,
-                        args: None,
-                        with_hints: vec![],
-                        version: None,
-                        partitions: vec![],
-                        with_ordinality: false,
-                    },
+                    relation: table_from_name(ObjectName::from(vec!["t2".into()])),
                     global: false,
-                    join_operator: JoinOperator::Inner(JoinConstraint::Natural),
+                    join_operator: JoinOperator::Join(JoinConstraint::Natural),
                 }],
             }),
             alias: None,
@@ -6507,7 +7703,7 @@ fn parse_derived_tables() {
 }
 
 #[test]
-fn parse_union_except_intersect() {
+fn parse_union_except_intersect_minus() {
     // TODO: add assertions
     verified_stmt("SELECT 1 UNION SELECT 2");
     verified_stmt("SELECT 1 UNION ALL SELECT 2");
@@ -6533,6 +7729,13 @@ fn parse_union_except_intersect() {
     verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT BY NAME SELECT 9 AS y, 8 AS x");
     verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT ALL BY NAME SELECT 9 AS y, 8 AS x");
     verified_stmt("SELECT 1 AS x, 2 AS y INTERSECT DISTINCT BY NAME SELECT 9 AS y, 8 AS x");
+
+    // Dialects that support `MINUS` as column identifier
+    // do not support `MINUS` as a set operator.
+    let dialects = all_dialects_where(|d| !d.is_column_alias(&Keyword::MINUS, &mut Parser::new(d)));
+    dialects.verified_stmt("SELECT 1 MINUS SELECT 2");
+    dialects.verified_stmt("SELECT 1 MINUS ALL SELECT 2");
+    dialects.verified_stmt("SELECT 1 MINUS DISTINCT SELECT 1");
 }
 
 #[test]
@@ -6613,6 +7816,9 @@ fn parse_substring() {
     verified_stmt("SELECT SUBSTRING('1', 1, 3)");
     verified_stmt("SELECT SUBSTRING('1', 1)");
     verified_stmt("SELECT SUBSTRING('1' FOR 3)");
+    verified_stmt("SELECT SUBSTRING('foo' FROM 1 FOR 2) FROM t");
+    verified_stmt("SELECT SUBSTR('foo' FROM 1 FOR 2) FROM t");
+    verified_stmt("SELECT SUBSTR('foo', 1, 2) FROM t");
 }
 
 #[test]
@@ -6634,13 +7840,15 @@ fn parse_overlay() {
     let select = verified_only_select(sql);
     assert_eq!(
         &Expr::Overlay {
-            expr: Box::new(Expr::Value(Value::SingleQuotedString("abcdef".to_string()))),
+            expr: Box::new(Expr::Value(
+                (Value::SingleQuotedString("abcdef".to_string())).with_empty_span()
+            )),
             overlay_what: Box::new(Expr::Identifier(Ident::new("name"))),
-            overlay_from: Box::new(Expr::Value(number("3"))),
+            overlay_from: Box::new(Expr::value(number("3"))),
             overlay_for: Some(Box::new(Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("id"))),
                 op: BinaryOperator::Plus,
-                right: Box::new(Expr::Value(number("1"))),
+                right: Box::new(Expr::value(number("1"))),
             })),
         },
         expr_from_projection(only(&select.projection))
@@ -6691,7 +7899,6 @@ fn parse_trim() {
         Box::new(MySqlDialect {}),
         //Box::new(BigQueryDialect {}),
         Box::new(SQLiteDialect {}),
-        Box::new(DuckDbDialect {}),
     ]);
 
     assert_eq!(
@@ -6756,11 +7963,35 @@ fn parse_create_database() {
             if_not_exists,
             location,
             managed_location,
+            clone,
+            ..
+        } => {
+            assert_eq!("mydb", db_name.to_string());
+            assert!(!if_not_exists);
+            assert_eq!(None, location);
+            assert_eq!(None, managed_location);
+            assert_eq!(None, clone);
+        }
+        _ => unreachable!(),
+    }
+    let sql = "CREATE DATABASE mydb CLONE otherdb";
+    match verified_stmt(sql) {
+        Statement::CreateDatabase {
+            db_name,
+            if_not_exists,
+            location,
+            managed_location,
+            clone,
+            ..
         } => {
             assert_eq!("mydb", db_name.to_string());
             assert!(!if_not_exists);
             assert_eq!(None, location);
             assert_eq!(None, managed_location);
+            assert_eq!(
+                Some(ObjectName::from(vec![Ident::new("otherdb".to_string())])),
+                clone
+            );
         }
         _ => unreachable!(),
     }
@@ -6775,11 +8006,14 @@ fn parse_create_database_ine() {
             if_not_exists,
             location,
             managed_location,
+            clone,
+            ..
         } => {
             assert_eq!("mydb", db_name.to_string());
             assert!(if_not_exists);
             assert_eq!(None, location);
             assert_eq!(None, managed_location);
+            assert_eq!(None, clone);
         }
         _ => unreachable!(),
     }
@@ -6827,6 +8061,7 @@ fn parse_create_view() {
     let sql = "CREATE VIEW myschema.myview AS SELECT foo FROM bar";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             columns,
             query,
@@ -6839,7 +8074,10 @@ fn parse_create_view() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("myschema.myview", name.to_string());
             assert_eq!(Vec::<ViewColumnDef>::new(), columns);
             assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -6851,10 +8089,13 @@ fn parse_create_view() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
+
+    let _ = verified_stmt("CREATE OR ALTER VIEW v AS SELECT 1");
 }
 
 #[test]
@@ -6866,11 +8107,13 @@ fn parse_create_view_with_options() {
                 CreateTableOptions::With(vec![
                     SqlOption::KeyValue {
                         key: "foo".into(),
-                        value: Expr::Value(Value::SingleQuotedString("bar".into())),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("bar".into())).with_empty_span()
+                        ),
                     },
                     SqlOption::KeyValue {
                         key: "a".into(),
-                        value: Expr::Value(number("123")),
+                        value: Expr::value(number("123")),
                     },
                 ]),
                 options
@@ -6887,6 +8130,7 @@ fn parse_create_view_with_columns() {
     // match all_dialects().verified_stmt(sql) {
     match all_dialects_except(|d| d.is::<ClickHouseDialect>()).verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             columns,
             or_replace,
@@ -6899,7 +8143,10 @@ fn parse_create_view_with_columns() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("v", name.to_string());
             assert_eq!(
                 columns,
@@ -6908,7 +8155,7 @@ fn parse_create_view_with_columns() {
                     .map(|name| ViewColumnDef {
                         name,
                         data_type: None,
-                        options: None
+                        options: None,
                     })
                     .collect::<Vec<_>>()
             );
@@ -6921,7 +8168,8 @@ fn parse_create_view_with_columns() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -6932,6 +8180,7 @@ fn parse_create_view_temporary() {
     let sql = "CREATE TEMPORARY VIEW myschema.myview AS SELECT foo FROM bar";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             columns,
             query,
@@ -6944,7 +8193,10 @@ fn parse_create_view_temporary() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("myschema.myview", name.to_string());
             assert_eq!(Vec::<ViewColumnDef>::new(), columns);
             assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -6956,7 +8208,8 @@ fn parse_create_view_temporary() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -6967,6 +8220,7 @@ fn parse_create_or_replace_view() {
     let sql = "CREATE OR REPLACE VIEW v AS SELECT 1";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             columns,
             or_replace,
@@ -6979,7 +8233,10 @@ fn parse_create_or_replace_view() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("v", name.to_string());
             assert_eq!(columns, vec![]);
             assert_eq!(options, CreateTableOptions::None);
@@ -6991,7 +8248,8 @@ fn parse_create_or_replace_view() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -7006,6 +8264,7 @@ fn parse_create_or_replace_materialized_view() {
     let sql = "CREATE OR REPLACE MATERIALIZED VIEW v AS SELECT 1";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             columns,
             or_replace,
@@ -7018,7 +8277,10 @@ fn parse_create_or_replace_materialized_view() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("v", name.to_string());
             assert_eq!(columns, vec![]);
             assert_eq!(options, CreateTableOptions::None);
@@ -7030,7 +8292,8 @@ fn parse_create_or_replace_materialized_view() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -7041,6 +8304,7 @@ fn parse_create_materialized_view() {
     let sql = "CREATE MATERIALIZED VIEW myschema.myview AS SELECT foo FROM bar";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             or_replace,
             columns,
@@ -7053,7 +8317,10 @@ fn parse_create_materialized_view() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("myschema.myview", name.to_string());
             assert_eq!(Vec::<ViewColumnDef>::new(), columns);
             assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -7065,7 +8332,8 @@ fn parse_create_materialized_view() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -7076,6 +8344,7 @@ fn parse_create_materialized_view_with_cluster_by() {
     let sql = "CREATE MATERIALIZED VIEW myschema.myview CLUSTER BY (foo) AS SELECT foo FROM bar";
     match verified_stmt(sql) {
         Statement::CreateView {
+            or_alter,
             name,
             or_replace,
             columns,
@@ -7088,7 +8357,10 @@ fn parse_create_materialized_view_with_cluster_by() {
             if_not_exists,
             temporary,
             to,
+            params,
+            name_before_not_exists: _,
         } => {
+            assert_eq!(or_alter, false);
             assert_eq!("myschema.myview", name.to_string());
             assert_eq!(Vec::<ViewColumnDef>::new(), columns);
             assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -7100,7 +8372,8 @@ fn parse_create_materialized_view_with_cluster_by() {
             assert!(!late_binding);
             assert!(!if_not_exists);
             assert!(!temporary);
-            assert!(to.is_none())
+            assert!(to.is_none());
+            assert!(params.is_none());
         }
         _ => unreachable!(),
     }
@@ -7182,6 +8455,27 @@ fn parse_drop_view() {
         }
         _ => unreachable!(),
     }
+
+    verified_stmt("DROP MATERIALIZED VIEW a.b.c");
+    verified_stmt("DROP MATERIALIZED VIEW IF EXISTS a.b.c");
+}
+
+#[test]
+fn parse_drop_user() {
+    let sql = "DROP USER u1";
+    match verified_stmt(sql) {
+        Statement::Drop {
+            names, object_type, ..
+        } => {
+            assert_eq!(
+                vec!["u1"],
+                names.iter().map(ToString::to_string).collect::<Vec<_>>()
+            );
+            assert_eq!(ObjectType::User, object_type);
+        }
+        _ => unreachable!(),
+    }
+    verified_stmt("DROP USER IF EXISTS u1");
 }
 
 #[test]
@@ -7195,53 +8489,70 @@ fn parse_invalid_subquery_without_parens() {
 
 #[test]
 fn parse_offset() {
-    let expect = Some(Offset {
-        value: Expr::Value(number("2")),
-        rows: OffsetRows::Rows,
+    // Dialects that support `OFFSET` as column identifiers
+    // don't support this syntax.
+    let dialects =
+        all_dialects_where(|d| !d.is_column_alias(&Keyword::OFFSET, &mut Parser::new(d)));
+
+    let expected_limit_clause = &Some(LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("2")),
+            rows: OffsetRows::Rows,
+        }),
+        limit_by: vec![],
     });
-    let ast = verified_query("SELECT foo FROM bar OFFSET 2 ROWS");
-    assert_eq!(ast.offset, expect);
-    let ast = verified_query("SELECT foo FROM bar WHERE foo = 4 OFFSET 2 ROWS");
-    assert_eq!(ast.offset, expect);
-    let ast = verified_query("SELECT foo FROM bar ORDER BY baz OFFSET 2 ROWS");
-    assert_eq!(ast.offset, expect);
-    let ast = verified_query("SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS");
-    assert_eq!(ast.offset, expect);
-    let ast = verified_query("SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS) OFFSET 2 ROWS");
-    assert_eq!(ast.offset, expect);
+    let ast = dialects.verified_query("SELECT foo FROM bar OFFSET 2 ROWS");
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
+    let ast = dialects.verified_query("SELECT foo FROM bar WHERE foo = 4 OFFSET 2 ROWS");
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
+    let ast = dialects.verified_query("SELECT foo FROM bar ORDER BY baz OFFSET 2 ROWS");
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
+    let ast =
+        dialects.verified_query("SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS");
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
+    let ast =
+        dialects.verified_query("SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS) OFFSET 2 ROWS");
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
     match *ast.body {
         SetExpr::Select(s) => match only(s.from).relation {
             TableFactor::Derived { subquery, .. } => {
-                assert_eq!(subquery.offset, expect);
+                assert_eq!(&subquery.limit_clause, expected_limit_clause);
             }
             _ => panic!("Test broke"),
         },
         _ => panic!("Test broke"),
     }
-    let ast = verified_query("SELECT 'foo' OFFSET 0 ROWS");
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(number("0")),
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("0")),
             rows: OffsetRows::Rows,
-        })
-    );
-    let ast = verified_query("SELECT 'foo' OFFSET 1 ROW");
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(number("1")),
+        }),
+        limit_by: vec![],
+    };
+    let ast = dialects.verified_query("SELECT 'foo' OFFSET 0 ROWS");
+    assert_eq!(ast.limit_clause, Some(expected_limit_clause));
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("1")),
             rows: OffsetRows::Row,
-        })
-    );
-    let ast = verified_query("SELECT 'foo' OFFSET 1");
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(number("1")),
+        }),
+        limit_by: vec![],
+    };
+    let ast = dialects.verified_query("SELECT 'foo' OFFSET 1 ROW");
+    assert_eq!(ast.limit_clause, Some(expected_limit_clause));
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("2")),
             rows: OffsetRows::None,
-        })
-    );
+        }),
+        limit_by: vec![],
+    };
+    let ast = dialects.verified_query("SELECT 'foo' OFFSET 2");
+    assert_eq!(ast.limit_clause, Some(expected_limit_clause));
 }
 
 #[test]
@@ -7249,7 +8560,7 @@ fn parse_fetch() {
     let fetch_first_two_rows_only = Some(Fetch {
         with_ties: false,
         percent: false,
-        quantity: Some(Expr::Value(number("2"))),
+        quantity: Some(Expr::value(number("2"))),
     });
     let ast = verified_query("SELECT foo FROM bar FETCH FIRST 2 ROWS ONLY");
     assert_eq!(ast.fetch, fetch_first_two_rows_only);
@@ -7276,7 +8587,7 @@ fn parse_fetch() {
         Some(Fetch {
             with_ties: true,
             percent: false,
-            quantity: Some(Expr::Value(number("2"))),
+            quantity: Some(Expr::value(number("2"))),
         })
     );
     let ast = verified_query("SELECT foo FROM bar FETCH FIRST 50 PERCENT ROWS ONLY");
@@ -7285,19 +8596,21 @@ fn parse_fetch() {
         Some(Fetch {
             with_ties: false,
             percent: true,
-            quantity: Some(Expr::Value(number("50"))),
+            quantity: Some(Expr::value(number("50"))),
         })
     );
     let ast = verified_query(
         "SELECT foo FROM bar WHERE foo = 4 ORDER BY baz OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY",
     );
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(number("2")),
+    let expected_limit_clause = Some(LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("2")),
             rows: OffsetRows::Rows,
-        })
-    );
+        }),
+        limit_by: vec![],
+    });
+    assert_eq!(ast.limit_clause, expected_limit_clause);
     assert_eq!(ast.fetch, fetch_first_two_rows_only);
     let ast = verified_query(
         "SELECT foo FROM (SELECT * FROM bar FETCH FIRST 2 ROWS ONLY) FETCH FIRST 2 ROWS ONLY",
@@ -7313,24 +8626,20 @@ fn parse_fetch() {
         _ => panic!("Test broke"),
     }
     let ast = verified_query("SELECT foo FROM (SELECT * FROM bar OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY) OFFSET 2 ROWS FETCH FIRST 2 ROWS ONLY");
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(number("2")),
+    let expected_limit_clause = &Some(LimitClause::LimitOffset {
+        limit: None,
+        offset: Some(Offset {
+            value: Expr::value(number("2")),
             rows: OffsetRows::Rows,
-        })
-    );
+        }),
+        limit_by: vec![],
+    });
+    assert_eq!(&ast.limit_clause, expected_limit_clause);
     assert_eq!(ast.fetch, fetch_first_two_rows_only);
     match *ast.body {
         SetExpr::Select(s) => match only(s.from).relation {
             TableFactor::Derived { subquery, .. } => {
-                assert_eq!(
-                    subquery.offset,
-                    Some(Offset {
-                        value: Expr::Value(number("2")),
-                        rows: OffsetRows::Rows,
-                    })
-                );
+                assert_eq!(&subquery.limit_clause, expected_limit_clause);
                 assert_eq!(subquery.fetch, fetch_first_two_rows_only);
             }
             _ => panic!("Test broke"),
@@ -7377,7 +8686,9 @@ fn lateral_derived() {
         let join = &from.joins[0];
         assert_eq!(
             join.join_operator,
-            JoinOperator::LeftOuter(JoinConstraint::On(Expr::Value(test_utils::number("1"))))
+            JoinOperator::Left(JoinConstraint::On(Expr::Value(
+                (test_utils::number("1")).with_empty_span()
+            )))
         );
         if let TableFactor::Derived {
             lateral,
@@ -7420,36 +8731,27 @@ fn lateral_function() {
     let sql = "SELECT * FROM customer LEFT JOIN LATERAL generate_series(1, customer.id)";
     let actual_select_only = verified_only_select(sql);
     let expected = Select {
+        select_token: AttachedToken::empty(),
         distinct: None,
         top: None,
+        projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions::default())],
+        exclude: None,
         top_before_distinct: false,
-        projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions {
-            opt_ilike: None,
-            opt_exclude: None,
-            opt_except: None,
-            opt_rename: None,
-            opt_replace: None,
-        })],
         into: None,
         from: vec![TableWithJoins {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "customer".to_string(),
-                    quote_style: None,
-                }]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![Ident {
+                value: "customer".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }])),
             joins: vec![Join {
                 relation: TableFactor::Function {
                     lateral: true,
-                    name: ObjectName(vec!["generate_series".into()]),
+                    name: ObjectName::from(vec!["generate_series".into()]),
                     args: vec![
-                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("1")))),
+                        FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            (number("1")).with_empty_span(),
+                        ))),
                         FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::CompoundIdentifier(
                             vec![Ident::new("customer"), Ident::new("id")],
                         ))),
@@ -7457,7 +8759,7 @@ fn lateral_function() {
                     alias: None,
                 },
                 global: false,
-                join_operator: JoinOperator::LeftOuter(JoinConstraint::None),
+                join_operator: JoinOperator::Left(JoinConstraint::None),
             }],
         }],
         lateral_views: vec![],
@@ -7473,13 +8775,22 @@ fn lateral_function() {
         window_before_qualify: false,
         value_table_mode: None,
         connect_by: None,
+        flavor: SelectFlavor::Standard,
     };
     assert_eq!(actual_select_only, expected);
 }
 
 #[test]
 fn parse_start_transaction() {
-    match verified_stmt("START TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE") {
+    let dialects = all_dialects_except(|d|
+        // BigQuery and Snowflake does not support this syntax
+        //
+        // BigQuery: <https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#begin_transaction>
+        // Snowflake: <https://docs.snowflake.com/en/sql-reference/sql/begin>
+        d.is::<BigQueryDialect>() || d.is::<SnowflakeDialect>());
+    match dialects
+        .verified_stmt("START TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE")
+    {
         Statement::StartTransaction { modes, .. } => assert_eq!(
             modes,
             vec![
@@ -7493,7 +8804,7 @@ fn parse_start_transaction() {
 
     // For historical reasons, PostgreSQL allows the commas between the modes to
     // be omitted.
-    match one_statement_parses_to(
+    match dialects.one_statement_parses_to(
         "START TRANSACTION READ ONLY READ WRITE ISOLATION LEVEL SERIALIZABLE",
         "START TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE",
     ) {
@@ -7508,44 +8819,65 @@ fn parse_start_transaction() {
         _ => unreachable!(),
     }
 
-    verified_stmt("START TRANSACTION");
-    one_statement_parses_to("BEGIN", "BEGIN TRANSACTION");
-    one_statement_parses_to("BEGIN WORK", "BEGIN TRANSACTION");
-    one_statement_parses_to("BEGIN TRANSACTION", "BEGIN TRANSACTION");
+    dialects.verified_stmt("START TRANSACTION");
+    dialects.verified_stmt("BEGIN");
+    dialects.verified_stmt("BEGIN WORK");
+    dialects.verified_stmt("BEGIN TRANSACTION");
 
-    verified_stmt("START TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
-    verified_stmt("START TRANSACTION ISOLATION LEVEL READ COMMITTED");
-    verified_stmt("START TRANSACTION ISOLATION LEVEL REPEATABLE READ");
-    verified_stmt("START TRANSACTION ISOLATION LEVEL SERIALIZABLE");
+    dialects.verified_stmt("START TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
+    dialects.verified_stmt("START TRANSACTION ISOLATION LEVEL READ COMMITTED");
+    dialects.verified_stmt("START TRANSACTION ISOLATION LEVEL REPEATABLE READ");
+    dialects.verified_stmt("START TRANSACTION ISOLATION LEVEL SERIALIZABLE");
 
     // Regression test for https://github.com/sqlparser-rs/sqlparser-rs/pull/139,
     // in which START TRANSACTION would fail to parse if followed by a statement
     // terminator.
     assert_eq!(
-        parse_sql_statements("START TRANSACTION; SELECT 1"),
+        dialects.parse_sql_statements("START TRANSACTION; SELECT 1"),
         Ok(vec![
             verified_stmt("START TRANSACTION"),
             verified_stmt("SELECT 1"),
         ])
     );
 
-    let res = parse_sql_statements("START TRANSACTION ISOLATION LEVEL BAD");
+    let res = dialects.parse_sql_statements("START TRANSACTION ISOLATION LEVEL BAD");
     assert_eq!(
         ParserError::ParserError("Expected: isolation level, found: BAD".to_string()),
         res.unwrap_err()
     );
 
-    let res = parse_sql_statements("START TRANSACTION BAD");
+    let res = dialects.parse_sql_statements("START TRANSACTION BAD");
     assert_eq!(
         ParserError::ParserError("Expected: end of statement, found: BAD".to_string()),
         res.unwrap_err()
     );
 
-    let res = parse_sql_statements("START TRANSACTION READ ONLY,");
+    let res = dialects.parse_sql_statements("START TRANSACTION READ ONLY,");
     assert_eq!(
         ParserError::ParserError("Expected: transaction mode, found: EOF".to_string()),
         res.unwrap_err()
     );
+
+    // MS-SQL syntax
+    let dialects = all_dialects_where(|d| d.supports_start_transaction_modifier());
+    dialects.verified_stmt("BEGIN TRY");
+    dialects.verified_stmt("BEGIN CATCH");
+
+    let dialects = all_dialects_where(|d| {
+        d.supports_start_transaction_modifier() && d.supports_end_transaction_modifier()
+    });
+    dialects
+        .parse_sql_statements(
+            r#"
+        BEGIN TRY;
+            SELECT 1/0;
+        END TRY;
+        BEGIN CATCH;
+            EXECUTE foo;
+        END CATCH;
+    "#,
+        )
+        .unwrap();
 }
 
 #[test]
@@ -7554,11 +8886,11 @@ fn parse_set_transaction() {
     // TRANSACTION, so no need to duplicate the tests here. We just do a quick
     // sanity check.
     match verified_stmt("SET TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE") {
-        Statement::SetTransaction {
+        Statement::Set(Set::SetTransaction {
             modes,
             session,
             snapshot,
-        } => {
+        }) => {
             assert_eq!(
                 modes,
                 vec![
@@ -7577,21 +8909,40 @@ fn parse_set_transaction() {
 #[test]
 fn parse_set_variable() {
     match verified_stmt("SET SOMETHING = '1'") {
-        Statement::SetVariable {
-            local,
+        Statement::Set(Set::SingleAssignment {
+            scope,
             hivevar,
-            variables,
-            value,
-        } => {
-            assert!(!local);
+            variable,
+            values,
+        }) => {
+            assert_eq!(scope, None);
             assert!(!hivevar);
+            assert_eq!(variable, ObjectName::from(vec!["SOMETHING".into()]));
             assert_eq!(
-                variables,
-                OneOrManyWithParens::One(ObjectName(vec!["SOMETHING".into()]))
+                values,
+                vec![Expr::Value(
+                    (Value::SingleQuotedString("1".into())).with_empty_span()
+                )]
             );
+        }
+        _ => unreachable!(),
+    }
+
+    match verified_stmt("SET GLOBAL VARIABLE = 'Value'") {
+        Statement::Set(Set::SingleAssignment {
+            scope,
+            hivevar,
+            variable,
+            values,
+        }) => {
+            assert_eq!(scope, Some(ContextModifier::Global));
+            assert!(!hivevar);
+            assert_eq!(variable, ObjectName::from(vec!["VARIABLE".into()]));
             assert_eq!(
-                value,
-                vec![Expr::Value(Value::SingleQuotedString("1".into()))]
+                values,
+                vec![Expr::Value(
+                    (Value::SingleQuotedString("Value".into())).with_empty_span()
+                )]
             );
         }
         _ => unreachable!(),
@@ -7600,28 +8951,21 @@ fn parse_set_variable() {
     let multi_variable_dialects = all_dialects_where(|d| d.supports_parenthesized_set_variables());
     let sql = r#"SET (a, b, c) = (1, 2, 3)"#;
     match multi_variable_dialects.verified_stmt(sql) {
-        Statement::SetVariable {
-            local,
-            hivevar,
-            variables,
-            value,
-        } => {
-            assert!(!local);
-            assert!(!hivevar);
+        Statement::Set(Set::ParenthesizedAssignments { variables, values }) => {
             assert_eq!(
                 variables,
-                OneOrManyWithParens::Many(vec![
-                    ObjectName(vec!["a".into()]),
-                    ObjectName(vec!["b".into()]),
-                    ObjectName(vec!["c".into()]),
-                ])
+                vec![
+                    ObjectName::from(vec!["a".into()]),
+                    ObjectName::from(vec!["b".into()]),
+                    ObjectName::from(vec!["c".into()]),
+                ]
             );
             assert_eq!(
-                value,
+                values,
                 vec![
-                    Expr::Value(number("1")),
-                    Expr::Value(number("2")),
-                    Expr::Value(number("3")),
+                    Expr::value(number("1")),
+                    Expr::value(number("2")),
+                    Expr::value(number("3")),
                 ]
             );
         }
@@ -7677,21 +9021,20 @@ fn parse_set_variable() {
 #[test]
 fn parse_set_role_as_variable() {
     match verified_stmt("SET role = 'foobar'") {
-        Statement::SetVariable {
-            local,
+        Statement::Set(Set::SingleAssignment {
+            scope,
             hivevar,
-            variables,
-            value,
-        } => {
-            assert!(!local);
+            variable,
+            values,
+        }) => {
+            assert_eq!(scope, None);
             assert!(!hivevar);
+            assert_eq!(variable, ObjectName::from(vec!["role".into()]));
             assert_eq!(
-                variables,
-                OneOrManyWithParens::One(ObjectName(vec!["role".into()]))
-            );
-            assert_eq!(
-                value,
-                vec![Expr::Value(Value::SingleQuotedString("foobar".into()))]
+                values,
+                vec![Expr::Value(
+                    (Value::SingleQuotedString("foobar".into())).with_empty_span()
+                )]
             );
         }
         _ => unreachable!(),
@@ -7707,15 +9050,16 @@ fn parse_double_colon_cast_at_timezone() {
         &Expr::AtTimeZone {
             timestamp: Box::new(Expr::Cast {
                 kind: CastKind::DoubleColon,
-                expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "2001-01-01T00:00:00.000Z".to_string()
-                ),)),
+                expr: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("2001-01-01T00:00:00.000Z".to_string()))
+                        .with_empty_span()
+                )),
                 data_type: DataType::Timestamp(None, TimezoneInfo::None),
                 format: None
             }),
-            time_zone: Box::new(Expr::Value(Value::SingleQuotedString(
-                "Europe/Brussels".to_string()
-            ))),
+            time_zone: Box::new(Expr::Value(
+                (Value::SingleQuotedString("Europe/Brussels".to_string())).with_empty_span()
+            )),
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -7724,21 +9068,20 @@ fn parse_double_colon_cast_at_timezone() {
 #[test]
 fn parse_set_time_zone() {
     match verified_stmt("SET TIMEZONE = 'UTC'") {
-        Statement::SetVariable {
-            local,
+        Statement::Set(Set::SingleAssignment {
+            scope,
             hivevar,
-            variables: variable,
-            value,
-        } => {
-            assert!(!local);
+            variable,
+            values,
+        }) => {
+            assert_eq!(scope, None);
             assert!(!hivevar);
+            assert_eq!(variable, ObjectName::from(vec!["TIMEZONE".into()]));
             assert_eq!(
-                variable,
-                OneOrManyWithParens::One(ObjectName(vec!["TIMEZONE".into()]))
-            );
-            assert_eq!(
-                value,
-                vec![Expr::Value(Value::SingleQuotedString("UTC".into()))]
+                values,
+                vec![Expr::Value(
+                    (Value::SingleQuotedString("UTC".into())).with_empty_span()
+                )]
             );
         }
         _ => unreachable!(),
@@ -7747,26 +9090,15 @@ fn parse_set_time_zone() {
     one_statement_parses_to("SET TIME ZONE TO 'UTC'", "SET TIMEZONE = 'UTC'");
 }
 
-#[test]
-fn parse_set_time_zone_alias() {
-    match verified_stmt("SET TIME ZONE 'UTC'") {
-        Statement::SetTimeZone { local, value } => {
-            assert!(!local);
-            assert_eq!(value, Expr::Value(Value::SingleQuotedString("UTC".into())));
-        }
-        _ => unreachable!(),
-    }
-}
-
 #[test]
 fn parse_commit() {
     match verified_stmt("COMMIT") {
-        Statement::Commit { chain: false } => (),
+        Statement::Commit { chain: false, .. } => (),
         _ => unreachable!(),
     }
 
     match verified_stmt("COMMIT AND CHAIN") {
-        Statement::Commit { chain: true } => (),
+        Statement::Commit { chain: true, .. } => (),
         _ => unreachable!(),
     }
 
@@ -7781,13 +9113,17 @@ fn parse_commit() {
 
 #[test]
 fn parse_end() {
-    one_statement_parses_to("END AND NO CHAIN", "COMMIT");
-    one_statement_parses_to("END WORK AND NO CHAIN", "COMMIT");
-    one_statement_parses_to("END TRANSACTION AND NO CHAIN", "COMMIT");
-    one_statement_parses_to("END WORK AND CHAIN", "COMMIT AND CHAIN");
-    one_statement_parses_to("END TRANSACTION AND CHAIN", "COMMIT AND CHAIN");
-    one_statement_parses_to("END WORK", "COMMIT");
-    one_statement_parses_to("END TRANSACTION", "COMMIT");
+    one_statement_parses_to("END AND NO CHAIN", "END");
+    one_statement_parses_to("END WORK AND NO CHAIN", "END");
+    one_statement_parses_to("END TRANSACTION AND NO CHAIN", "END");
+    one_statement_parses_to("END WORK AND CHAIN", "END AND CHAIN");
+    one_statement_parses_to("END TRANSACTION AND CHAIN", "END AND CHAIN");
+    one_statement_parses_to("END WORK", "END");
+    one_statement_parses_to("END TRANSACTION", "END");
+    // MS-SQL syntax
+    let dialects = all_dialects_where(|d| d.supports_end_transaction_modifier());
+    dialects.verified_stmt("END TRY");
+    dialects.verified_stmt("END CATCH");
 }
 
 #[test]
@@ -7854,18 +9190,28 @@ fn ensure_multiple_dialects_are_tested() {
 #[test]
 fn parse_create_index() {
     let sql = "CREATE UNIQUE INDEX IF NOT EXISTS idx_name ON test(name,age DESC)";
-    let indexed_columns = vec![
-        OrderByExpr {
-            expr: Expr::Identifier(Ident::new("name")),
-            asc: None,
-            nulls_first: None,
-            with_fill: None,
+    let indexed_columns: Vec<IndexColumn> = vec![
+        IndexColumn {
+            operator_class: None,
+            column: OrderByExpr {
+                expr: Expr::Identifier(Ident::new("name")),
+                with_fill: None,
+                options: OrderByOptions {
+                    asc: None,
+                    nulls_first: None,
+                },
+            },
         },
-        OrderByExpr {
-            expr: Expr::Identifier(Ident::new("age")),
-            asc: Some(false),
-            nulls_first: None,
-            with_fill: None,
+        IndexColumn {
+            operator_class: None,
+            column: OrderByExpr {
+                expr: Expr::Identifier(Ident::new("age")),
+                with_fill: None,
+                options: OrderByOptions {
+                    asc: Some(false),
+                    nulls_first: None,
+                },
+            },
         },
     ];
     match verified_stmt(sql) {
@@ -7889,19 +9235,29 @@ fn parse_create_index() {
 
 #[test]
 fn test_create_index_with_using_function() {
-    let sql = "CREATE UNIQUE INDEX IF NOT EXISTS idx_name ON test USING btree (name,age DESC)";
-    let indexed_columns = vec![
-        OrderByExpr {
-            expr: Expr::Identifier(Ident::new("name")),
-            asc: None,
-            nulls_first: None,
-            with_fill: None,
+    let sql = "CREATE UNIQUE INDEX IF NOT EXISTS idx_name ON test USING BTREE (name,age DESC)";
+    let indexed_columns: Vec<IndexColumn> = vec![
+        IndexColumn {
+            operator_class: None,
+            column: OrderByExpr {
+                expr: Expr::Identifier(Ident::new("name")),
+                with_fill: None,
+                options: OrderByOptions {
+                    asc: None,
+                    nulls_first: None,
+                },
+            },
         },
-        OrderByExpr {
-            expr: Expr::Identifier(Ident::new("age")),
-            asc: Some(false),
-            nulls_first: None,
-            with_fill: None,
+        IndexColumn {
+            operator_class: None,
+            column: OrderByExpr {
+                expr: Expr::Identifier(Ident::new("age")),
+                with_fill: None,
+                options: OrderByOptions {
+                    asc: Some(false),
+                    nulls_first: None,
+                },
+            },
         },
     ];
     match verified_stmt(sql) {
@@ -7920,7 +9276,7 @@ fn test_create_index_with_using_function() {
         }) => {
             assert_eq!("idx_name", name.to_string());
             assert_eq!("test", table_name.to_string());
-            assert_eq!("btree", using.unwrap().to_string());
+            assert_eq!("BTREE", using.unwrap().to_string());
             assert_eq!(indexed_columns, columns);
             assert!(unique);
             assert!(!concurrently);
@@ -7935,17 +9291,22 @@ fn test_create_index_with_using_function() {
 #[test]
 fn test_create_index_with_with_clause() {
     let sql = "CREATE UNIQUE INDEX title_idx ON films(title) WITH (fillfactor = 70, single_param)";
-    let indexed_columns = vec![OrderByExpr {
-        expr: Expr::Identifier(Ident::new("title")),
-        asc: None,
-        nulls_first: None,
-        with_fill: None,
+    let indexed_columns: Vec<IndexColumn> = vec![IndexColumn {
+        column: OrderByExpr {
+            expr: Expr::Identifier(Ident::new("title")),
+            options: OrderByOptions {
+                asc: None,
+                nulls_first: None,
+            },
+            with_fill: None,
+        },
+        operator_class: None,
     }];
     let with_parameters = vec![
         Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("fillfactor"))),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(number("70"))),
+            right: Box::new(Expr::value(number("70"))),
         },
         Expr::Identifier(Ident::new("single_param")),
     ];
@@ -8053,7 +9414,7 @@ fn parse_drop_role() {
 
 #[test]
 fn parse_grant() {
-    let sql = "GRANT SELECT, INSERT, UPDATE (shape, size), USAGE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CONNECT, CREATE, EXECUTE, TEMPORARY ON abc, def TO xyz, m WITH GRANT OPTION GRANTED BY jj";
+    let sql = "GRANT SELECT, INSERT, UPDATE (shape, size), USAGE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CONNECT, CREATE, EXECUTE, TEMPORARY, DROP ON abc, def TO xyz, m WITH GRANT OPTION GRANTED BY jj";
     match verified_stmt(sql) {
         Statement::Grant {
             privileges,
@@ -8063,7 +9424,7 @@ fn parse_grant() {
             granted_by,
             ..
         } => match (privileges, objects) {
-            (Privileges::Actions(actions), GrantObjects::Tables(objects)) => {
+            (Privileges::Actions(actions), Some(GrantObjects::Tables(objects))) => {
                 assert_eq!(
                     vec![
                         Action::Select { columns: None },
@@ -8073,10 +9434,12 @@ fn parse_grant() {
                                 Ident {
                                     value: "shape".into(),
                                     quote_style: None,
+                                    span: Span::empty(),
                                 },
                                 Ident {
                                     value: "size".into(),
                                     quote_style: None,
+                                    span: Span::empty(),
                                 },
                             ])
                         },
@@ -8086,9 +9449,10 @@ fn parse_grant() {
                         Action::References { columns: None },
                         Action::Trigger,
                         Action::Connect,
-                        Action::Create,
-                        Action::Execute,
+                        Action::Create { obj_type: None },
+                        Action::Execute { obj_type: None },
                         Action::Temporary,
+                        Action::Drop,
                     ],
                     actions
                 );
@@ -8111,7 +9475,7 @@ fn parse_grant() {
             with_grant_option,
             ..
         } => match (privileges, objects) {
-            (Privileges::Actions(actions), GrantObjects::AllTablesInSchema { schemas }) => {
+            (Privileges::Actions(actions), Some(GrantObjects::AllTablesInSchema { schemas })) => {
                 assert_eq!(vec![Action::Insert { columns: None }], actions);
                 assert_eq_vec(&["public"], &schemas);
                 assert_eq_vec(&["browser"], &grantees);
@@ -8131,7 +9495,7 @@ fn parse_grant() {
             granted_by,
             ..
         } => match (privileges, objects, granted_by) {
-            (Privileges::Actions(actions), GrantObjects::Sequences(objects), None) => {
+            (Privileges::Actions(actions), Some(GrantObjects::Sequences(objects)), None) => {
                 assert_eq!(
                     vec![Action::Usage, Action::Select { columns: None }],
                     actions
@@ -8168,7 +9532,7 @@ fn parse_grant() {
                 Privileges::All {
                     with_privileges_keyword,
                 },
-                GrantObjects::Schemas(schemas),
+                Some(GrantObjects::Schemas(schemas)),
             ) => {
                 assert!(!with_privileges_keyword);
                 assert_eq_vec(&["aa", "b"], &schemas);
@@ -8185,7 +9549,10 @@ fn parse_grant() {
             objects,
             ..
         } => match (privileges, objects) {
-            (Privileges::Actions(actions), GrantObjects::AllSequencesInSchema { schemas }) => {
+            (
+                Privileges::Actions(actions),
+                Some(GrantObjects::AllSequencesInSchema { schemas }),
+            ) => {
                 assert_eq!(vec![Action::Usage], actions);
                 assert_eq_vec(&["bus"], &schemas);
             }
@@ -8193,18 +9560,107 @@ fn parse_grant() {
         },
         _ => unreachable!(),
     }
+
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO ROLE role1 WITH GRANT OPTION");
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO DATABASE ROLE role1");
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO APPLICATION role1");
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO APPLICATION ROLE role1");
+    verified_stmt("GRANT SELECT ON ALL TABLES IN SCHEMA db1.sc1 TO SHARE share1");
+    verified_stmt("GRANT SELECT ON ALL VIEWS IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON ALL MATERIALIZED VIEWS IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON ALL EXTERNAL TABLES IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT USAGE ON ALL FUNCTIONS IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT USAGE ON SCHEMA sc1 TO a:b");
+    verified_stmt("GRANT USAGE ON SCHEMA sc1 TO GROUP group1");
+    verified_stmt("GRANT OWNERSHIP ON ALL TABLES IN SCHEMA DEV_STAS_ROGOZHIN TO ROLE ANALYST");
+    verified_stmt("GRANT OWNERSHIP ON ALL TABLES IN SCHEMA DEV_STAS_ROGOZHIN TO ROLE ANALYST COPY CURRENT GRANTS");
+    verified_stmt("GRANT OWNERSHIP ON ALL TABLES IN SCHEMA DEV_STAS_ROGOZHIN TO ROLE ANALYST REVOKE CURRENT GRANTS");
+    verified_stmt("GRANT USAGE ON DATABASE db1 TO ROLE role1");
+    verified_stmt("GRANT USAGE ON WAREHOUSE wh1 TO ROLE role1");
+    verified_stmt("GRANT OWNERSHIP ON INTEGRATION int1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON VIEW view1 TO ROLE role1");
+    verified_stmt("GRANT EXEC ON my_sp TO runner");
+    verified_stmt("GRANT UPDATE ON my_table TO updater_role AS dbo");
+    all_dialects_where(|d| d.identifier_quote_style("none") == Some('['))
+        .verified_stmt("GRANT SELECT ON [my_table] TO [public]");
+    verified_stmt("GRANT SELECT ON FUTURE SCHEMAS IN DATABASE db1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON FUTURE TABLES IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON FUTURE EXTERNAL TABLES IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON FUTURE VIEWS IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON FUTURE MATERIALIZED VIEWS IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT SELECT ON FUTURE SEQUENCES IN SCHEMA db1.sc1 TO ROLE role1");
+    verified_stmt("GRANT USAGE ON PROCEDURE db1.sc1.foo(INT) TO ROLE role1");
+    verified_stmt("GRANT USAGE ON FUNCTION db1.sc1.foo(INT) TO ROLE role1");
+    verified_stmt("GRANT ROLE role1 TO ROLE role2");
+    verified_stmt("GRANT ROLE role1 TO USER user");
+    verified_stmt("GRANT CREATE SCHEMA ON DATABASE db1 TO ROLE role1");
+}
+
+#[test]
+fn parse_deny() {
+    let sql = "DENY INSERT, DELETE ON users TO analyst CASCADE AS admin";
+    match verified_stmt(sql) {
+        Statement::Deny(deny) => {
+            assert_eq!(
+                Privileges::Actions(vec![Action::Insert { columns: None }, Action::Delete]),
+                deny.privileges
+            );
+            assert_eq!(
+                &GrantObjects::Tables(vec![ObjectName::from(vec![Ident::new("users")])]),
+                &deny.objects
+            );
+            assert_eq_vec(&["analyst"], &deny.grantees);
+            assert_eq!(Some(CascadeOption::Cascade), deny.cascade);
+            assert_eq!(Some(Ident::from("admin")), deny.granted_by);
+        }
+        _ => unreachable!(),
+    }
+
+    verified_stmt("DENY SELECT, INSERT, UPDATE, DELETE ON db1.sc1 TO role1, role2");
+    verified_stmt("DENY ALL ON db1.sc1 TO role1");
+    verified_stmt("DENY EXEC ON my_sp TO runner");
+
+    all_dialects_where(|d| d.identifier_quote_style("none") == Some('['))
+        .verified_stmt("DENY SELECT ON [my_table] TO [public]");
 }
 
 #[test]
 fn test_revoke() {
-    let sql = "REVOKE ALL PRIVILEGES ON users, auth FROM analyst CASCADE";
+    let sql = "REVOKE ALL PRIVILEGES ON users, auth FROM analyst";
     match verified_stmt(sql) {
         Statement::Revoke {
             privileges,
-            objects: GrantObjects::Tables(tables),
+            objects: Some(GrantObjects::Tables(tables)),
             grantees,
+            granted_by,
             cascade,
+        } => {
+            assert_eq!(
+                Privileges::All {
+                    with_privileges_keyword: true
+                },
+                privileges
+            );
+            assert_eq_vec(&["users", "auth"], &tables);
+            assert_eq_vec(&["analyst"], &grantees);
+            assert_eq!(cascade, None);
+            assert_eq!(None, granted_by);
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn test_revoke_with_cascade() {
+    let sql = "REVOKE ALL PRIVILEGES ON users, auth FROM analyst CASCADE";
+    match all_dialects_except(|d| d.is::<MySqlDialect>()).verified_stmt(sql) {
+        Statement::Revoke {
+            privileges,
+            objects: Some(GrantObjects::Tables(tables)),
+            grantees,
             granted_by,
+            cascade,
         } => {
             assert_eq!(
                 Privileges::All {
@@ -8214,7 +9670,7 @@ fn test_revoke() {
             );
             assert_eq_vec(&["users", "auth"], &tables);
             assert_eq_vec(&["analyst"], &grantees);
-            assert!(cascade);
+            assert_eq!(cascade, Some(CascadeOption::Cascade));
             assert_eq!(None, granted_by);
         }
         _ => unreachable!(),
@@ -8233,6 +9689,7 @@ fn parse_merge() {
                 source,
                 on,
                 clauses,
+                ..
             },
             Statement::Merge {
                 into: no_into,
@@ -8240,6 +9697,7 @@ fn parse_merge() {
                 source: source_no_into,
                 on: on_no_into,
                 clauses: clauses_no_into,
+                ..
             },
         ) => {
             assert!(into);
@@ -8248,7 +9706,7 @@ fn parse_merge() {
             assert_eq!(
                 table,
                 TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("s"), Ident::new("bar")]),
+                    name: ObjectName::from(vec![Ident::new("s"), Ident::new("bar")]),
                     alias: Some(TableAlias {
                         name: Ident::new("dest"),
                         columns: vec![],
@@ -8258,6 +9716,9 @@ fn parse_merge() {
                     version: None,
                     partitions: vec![],
                     with_ordinality: false,
+                    json_path: None,
+                    sample: None,
+                    index_hints: vec![],
                 }
             );
             assert_eq!(table, table_no_into);
@@ -8269,23 +9730,20 @@ fn parse_merge() {
                     subquery: Box::new(Query {
                         with: None,
                         body: Box::new(SetExpr::Select(Box::new(Select {
+                            select_token: AttachedToken::empty(),
                             distinct: None,
                             top: None,
                             top_before_distinct: false,
                             projection: vec![SelectItem::Wildcard(
                                 WildcardAdditionalOptions::default()
                             )],
+                            exclude: None,
                             into: None,
                             from: vec![TableWithJoins {
-                                relation: TableFactor::Table {
-                                    name: ObjectName(vec![Ident::new("s"), Ident::new("foo")]),
-                                    alias: None,
-                                    args: None,
-                                    with_hints: vec![],
-                                    version: None,
-                                    partitions: vec![],
-                                    with_ordinality: false,
-                                },
+                                relation: table_from_name(ObjectName::from(vec![
+                                    Ident::new("s"),
+                                    Ident::new("foo")
+                                ])),
                                 joins: vec![],
                             }],
                             lateral_views: vec![],
@@ -8301,21 +9759,22 @@ fn parse_merge() {
                             qualify: None,
                             value_table_mode: None,
                             connect_by: None,
+                            flavor: SelectFlavor::Standard,
                         }))),
                         order_by: None,
-                        limit: None,
-                        limit_by: vec![],
-                        offset: None,
+                        limit_clause: None,
                         fetch: None,
                         locks: vec![],
                         for_clause: None,
                         settings: None,
                         format_clause: None,
+                        pipe_operators: vec![],
                     }),
                     alias: Some(TableAlias {
                         name: Ident {
                             value: "stg".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         },
                         columns: vec![],
                     }),
@@ -8388,14 +9847,14 @@ fn parse_merge() {
                                 Ident::new("A"),
                             ])),
                             op: BinaryOperator::Eq,
-                            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                                "a".to_string()
-                            ))),
+                            right: Box::new(Expr::Value(
+                                (Value::SingleQuotedString("a".to_string())).with_empty_span()
+                            )),
                         }),
                         action: MergeAction::Update {
                             assignments: vec![
                                 Assignment {
-                                    target: AssignmentTarget::ColumnName(ObjectName(vec![
+                                    target: AssignmentTarget::ColumnName(ObjectName::from(vec![
                                         Ident::new("dest"),
                                         Ident::new("F")
                                     ])),
@@ -8405,7 +9864,7 @@ fn parse_merge() {
                                     ]),
                                 },
                                 Assignment {
-                                    target: AssignmentTarget::ColumnName(ObjectName(vec![
+                                    target: AssignmentTarget::ColumnName(ObjectName::from(vec![
                                         Ident::new("dest"),
                                         Ident::new("G")
                                     ])),
@@ -8433,6 +9892,19 @@ fn parse_merge() {
     verified_stmt(sql);
 }
 
+#[test]
+fn test_merge_with_output() {
+    let sql = "MERGE INTO target_table USING source_table \
+        ON target_table.id = source_table.oooid \
+        WHEN MATCHED THEN \
+            UPDATE SET target_table.description = source_table.description \
+        WHEN NOT MATCHED THEN \
+            INSERT (ID, description) VALUES (source_table.id, source_table.description) \
+        OUTPUT inserted.* INTO log_target";
+
+    verified_stmt(sql);
+}
+
 #[test]
 fn test_merge_into_using_table() {
     let sql = "MERGE INTO target_table USING source_table \
@@ -8512,11 +9984,12 @@ fn test_lock_table() {
     let lock = ast.locks.pop().unwrap();
     assert_eq!(lock.lock_type, LockType::Update);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "school".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert!(lock.nonblock.is_none());
 
@@ -8526,11 +9999,12 @@ fn test_lock_table() {
     let lock = ast.locks.pop().unwrap();
     assert_eq!(lock.lock_type, LockType::Share);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "school".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert!(lock.nonblock.is_none());
 
@@ -8540,21 +10014,23 @@ fn test_lock_table() {
     let lock = ast.locks.remove(0);
     assert_eq!(lock.lock_type, LockType::Share);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "school".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert!(lock.nonblock.is_none());
     let lock = ast.locks.remove(0);
     assert_eq!(lock.lock_type, LockType::Update);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "student".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert!(lock.nonblock.is_none());
 }
@@ -8567,11 +10043,12 @@ fn test_lock_nonblock() {
     let lock = ast.locks.pop().unwrap();
     assert_eq!(lock.lock_type, LockType::Update);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "school".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert_eq!(lock.nonblock.unwrap(), NonBlock::SkipLocked);
 
@@ -8581,11 +10058,12 @@ fn test_lock_nonblock() {
     let lock = ast.locks.pop().unwrap();
     assert_eq!(lock.lock_type, LockType::Share);
     assert_eq!(
-        lock.of.unwrap().0,
-        vec![Ident {
+        lock.of.unwrap(),
+        ObjectName::from(vec![Ident {
             value: "school".to_string(),
-            quote_style: None
-        }]
+            quote_style: None,
+            span: Span::empty(),
+        }])
     );
     assert_eq!(lock.nonblock.unwrap(), NonBlock::Nowait);
 }
@@ -8610,23 +10088,24 @@ fn test_placeholder() {
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("id"))),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(Value::Placeholder("$Id1".into()))),
+            right: Box::new(Expr::Value(
+                (Value::Placeholder("$Id1".into())).with_empty_span()
+            )),
         })
     );
 
-    let sql = "SELECT * FROM student LIMIT $1 OFFSET $2";
-    let ast = dialects.verified_query(sql);
-    assert_eq!(
-        ast.limit,
-        Some(Expr::Value(Value::Placeholder("$1".into())))
-    );
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
-            value: Expr::Value(Value::Placeholder("$2".into())),
+    let ast = dialects.verified_query("SELECT * FROM student LIMIT $1 OFFSET $2");
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::Value(
+            (Value::Placeholder("$1".into())).with_empty_span(),
+        )),
+        offset: Some(Offset {
+            value: Expr::Value((Value::Placeholder("$2".into())).with_empty_span()),
             rows: OffsetRows::None,
         }),
-    );
+        limit_by: vec![],
+    };
+    assert_eq!(ast.limit_clause, Some(expected_limit_clause));
 
     let dialects = TestedDialects::new(vec![
         Box::new(GenericDialect {}),
@@ -8647,7 +10126,9 @@ fn test_placeholder() {
         Some(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("id"))),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(Value::Placeholder("?".into()))),
+            right: Box::new(Expr::Value(
+                (Value::Placeholder("?".into())).with_empty_span()
+            )),
         })
     );
 
@@ -8656,9 +10137,15 @@ fn test_placeholder() {
     assert_eq!(
         ast.projection,
         vec![
-            UnnamedExpr(Expr::Value(Value::Placeholder("$fromage_français".into()))),
-            UnnamedExpr(Expr::Value(Value::Placeholder(":x".into()))),
-            UnnamedExpr(Expr::Value(Value::Placeholder("?123".into()))),
+            UnnamedExpr(Expr::Value(
+                (Value::Placeholder("$fromage_français".into())).with_empty_span()
+            )),
+            UnnamedExpr(Expr::Value(
+                (Value::Placeholder(":x".into())).with_empty_span()
+            )),
+            UnnamedExpr(Expr::Value(
+                (Value::Placeholder("?123".into())).with_empty_span()
+            )),
         ]
     );
 }
@@ -8698,48 +10185,47 @@ fn verified_expr(query: &str) -> Expr {
 #[test]
 fn parse_offset_and_limit() {
     let sql = "SELECT foo FROM bar LIMIT 1 OFFSET 2";
-    let expect = Some(Offset {
-        value: Expr::Value(number("2")),
-        rows: OffsetRows::None,
-    });
-    let ast = verified_query(sql);
-    assert_eq!(ast.offset, expect);
-    assert_eq!(ast.limit, Some(Expr::Value(number("1"))));
+    let expected_limit_clause = Some(LimitClause::LimitOffset {
+        limit: Some(Expr::value(number("1"))),
+        offset: Some(Offset {
+            value: Expr::value(number("2")),
+            rows: OffsetRows::None,
+        }),
+        limit_by: vec![],
+    });
+    let ast = verified_query(sql);
+    assert_eq!(ast.limit_clause, expected_limit_clause);
 
     // different order is OK
     one_statement_parses_to("SELECT foo FROM bar OFFSET 2 LIMIT 1", sql);
 
     // mysql syntax is ok for some dialects
-    TestedDialects::new(vec![
-        Box::new(GenericDialect {}),
-        Box::new(MySqlDialect {}),
-        Box::new(SQLiteDialect {}),
-        Box::new(ClickHouseDialect {}),
-    ])
-    .one_statement_parses_to("SELECT foo FROM bar LIMIT 2, 1", sql);
+    all_dialects_where(|d| d.supports_limit_comma())
+        .verified_query("SELECT foo FROM bar LIMIT 2, 1");
 
     // expressions are allowed
     let sql = "SELECT foo FROM bar LIMIT 1 + 2 OFFSET 3 * 4";
     let ast = verified_query(sql);
-    assert_eq!(
-        ast.limit,
-        Some(Expr::BinaryOp {
-            left: Box::new(Expr::Value(number("1"))),
+    let expected_limit_clause = LimitClause::LimitOffset {
+        limit: Some(Expr::BinaryOp {
+            left: Box::new(Expr::value(number("1"))),
             op: BinaryOperator::Plus,
-            right: Box::new(Expr::Value(number("2"))),
+            right: Box::new(Expr::value(number("2"))),
         }),
-    );
-    assert_eq!(
-        ast.offset,
-        Some(Offset {
+        offset: Some(Offset {
             value: Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("3"))),
+                left: Box::new(Expr::value(number("3"))),
                 op: BinaryOperator::Multiply,
-                right: Box::new(Expr::Value(number("4"))),
+                right: Box::new(Expr::value(number("4"))),
             },
             rows: OffsetRows::None,
         }),
-    );
+        limit_by: vec![],
+    };
+    assert_eq!(ast.limit_clause, Some(expected_limit_clause),);
+
+    // OFFSET without LIMIT
+    verified_stmt("SELECT foo FROM bar OFFSET 2");
 
     // Can't repeat OFFSET / LIMIT
     let res = parse_sql_statements("SELECT foo FROM bar OFFSET 2 OFFSET 2");
@@ -8764,10 +10250,11 @@ fn parse_offset_and_limit() {
 #[test]
 fn parse_time_functions() {
     fn test_time_function(func_name: &'static str) {
-        let sql = format!("SELECT {}()", func_name);
+        let sql = format!("SELECT {func_name}()");
         let select = verified_only_select(&sql);
         let select_localtime_func_call_ast = Function {
-            name: ObjectName(vec![Ident::new(func_name)]),
+            name: ObjectName::from(vec![Ident::new(func_name)]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -8785,7 +10272,7 @@ fn parse_time_functions() {
         );
 
         // Validating Parenthesis
-        let sql_without_parens = format!("SELECT {}", func_name);
+        let sql_without_parens = format!("SELECT {func_name}");
         let mut ast_without_parens = select_localtime_func_call_ast;
         ast_without_parens.args = FunctionArguments::None;
         assert_eq!(
@@ -8805,7 +10292,9 @@ fn parse_time_functions() {
 fn parse_position() {
     assert_eq!(
         Expr::Position {
-            expr: Box::new(Expr::Value(Value::SingleQuotedString("@".to_string()))),
+            expr: Box::new(Expr::Value(
+                (Value::SingleQuotedString("@".to_string())).with_empty_span()
+            )),
             r#in: Box::new(Expr::Identifier(Ident::new("field"))),
         },
         verified_expr("POSITION('@' IN field)"),
@@ -8816,9 +10305,9 @@ fn parse_position() {
         call(
             "position",
             [
-                Expr::Value(Value::SingleQuotedString("an".to_owned())),
-                Expr::Value(Value::SingleQuotedString("banana".to_owned())),
-                Expr::Value(number("1")),
+                Expr::Value((Value::SingleQuotedString("an".to_owned())).with_empty_span()),
+                Expr::Value((Value::SingleQuotedString("banana".to_owned())).with_empty_span()),
+                Expr::value(number("1")),
             ]
         ),
         verified_expr("position('an', 'banana', 1)")
@@ -8863,6 +10352,46 @@ fn parse_is_boolean() {
         verified_expr(sql)
     );
 
+    let sql = "a IS NORMALIZED";
+    assert_eq!(
+        IsNormalized {
+            expr: Box::new(Identifier(Ident::new("a"))),
+            form: None,
+            negated: false,
+        },
+        verified_expr(sql)
+    );
+
+    let sql = "a IS NOT NORMALIZED";
+    assert_eq!(
+        IsNormalized {
+            expr: Box::new(Identifier(Ident::new("a"))),
+            form: None,
+            negated: true,
+        },
+        verified_expr(sql)
+    );
+
+    let sql = "a IS NFKC NORMALIZED";
+    assert_eq!(
+        IsNormalized {
+            expr: Box::new(Identifier(Ident::new("a"))),
+            form: Some(NormalizationForm::NFKC),
+            negated: false,
+        },
+        verified_expr(sql)
+    );
+
+    let sql = "a IS NOT NFKD NORMALIZED";
+    assert_eq!(
+        IsNormalized {
+            expr: Box::new(Identifier(Ident::new("a"))),
+            form: Some(NormalizationForm::NFKD),
+            negated: true,
+        },
+        verified_expr(sql)
+    );
+
     let sql = "a IS UNKNOWN";
     assert_eq!(
         IsUnknown(Box::new(Identifier(Ident::new("a")))),
@@ -8881,6 +10410,12 @@ fn parse_is_boolean() {
     verified_stmt("SELECT f FROM foo WHERE field IS FALSE");
     verified_stmt("SELECT f FROM foo WHERE field IS NOT FALSE");
 
+    verified_stmt("SELECT f FROM foo WHERE field IS NORMALIZED");
+    verified_stmt("SELECT f FROM foo WHERE field IS NFC NORMALIZED");
+    verified_stmt("SELECT f FROM foo WHERE field IS NFD NORMALIZED");
+    verified_stmt("SELECT f FROM foo WHERE field IS NOT NORMALIZED");
+    verified_stmt("SELECT f FROM foo WHERE field IS NOT NFKC NORMALIZED");
+
     verified_stmt("SELECT f FROM foo WHERE field IS UNKNOWN");
     verified_stmt("SELECT f FROM foo WHERE field IS NOT UNKNOWN");
 
@@ -8888,7 +10423,37 @@ fn parse_is_boolean() {
     let res = parse_sql_statements(sql);
     assert_eq!(
         ParserError::ParserError(
-            "Expected: [NOT] NULL or TRUE|FALSE or [NOT] DISTINCT FROM after IS, found: 0"
+            "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: 0"
+                .to_string()
+        ),
+        res.unwrap_err()
+    );
+
+    let sql = "SELECT s, s IS XYZ NORMALIZED FROM foo";
+    let res = parse_sql_statements(sql);
+    assert_eq!(
+        ParserError::ParserError(
+            "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: XYZ"
+                .to_string()
+        ),
+        res.unwrap_err()
+    );
+
+    let sql = "SELECT s, s IS NFKC FROM foo";
+    let res = parse_sql_statements(sql);
+    assert_eq!(
+        ParserError::ParserError(
+            "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: FROM"
+                .to_string()
+        ),
+        res.unwrap_err()
+    );
+
+    let sql = "SELECT s, s IS TRIM(' NFKC ') FROM foo";
+    let res = parse_sql_statements(sql);
+    assert_eq!(
+        ParserError::ParserError(
+            "Expected: [NOT] NULL | TRUE | FALSE | DISTINCT | [form] NORMALIZED FROM after IS, found: TRIM"
                 .to_string()
         ),
         res.unwrap_err()
@@ -8963,7 +10528,7 @@ fn parse_cache_table() {
         verified_stmt(format!("CACHE TABLE '{cache_table_name}'").as_str()),
         Statement::Cache {
             table_flag: None,
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: false,
             options: vec![],
             query: None,
@@ -8973,8 +10538,8 @@ fn parse_cache_table() {
     assert_eq!(
         verified_stmt(format!("CACHE {table_flag} TABLE '{cache_table_name}'").as_str()),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: false,
             options: vec![],
             query: None,
@@ -8989,17 +10554,17 @@ fn parse_cache_table() {
             .as_str()
         ),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: false,
             options: vec![
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K1"),
-                    value: Expr::Value(Value::SingleQuotedString("V1".into())),
+                    value: Expr::Value((Value::SingleQuotedString("V1".into())).with_empty_span()),
                 },
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K2"),
-                    value: Expr::Value(number("0.88")),
+                    value: Expr::value(number("0.88")),
                 },
             ],
             query: None,
@@ -9011,20 +10576,20 @@ fn parse_cache_table() {
             format!(
                 "CACHE {table_flag} TABLE '{cache_table_name}' OPTIONS('K1' = 'V1', 'K2' = 0.88) {sql}",
             )
-            .as_str()
+                .as_str()
         ),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: false,
             options: vec![
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K1"),
-                    value: Expr::Value(Value::SingleQuotedString("V1".into())),
+                    value: Expr::Value((Value::SingleQuotedString("V1".into())).with_empty_span()),
                 },
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K2"),
-                    value: Expr::Value(number("0.88")),
+                    value: Expr::value(number("0.88")),
                 },
             ],
             query: Some(query.clone().into()),
@@ -9036,20 +10601,20 @@ fn parse_cache_table() {
             format!(
                 "CACHE {table_flag} TABLE '{cache_table_name}' OPTIONS('K1' = 'V1', 'K2' = 0.88) AS {sql}",
             )
-            .as_str()
+                .as_str()
         ),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: true,
             options: vec![
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K1"),
-                    value: Expr::Value(Value::SingleQuotedString("V1".into())),
+                    value: Expr::Value((Value::SingleQuotedString("V1".into())).with_empty_span()),
                 },
                 SqlOption::KeyValue {
                     key: Ident::with_quote('\'', "K2"),
-                    value: Expr::Value(number("0.88")),
+                    value: Expr::value(number("0.88")),
                 },
             ],
             query: Some(query.clone().into()),
@@ -9059,8 +10624,8 @@ fn parse_cache_table() {
     assert_eq!(
         verified_stmt(format!("CACHE {table_flag} TABLE '{cache_table_name}' {sql}").as_str()),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: false,
             options: vec![],
             query: Some(query.clone().into()),
@@ -9070,8 +10635,8 @@ fn parse_cache_table() {
     assert_eq!(
         verified_stmt(format!("CACHE {table_flag} TABLE '{cache_table_name}' AS {sql}").as_str()),
         Statement::Cache {
-            table_flag: Some(ObjectName(vec![Ident::new(table_flag)])),
-            table_name: ObjectName(vec![Ident::with_quote('\'', cache_table_name)]),
+            table_flag: Some(ObjectName::from(vec![Ident::new(table_flag)])),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', cache_table_name)]),
             has_as: true,
             options: vec![],
             query: Some(query.into()),
@@ -9134,7 +10699,7 @@ fn parse_uncache_table() {
     assert_eq!(
         verified_stmt("UNCACHE TABLE 'table_name'"),
         Statement::UNCache {
-            table_name: ObjectName(vec![Ident::with_quote('\'', "table_name")]),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', "table_name")]),
             if_exists: false,
         }
     );
@@ -9142,7 +10707,7 @@ fn parse_uncache_table() {
     assert_eq!(
         verified_stmt("UNCACHE TABLE IF EXISTS 'table_name'"),
         Statement::UNCache {
-            table_name: ObjectName(vec![Ident::with_quote('\'', "table_name")]),
+            table_name: ObjectName::from(vec![Ident::with_quote('\'', "table_name")]),
             if_exists: true,
         }
     );
@@ -9246,21 +10811,16 @@ fn parse_with_recursion_limit() {
 
 #[test]
 fn parse_escaped_string_with_unescape() {
-    fn assert_mysql_query_value(sql: &str, quoted: &str) {
-        let stmt = TestedDialects::new(vec![
-            Box::new(MySqlDialect {}),
-            Box::new(BigQueryDialect {}),
-            Box::new(SnowflakeDialect {}),
-        ])
-        .one_statement_parses_to(sql, "");
-
-        match stmt {
+    fn assert_mysql_query_value(dialects: &TestedDialects, sql: &str, quoted: &str) {
+        match dialects.one_statement_parses_to(sql, "") {
             Statement::Query(query) => match *query.body {
                 SetExpr::Select(value) => {
                     let expr = expr_from_projection(only(&value.projection));
                     assert_eq!(
                         *expr,
-                        Expr::Value(Value::SingleQuotedString(quoted.to_string()))
+                        Expr::Value(
+                            (Value::SingleQuotedString(quoted.to_string())).with_empty_span()
+                        )
                     );
                 }
                 _ => unreachable!(),
@@ -9268,17 +10828,38 @@ fn parse_escaped_string_with_unescape() {
             _ => unreachable!(),
         };
     }
+
+    let escaping_dialects =
+        &all_dialects_where(|dialect| dialect.supports_string_literal_backslash_escape());
+    let no_wildcard_exception = &all_dialects_where(|dialect| {
+        dialect.supports_string_literal_backslash_escape() && !dialect.ignores_wildcard_escapes()
+    });
+    let with_wildcard_exception = &all_dialects_where(|dialect| {
+        dialect.supports_string_literal_backslash_escape() && dialect.ignores_wildcard_escapes()
+    });
+
     let sql = r"SELECT 'I\'m fine'";
-    assert_mysql_query_value(sql, "I'm fine");
+    assert_mysql_query_value(escaping_dialects, sql, "I'm fine");
 
     let sql = r#"SELECT 'I''m fine'"#;
-    assert_mysql_query_value(sql, "I'm fine");
+    assert_mysql_query_value(escaping_dialects, sql, "I'm fine");
 
     let sql = r#"SELECT 'I\"m fine'"#;
-    assert_mysql_query_value(sql, "I\"m fine");
+    assert_mysql_query_value(escaping_dialects, sql, "I\"m fine");
 
     let sql = r"SELECT 'Testing: \0 \\ \% \_ \b \n \r \t \Z \a \h \ '";
-    assert_mysql_query_value(sql, "Testing: \0 \\ % _ \u{8} \n \r \t \u{1a} \u{7} h  ");
+    assert_mysql_query_value(
+        no_wildcard_exception,
+        sql,
+        "Testing: \0 \\ % _ \u{8} \n \r \t \u{1a} \u{7} h  ",
+    );
+
+    // check MySQL doesn't remove backslash from escaped LIKE wildcards
+    assert_mysql_query_value(
+        with_wildcard_exception,
+        sql,
+        "Testing: \0 \\ \\% \\_ \u{8} \n \r \t \u{1a} \u{7} h  ",
+    );
 }
 
 #[test]
@@ -9300,7 +10881,9 @@ fn parse_escaped_string_without_unescape() {
                     let expr = expr_from_projection(only(&value.projection));
                     assert_eq!(
                         *expr,
-                        Expr::Value(Value::SingleQuotedString(quoted.to_string()))
+                        Expr::Value(
+                            (Value::SingleQuotedString(quoted.to_string())).with_empty_span()
+                        )
                     );
                 }
                 _ => unreachable!(),
@@ -9349,7 +10932,7 @@ fn parse_pivot_table() {
         verified_only_select(sql).from[0].relation,
         Pivot {
             table: Box::new(TableFactor::Table {
-                name: ObjectName(vec![Ident::new("monthly_sales")]),
+                name: ObjectName::from(vec![Ident::new("monthly_sales")]),
                 alias: Some(TableAlias {
                     name: Ident::new("a"),
                     columns: vec![]
@@ -9359,6 +10942,9 @@ fn parse_pivot_table() {
                 version: None,
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             }),
             aggregate_functions: vec![
                 expected_function("a", None),
@@ -9368,11 +10954,13 @@ fn parse_pivot_table() {
             value_column: vec![Ident::new("a"), Ident::new("MONTH")],
             value_source: PivotValueSource::List(vec![
                 ExprWithAlias {
-                    expr: Expr::Value(number("1")),
+                    expr: Expr::value(number("1")),
                     alias: Some(Ident::new("x"))
                 },
                 ExprWithAlias {
-                    expr: Expr::Value(Value::SingleQuotedString("two".to_string())),
+                    expr: Expr::Value(
+                        (Value::SingleQuotedString("two".to_string())).with_empty_span()
+                    ),
                     alias: None
                 },
                 ExprWithAlias {
@@ -9384,7 +10972,8 @@ fn parse_pivot_table() {
             alias: Some(TableAlias {
                 name: Ident {
                     value: "p".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 },
                 columns: vec![
                     TableAliasColumnDef::from_name("c"),
@@ -9417,44 +11006,41 @@ fn parse_unpivot_table() {
         "SELECT * FROM sales AS s ",
         "UNPIVOT(quantity FOR quarter IN (Q1, Q2, Q3, Q4)) AS u (product, quarter, quantity)"
     );
-
-    pretty_assertions::assert_eq!(
-        verified_only_select(sql).from[0].relation,
-        Unpivot {
-            table: Box::new(TableFactor::Table {
-                name: ObjectName(vec![Ident::new("sales")]),
-                alias: Some(TableAlias {
-                    name: Ident::new("s"),
-                    columns: vec![]
-                }),
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
+    let base_unpivot = Unpivot {
+        table: Box::new(TableFactor::Table {
+            name: ObjectName::from(vec![Ident::new("sales")]),
+            alias: Some(TableAlias {
+                name: Ident::new("s"),
+                columns: vec![],
             }),
-            value: Ident {
-                value: "quantity".to_string(),
-                quote_style: None
-            },
-
-            name: Ident {
-                value: "quarter".to_string(),
-                quote_style: None
-            },
-            columns: ["Q1", "Q2", "Q3", "Q4"]
+            args: None,
+            with_hints: vec![],
+            version: None,
+            partitions: vec![],
+            with_ordinality: false,
+            json_path: None,
+            sample: None,
+            index_hints: vec![],
+        }),
+        null_inclusion: None,
+        value: Expr::Identifier(Ident::new("quantity")),
+        name: Ident::new("quarter"),
+        columns: ["Q1", "Q2", "Q3", "Q4"]
+            .into_iter()
+            .map(|col| ExprWithAlias {
+                expr: Expr::Identifier(Ident::new(col)),
+                alias: None,
+            })
+            .collect(),
+        alias: Some(TableAlias {
+            name: Ident::new("u"),
+            columns: ["product", "quarter", "quantity"]
                 .into_iter()
-                .map(Ident::new)
+                .map(TableAliasColumnDef::from_name)
                 .collect(),
-            alias: Some(TableAlias {
-                name: Ident::new("u"),
-                columns: ["product", "quarter", "quantity"]
-                    .into_iter()
-                    .map(TableAliasColumnDef::from_name)
-                    .collect(),
-            }),
-        }
-    );
+        }),
+    };
+    pretty_assertions::assert_eq!(verified_only_select(sql).from[0].relation, base_unpivot);
     assert_eq!(verified_stmt(sql).to_string(), sql);
 
     let sql_without_aliases = concat!(
@@ -9474,6 +11060,228 @@ fn parse_unpivot_table() {
         verified_stmt(sql_without_aliases).to_string(),
         sql_without_aliases
     );
+
+    let sql_unpivot_exclude_nulls = concat!(
+    "SELECT * FROM sales AS s ",
+    "UNPIVOT EXCLUDE NULLS (quantity FOR quarter IN (Q1, Q2, Q3, Q4)) AS u (product, quarter, quantity)"
+    );
+
+    if let Unpivot { null_inclusion, .. } =
+        &verified_only_select(sql_unpivot_exclude_nulls).from[0].relation
+    {
+        assert_eq!(*null_inclusion, Some(NullInclusion::ExcludeNulls));
+    }
+
+    assert_eq!(
+        verified_stmt(sql_unpivot_exclude_nulls).to_string(),
+        sql_unpivot_exclude_nulls
+    );
+
+    let sql_unpivot_include_nulls = concat!(
+        "SELECT * FROM sales AS s ",
+        "UNPIVOT INCLUDE NULLS (quantity FOR quarter IN (Q1, Q2, Q3, Q4)) AS u (product, quarter, quantity)"
+    );
+
+    if let Unpivot { null_inclusion, .. } =
+        &verified_only_select(sql_unpivot_include_nulls).from[0].relation
+    {
+        assert_eq!(*null_inclusion, Some(NullInclusion::IncludeNulls));
+    }
+
+    assert_eq!(
+        verified_stmt(sql_unpivot_include_nulls).to_string(),
+        sql_unpivot_include_nulls
+    );
+
+    let sql_unpivot_with_alias = concat!(
+        "SELECT * FROM sales AS s ",
+        "UNPIVOT INCLUDE NULLS ",
+        "(quantity FOR quarter IN ",
+        "(Q1 AS Quater1, Q2 AS Quater2, Q3 AS Quater3, Q4 AS Quater4)) ",
+        "AS u (product, quarter, quantity)"
+    );
+
+    if let Unpivot { value, columns, .. } =
+        &verified_only_select(sql_unpivot_with_alias).from[0].relation
+    {
+        assert_eq!(
+            *columns,
+            vec![
+                ExprWithAlias {
+                    expr: Expr::Identifier(Ident::new("Q1")),
+                    alias: Some(Ident::new("Quater1")),
+                },
+                ExprWithAlias {
+                    expr: Expr::Identifier(Ident::new("Q2")),
+                    alias: Some(Ident::new("Quater2")),
+                },
+                ExprWithAlias {
+                    expr: Expr::Identifier(Ident::new("Q3")),
+                    alias: Some(Ident::new("Quater3")),
+                },
+                ExprWithAlias {
+                    expr: Expr::Identifier(Ident::new("Q4")),
+                    alias: Some(Ident::new("Quater4")),
+                },
+            ]
+        );
+        assert_eq!(*value, Expr::Identifier(Ident::new("quantity")));
+    }
+
+    assert_eq!(
+        verified_stmt(sql_unpivot_with_alias).to_string(),
+        sql_unpivot_with_alias
+    );
+
+    let sql_unpivot_with_alias_and_multi_value = concat!(
+        "SELECT * FROM sales AS s ",
+        "UNPIVOT INCLUDE NULLS ((first_quarter, second_quarter) ",
+        "FOR half_of_the_year IN (",
+        "(Q1, Q2) AS H1, ",
+        "(Q3, Q4) AS H2",
+        "))"
+    );
+
+    if let Unpivot { value, columns, .. } =
+        &verified_only_select(sql_unpivot_with_alias_and_multi_value).from[0].relation
+    {
+        assert_eq!(
+            *columns,
+            vec![
+                ExprWithAlias {
+                    expr: Expr::Tuple(vec![
+                        Expr::Identifier(Ident::new("Q1")),
+                        Expr::Identifier(Ident::new("Q2")),
+                    ]),
+                    alias: Some(Ident::new("H1")),
+                },
+                ExprWithAlias {
+                    expr: Expr::Tuple(vec![
+                        Expr::Identifier(Ident::new("Q3")),
+                        Expr::Identifier(Ident::new("Q4")),
+                    ]),
+                    alias: Some(Ident::new("H2")),
+                },
+            ]
+        );
+        assert_eq!(
+            *value,
+            Expr::Tuple(vec![
+                Expr::Identifier(Ident::new("first_quarter")),
+                Expr::Identifier(Ident::new("second_quarter")),
+            ])
+        );
+    }
+
+    assert_eq!(
+        verified_stmt(sql_unpivot_with_alias_and_multi_value).to_string(),
+        sql_unpivot_with_alias_and_multi_value
+    );
+
+    let sql_unpivot_with_alias_and_multi_value_and_qualifier = concat!(
+        "SELECT * FROM sales AS s ",
+        "UNPIVOT INCLUDE NULLS ((first_quarter, second_quarter) ",
+        "FOR half_of_the_year IN (",
+        "(sales.Q1, sales.Q2) AS H1, ",
+        "(sales.Q3, sales.Q4) AS H2",
+        "))"
+    );
+
+    if let Unpivot { columns, .. } =
+        &verified_only_select(sql_unpivot_with_alias_and_multi_value_and_qualifier).from[0].relation
+    {
+        assert_eq!(
+            *columns,
+            vec![
+                ExprWithAlias {
+                    expr: Expr::Tuple(vec![
+                        Expr::CompoundIdentifier(vec![Ident::new("sales"), Ident::new("Q1"),]),
+                        Expr::CompoundIdentifier(vec![Ident::new("sales"), Ident::new("Q2"),]),
+                    ]),
+                    alias: Some(Ident::new("H1")),
+                },
+                ExprWithAlias {
+                    expr: Expr::Tuple(vec![
+                        Expr::CompoundIdentifier(vec![Ident::new("sales"), Ident::new("Q3"),]),
+                        Expr::CompoundIdentifier(vec![Ident::new("sales"), Ident::new("Q4"),]),
+                    ]),
+                    alias: Some(Ident::new("H2")),
+                },
+            ]
+        );
+    }
+
+    assert_eq!(
+        verified_stmt(sql_unpivot_with_alias_and_multi_value_and_qualifier).to_string(),
+        sql_unpivot_with_alias_and_multi_value_and_qualifier
+    );
+}
+
+#[test]
+fn parse_select_table_with_index_hints() {
+    let supported_dialects = all_dialects_where(|d| d.supports_table_hints());
+    let s = supported_dialects.verified_only_select(
+        "SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a",
+    );
+    if let TableFactor::Table { index_hints, .. } = &s.from[0].relation {
+        assert_eq!(
+            vec![
+                TableIndexHints {
+                    hint_type: TableIndexHintType::Use,
+                    index_names: vec!["i1".into()],
+                    index_type: TableIndexType::Index,
+                    for_clause: None,
+                },
+                TableIndexHints {
+                    hint_type: TableIndexHintType::Ignore,
+                    index_names: vec!["i2".into()],
+                    index_type: TableIndexType::Index,
+                    for_clause: Some(TableIndexHintForClause::OrderBy),
+                },
+            ],
+            *index_hints
+        );
+    } else {
+        panic!("Expected TableFactor::Table");
+    }
+    supported_dialects.verified_stmt("SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1, i1)");
+    supported_dialects.verified_stmt(
+        "SELECT * FROM t1 USE INDEX () IGNORE INDEX (i2) USE INDEX (i1) USE INDEX (i2)",
+    );
+    supported_dialects.verified_stmt("SELECT * FROM t1 FORCE INDEX FOR JOIN (i2)");
+    supported_dialects.verified_stmt("SELECT * FROM t1 IGNORE INDEX FOR JOIN (i2)");
+    supported_dialects.verified_stmt(
+        "SELECT * FROM t USE INDEX (index1) IGNORE INDEX FOR ORDER BY (index1) IGNORE INDEX FOR GROUP BY (index1) WHERE A = B",
+    );
+
+    // Test that dialects that don't support table hints will keep parsing the USE as table alias
+    let sql = "SELECT * FROM T USE LIMIT 1";
+    let unsupported_dialects = all_dialects_where(|d| !d.supports_table_hints());
+    let select = unsupported_dialects
+        .verified_only_select_with_canonical(sql, "SELECT * FROM T AS USE LIMIT 1");
+    assert_eq!(
+        select.from,
+        vec![TableWithJoins {
+            relation: TableFactor::Table {
+                name: ObjectName(vec![sqlparser::ast::ObjectNamePart::Identifier(
+                    Ident::new("T")
+                )]),
+                alias: Some(TableAlias {
+                    name: Ident::new("USE"),
+                    columns: vec![],
+                }),
+                args: None,
+                with_hints: vec![],
+                version: None,
+                partitions: vec![],
+                with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
+            },
+            joins: vec![],
+        }]
+    );
 }
 
 #[test]
@@ -9489,7 +11297,7 @@ fn parse_pivot_unpivot_table() {
         Pivot {
             table: Box::new(Unpivot {
                 table: Box::new(TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("census")]),
+                    name: ObjectName::from(vec![Ident::new("census")]),
                     alias: Some(TableAlias {
                         name: Ident::new("c"),
                         columns: vec![]
@@ -9499,19 +11307,19 @@ fn parse_pivot_unpivot_table() {
                     version: None,
                     partitions: vec![],
                     with_ordinality: false,
+                    json_path: None,
+                    sample: None,
+                    index_hints: vec![],
                 }),
-                value: Ident {
-                    value: "population".to_string(),
-                    quote_style: None
-                },
-
-                name: Ident {
-                    value: "year".to_string(),
-                    quote_style: None
-                },
+                null_inclusion: None,
+                value: Expr::Identifier(Ident::new("population")),
+                name: Ident::new("year"),
                 columns: ["population_2000", "population_2010"]
                     .into_iter()
-                    .map(Ident::new)
+                    .map(|col| ExprWithAlias {
+                        expr: Expr::Identifier(Ident::new(col)),
+                        alias: None,
+                    })
                     .collect(),
                 alias: Some(TableAlias {
                     name: Ident::new("u"),
@@ -9525,11 +11333,17 @@ fn parse_pivot_unpivot_table() {
             value_column: vec![Ident::new("year")],
             value_source: PivotValueSource::List(vec![
                 ExprWithAlias {
-                    expr: Expr::Value(Value::SingleQuotedString("population_2000".to_string())),
+                    expr: Expr::Value(
+                        (Value::SingleQuotedString("population_2000".to_string()))
+                            .with_empty_span()
+                    ),
                     alias: None
                 },
                 ExprWithAlias {
-                    expr: Expr::Value(Value::SingleQuotedString("population_2010".to_string())),
+                    expr: Expr::Value(
+                        (Value::SingleQuotedString("population_2010".to_string()))
+                            .with_empty_span()
+                    ),
                     alias: None
                 },
             ]),
@@ -9570,10 +11384,15 @@ fn parse_non_latin_identifiers() {
         Box::new(RedshiftSqlDialect {}),
         Box::new(MySqlDialect {}),
     ]);
-
     supported_dialects.verified_stmt("SELECT a.説明 FROM test.public.inter01 AS a");
     supported_dialects.verified_stmt("SELECT a.説明 FROM inter01 AS a, inter01_transactions AS b WHERE a.説明 = b.取引 GROUP BY a.説明");
     supported_dialects.verified_stmt("SELECT 説明, hühnervögel, garçon, Москва, 東京 FROM inter01");
+
+    let supported_dialects = TestedDialects::new(vec![
+        Box::new(GenericDialect {}),
+        Box::new(DuckDbDialect {}),
+        Box::new(MsSqlDialect {}),
+    ]);
     assert!(supported_dialects
         .parse_sql_statements("SELECT 💝 FROM table1")
         .is_err());
@@ -9622,7 +11441,7 @@ fn parse_trailing_comma() {
     trailing_commas.verified_stmt(r#"SELECT "from" FROM "from""#);
 
     // doesn't allow any trailing commas
-    let trailing_commas = TestedDialects::new(vec![Box::new(GenericDialect {})]);
+    let trailing_commas = TestedDialects::new(vec![Box::new(PostgreSqlDialect {})]);
 
     assert_eq!(
         trailing_commas
@@ -9646,15 +11465,19 @@ fn parse_trailing_comma() {
             "Expected: column name or constraint definition, found: )".to_string()
         )
     );
+
+    let unsupported_dialects = all_dialects_where(|d| !d.supports_trailing_commas());
+    assert_eq!(
+        unsupported_dialects
+            .parse_sql_statements("SELECT * FROM track ORDER BY milliseconds,")
+            .unwrap_err(),
+        ParserError::ParserError("Expected: an expression, found: EOF".to_string())
+    );
 }
 
 #[test]
 fn parse_projection_trailing_comma() {
-    // Some dialects allow trailing commas only in the projection
-    let trailing_commas = TestedDialects::new(vec![
-        Box::new(SnowflakeDialect {}),
-        Box::new(BigQueryDialect {}),
-    ]);
+    let trailing_commas = all_dialects_where(|d| d.supports_projection_trailing_commas());
 
     trailing_commas.one_statement_parses_to(
         "SELECT album_id, name, FROM track",
@@ -9667,22 +11490,16 @@ fn parse_projection_trailing_comma() {
 
     trailing_commas.verified_stmt("SELECT DISTINCT ON (album_id) name FROM track");
 
+    let unsupported_dialects = all_dialects_where(|d| {
+        !d.supports_projection_trailing_commas() && !d.supports_trailing_commas()
+    });
     assert_eq!(
-        trailing_commas
-            .parse_sql_statements("SELECT * FROM track ORDER BY milliseconds,")
+        unsupported_dialects
+            .parse_sql_statements("SELECT album_id, name, FROM track")
             .unwrap_err(),
-        ParserError::ParserError("Expected: an expression, found: EOF".to_string())
+        ParserError::ParserError("Expected an expression, found: FROM".to_string())
     );
-
-    assert_eq!(
-        trailing_commas
-            .parse_sql_statements("CREATE TABLE employees (name text, age int,)")
-            .unwrap_err(),
-        ParserError::ParserError(
-            "Expected: column name or constraint definition, found: )".to_string()
-        ),
-    );
-}
+}
 
 #[test]
 fn parse_create_type() {
@@ -9690,7 +11507,7 @@ fn parse_create_type() {
         verified_stmt("CREATE TYPE db.type_name AS (foo INT, bar TEXT COLLATE \"de_DE\")");
     assert_eq!(
         Statement::CreateType {
-            name: ObjectName(vec![Ident::new("db"), Ident::new("type_name")]),
+            name: ObjectName::from(vec![Ident::new("db"), Ident::new("type_name")]),
             representation: UserDefinedTypeRepresentation::Composite {
                 attributes: vec![
                     UserDefinedTypeCompositeAttributeDef {
@@ -9701,7 +11518,7 @@ fn parse_create_type() {
                     UserDefinedTypeCompositeAttributeDef {
                         name: Ident::new("bar"),
                         data_type: DataType::Text,
-                        collation: Some(ObjectName(vec![Ident::with_quote('\"', "de_DE")])),
+                        collation: Some(ObjectName::from(vec![Ident::with_quote('\"', "de_DE")])),
                     }
                 ]
             }
@@ -9773,15 +11590,16 @@ fn parse_call() {
     assert_eq!(
         verified_stmt("CALL my_procedure('a')"),
         Statement::Call(Function {
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
                 args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                    Value::SingleQuotedString("a".to_string())
+                    (Value::SingleQuotedString("a".to_string())).with_empty_span()
                 )))],
                 clauses: vec![],
             }),
-            name: ObjectName(vec![Ident::new("my_procedure")]),
+            name: ObjectName::from(vec![Ident::new("my_procedure")]),
             filter: None,
             null_treatment: None,
             over: None,
@@ -9793,22 +11611,28 @@ fn parse_call() {
 #[test]
 fn parse_execute_stored_procedure() {
     let expected = Statement::Execute {
-        name: ObjectName(vec![
+        name: Some(ObjectName::from(vec![
             Ident {
                 value: "my_schema".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
             Ident {
                 value: "my_stored_procedure".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             },
-        ]),
+        ])),
         parameters: vec![
-            Expr::Value(Value::NationalStringLiteral("param1".to_string())),
-            Expr::Value(Value::NationalStringLiteral("param2".to_string())),
+            Expr::Value((Value::NationalStringLiteral("param1".to_string())).with_empty_span()),
+            Expr::Value((Value::NationalStringLiteral("param2".to_string())).with_empty_span()),
         ],
         has_parentheses: false,
+        immediate: false,
         using: vec![],
+        into: vec![],
+        output: false,
+        default: false,
     };
     assert_eq!(
         // Microsoft SQL Server does not use parentheses around arguments for EXECUTE
@@ -9823,11 +11647,67 @@ fn parse_execute_stored_procedure() {
         ),
         expected
     );
+    match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 @ReturnVal = @X OUTPUT") {
+        Statement::Execute { output, .. } => {
+            assert!(output);
+        }
+        _ => unreachable!(),
+    }
+    match ms_and_generic().verified_stmt("EXECUTE dbo.proc1 DEFAULT") {
+        Statement::Execute { default, .. } => {
+            assert!(default);
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_execute_immediate() {
+    let dialects = all_dialects_where(|d| d.supports_execute_immediate());
+
+    let expected = Statement::Execute {
+        parameters: vec![Expr::Value(
+            (Value::SingleQuotedString("SELECT 1".to_string())).with_empty_span(),
+        )],
+        immediate: true,
+        using: vec![ExprWithAlias {
+            expr: Expr::value(number("1")),
+            alias: Some(Ident::new("b")),
+        }],
+        into: vec![Ident::new("a")],
+        name: None,
+        has_parentheses: false,
+        output: false,
+        default: false,
+    };
+
+    let stmt = dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a USING 1 AS b");
+    assert_eq!(expected, stmt);
+
+    dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a, b USING 1 AS x, y");
+    dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' USING 1 AS x, y");
+    dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1' INTO a, b");
+    dialects.verified_stmt("EXECUTE IMMEDIATE 'SELECT 1'");
+    dialects.verified_stmt("EXECUTE 'SELECT 1'");
+
+    assert_eq!(
+        ParserError::ParserError("Expected: identifier, found: ,".to_string()),
+        dialects
+            .parse_sql_statements("EXECUTE IMMEDIATE 'SELECT 1' USING 1 AS, y")
+            .unwrap_err()
+    );
 }
 
 #[test]
 fn parse_create_table_collate() {
-    pg_and_generic().verified_stmt("CREATE TABLE tbl (foo INT, bar TEXT COLLATE \"de_DE\")");
+    all_dialects().verified_stmt("CREATE TABLE tbl (foo INT, bar TEXT COLLATE \"de_DE\")");
+    // check ordering is preserved
+    all_dialects().verified_stmt(
+        "CREATE TABLE tbl (foo INT, bar TEXT CHARACTER SET utf8mb4 COLLATE \"de_DE\")",
+    );
+    all_dialects().verified_stmt(
+        "CREATE TABLE tbl (foo INT, bar TEXT COLLATE \"de_DE\" CHARACTER SET utf8mb4)",
+    );
 }
 
 #[test]
@@ -9896,21 +11776,15 @@ fn parse_unload() {
         Statement::Unload {
             query: Box::new(Query {
                 body: Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken::empty(),
                     distinct: None,
                     top: None,
                     top_before_distinct: false,
                     projection: vec![UnnamedExpr(Expr::Identifier(Ident::new("cola"))),],
+                    exclude: None,
                     into: None,
                     from: vec![TableWithJoins {
-                        relation: TableFactor::Table {
-                            name: ObjectName(vec![Ident::new("tab")]),
-                            alias: None,
-                            args: None,
-                            with_hints: vec![],
-                            version: None,
-                            partitions: vec![],
-                            with_ordinality: false,
-                        },
+                        relation: table_from_name(ObjectName::from(vec![Ident::new("tab")])),
                         joins: vec![],
                     }],
                     lateral_views: vec![],
@@ -9926,28 +11800,32 @@ fn parse_unload() {
                     qualify: None,
                     value_table_mode: None,
                     connect_by: None,
+                    flavor: SelectFlavor::Standard,
                 }))),
                 with: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 order_by: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             }),
             to: Ident {
                 value: "s3://...".to_string(),
-                quote_style: Some('\'')
+                quote_style: Some('\''),
+                span: Span::empty(),
             },
             with: vec![SqlOption::KeyValue {
                 key: Ident {
                     value: "format".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 },
-                value: Expr::Value(Value::SingleQuotedString("AVRO".to_string()))
+                value: Expr::Value(
+                    (Value::SingleQuotedString("AVRO".to_string())).with_empty_span()
+                )
             }]
         }
     );
@@ -9981,6 +11859,7 @@ fn test_comment_hash_syntax() {
         Box::new(BigQueryDialect {}),
         Box::new(SnowflakeDialect {}),
         Box::new(MySqlDialect {}),
+        Box::new(HiveDialect {}),
     ]);
     let sql = r#"
     # comment
@@ -10002,14 +11881,15 @@ fn test_parse_inline_comment() {
     // [Hive](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable)
     match all_dialects_except(|d| d.is::<HiveDialect>()).verified_stmt(sql) {
         Statement::CreateTable(CreateTable {
-            columns, comment, ..
+            columns,
+            table_options,
+            ..
         }) => {
             assert_eq!(
                 columns,
                 vec![ColumnDef {
                     name: Ident::new("id".to_string()),
                     data_type: DataType::Int(None),
-                    collation: None,
                     options: vec![ColumnOptionDef {
                         name: None,
                         option: Comment("comment without equal".to_string()),
@@ -10017,8 +11897,10 @@ fn test_parse_inline_comment() {
                 }]
             );
             assert_eq!(
-                comment.unwrap(),
-                CommentDef::WithEq("comment with equal".to_string())
+                table_options,
+                CreateTableOptions::Plain(vec![SqlOption::Comment(CommentDef::WithEq(
+                    "comment with equal".to_string()
+                ))])
             );
         }
         _ => unreachable!(),
@@ -10046,20 +11928,39 @@ fn parse_map_access_expr() {
         Box::new(ClickHouseDialect {}),
     ]);
     let expr = dialects.verified_expr(sql);
-    let expected = Expr::MapAccess {
-        column: Expr::Identifier(Ident::new("users")).into(),
-        keys: vec![
-            MapAccessKey {
-                key: Expr::UnaryOp {
+    let expected = Expr::CompoundFieldAccess {
+        root: Box::new(Expr::Identifier(Ident::with_span(
+            Span::new(Location::of(1, 1), Location::of(1, 6)),
+            "users",
+        ))),
+        access_chain: vec![
+            AccessExpr::Subscript(Subscript::Index {
+                index: Expr::UnaryOp {
                     op: UnaryOperator::Minus,
-                    expr: Expr::Value(number("1")).into(),
+                    expr: Expr::value(number("1")).into(),
                 },
-                syntax: MapAccessSyntax::Bracket,
-            },
-            MapAccessKey {
-                key: call("safe_offset", [Expr::Value(number("2"))]),
-                syntax: MapAccessSyntax::Bracket,
-            },
+            }),
+            AccessExpr::Subscript(Subscript::Index {
+                index: Expr::Function(Function {
+                    name: ObjectName::from(vec![Ident::with_span(
+                        Span::new(Location::of(1, 11), Location::of(1, 22)),
+                        "safe_offset",
+                    )]),
+                    parameters: FunctionArguments::None,
+                    args: FunctionArguments::List(FunctionArgumentList {
+                        duplicate_treatment: None,
+                        args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            (number("2")).with_empty_span(),
+                        )))],
+                        clauses: vec![],
+                    }),
+                    filter: None,
+                    null_treatment: None,
+                    over: None,
+                    within_group: vec![],
+                    uses_odbc_syntax: false,
+                }),
+            }),
         ],
     };
     assert_eq!(expr, expected);
@@ -10072,6 +11973,7 @@ fn parse_map_access_expr() {
 #[test]
 fn parse_connect_by() {
     let expect_query = Select {
+        select_token: AttachedToken::empty(),
         distinct: None,
         top: None,
         top_before_distinct: false,
@@ -10080,16 +11982,9 @@ fn parse_connect_by() {
             SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("manager_id"))),
             SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("title"))),
         ],
+        exclude: None,
         from: vec![TableWithJoins {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("employees")]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![Ident::new("employees")])),
             joins: vec![],
         }],
         into: None,
@@ -10109,9 +12004,9 @@ fn parse_connect_by() {
             condition: Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("title"))),
                 op: BinaryOperator::Eq,
-                right: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "president".to_owned(),
-                ))),
+                right: Box::new(Expr::Value(
+                    Value::SingleQuotedString("president".to_owned()).with_empty_span(),
+                )),
             },
             relationships: vec![Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("manager_id"))),
@@ -10121,6 +12016,7 @@ fn parse_connect_by() {
                 ))))),
             }],
         }),
+        flavor: SelectFlavor::Standard,
     };
 
     let connect_by_1 = concat!(
@@ -10159,6 +12055,7 @@ fn parse_connect_by() {
     assert_eq!(
         all_dialects_where(|d| d.supports_connect_by()).verified_only_select(connect_by_3),
         Select {
+            select_token: AttachedToken::empty(),
             distinct: None,
             top: None,
             top_before_distinct: false,
@@ -10167,16 +12064,9 @@ fn parse_connect_by() {
                 SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("manager_id"))),
                 SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("title"))),
             ],
+            exclude: None,
             from: vec![TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("employees")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec![Ident::new("employees")])),
                 joins: vec![],
             }],
             into: None,
@@ -10185,7 +12075,7 @@ fn parse_connect_by() {
             selection: Some(Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("employee_id"))),
                 op: BinaryOperator::NotEq,
-                right: Box::new(Expr::Value(number("42"))),
+                right: Box::new(Expr::value(number("42"))),
             }),
             group_by: GroupByExpr::Expressions(vec![], vec![]),
             cluster_by: vec![],
@@ -10200,9 +12090,9 @@ fn parse_connect_by() {
                 condition: Expr::BinaryOp {
                     left: Box::new(Expr::Identifier(Ident::new("title"))),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "president".to_owned(),
-                    ))),
+                    right: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("president".to_owned(),)).with_empty_span()
+                    )),
                 },
                 relationships: vec![Expr::BinaryOp {
                     left: Box::new(Expr::Identifier(Ident::new("manager_id"))),
@@ -10212,6 +12102,7 @@ fn parse_connect_by() {
                     ))))),
                 }],
             }),
+            flavor: SelectFlavor::Standard,
         }
     );
 
@@ -10240,6 +12131,20 @@ fn parse_connect_by() {
 
 #[test]
 fn test_selective_aggregation() {
+    let testing_dialects = all_dialects_where(|d| d.supports_filter_during_aggregation());
+    let expected_dialects: Vec<Box<dyn Dialect>> = vec![
+        Box::new(PostgreSqlDialect {}),
+        Box::new(DatabricksDialect {}),
+        Box::new(HiveDialect {}),
+        Box::new(SQLiteDialect {}),
+        Box::new(DuckDbDialect {}),
+        Box::new(GenericDialect {}),
+    ];
+    assert_eq!(testing_dialects.dialects.len(), expected_dialects.len());
+    expected_dialects
+        .into_iter()
+        .for_each(|d| assert!(d.supports_filter_during_aggregation()));
+
     let sql = concat!(
         "SELECT ",
         "ARRAY_AGG(name) FILTER (WHERE name IS NOT NULL), ",
@@ -10247,12 +12152,11 @@ fn test_selective_aggregation() {
         "FROM region"
     );
     assert_eq!(
-        all_dialects_where(|d| d.supports_filter_during_aggregation())
-            .verified_only_select(sql)
-            .projection,
+        testing_dialects.verified_only_select(sql).projection,
         vec![
             SelectItem::UnnamedExpr(Expr::Function(Function {
-                name: ObjectName(vec![Ident::new("ARRAY_AGG")]),
+                name: ObjectName::from(vec![Ident::new("ARRAY_AGG")]),
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::List(FunctionArgumentList {
                     duplicate_treatment: None,
@@ -10270,7 +12174,8 @@ fn test_selective_aggregation() {
             })),
             SelectItem::ExprWithAlias {
                 expr: Expr::Function(Function {
-                    name: ObjectName(vec![Ident::new("ARRAY_AGG")]),
+                    name: ObjectName::from(vec![Ident::new("ARRAY_AGG")]),
+                    uses_odbc_syntax: false,
                     parameters: FunctionArguments::None,
                     args: FunctionArguments::List(FunctionArgumentList {
                         duplicate_treatment: None,
@@ -10282,7 +12187,9 @@ fn test_selective_aggregation() {
                     filter: Some(Box::new(Expr::Like {
                         negated: false,
                         expr: Box::new(Expr::Identifier(Ident::new("name"))),
-                        pattern: Box::new(Expr::Value(Value::SingleQuotedString("a%".to_owned()))),
+                        pattern: Box::new(Expr::Value(
+                            (Value::SingleQuotedString("a%".to_owned())).with_empty_span()
+                        )),
                         escape_char: None,
                         any: false,
                     })),
@@ -10323,21 +12230,51 @@ fn test_group_by_grouping_sets() {
     );
 }
 
+#[test]
+fn test_xmltable() {
+    all_dialects()
+        .verified_only_select("SELECT * FROM XMLTABLE('/root' PASSING data COLUMNS element TEXT)");
+
+    // Minimal meaningful working example: returns a single row with a single column named y containing the value z
+    all_dialects().verified_only_select(
+        "SELECT y FROM XMLTABLE('/X' PASSING '<X><y>z</y></X>' COLUMNS y TEXT)",
+    );
+
+    // Test using subqueries
+    all_dialects().verified_only_select("SELECT y FROM XMLTABLE((SELECT '/X') PASSING (SELECT CAST('<X><y>z</y></X>' AS xml)) COLUMNS y TEXT PATH (SELECT 'y'))");
+
+    // NOT NULL
+    all_dialects().verified_only_select(
+        "SELECT y FROM XMLTABLE('/X' PASSING '<X></X>' COLUMNS y TEXT NOT NULL)",
+    );
+
+    all_dialects().verified_only_select("SELECT * FROM XMLTABLE('/root/row' PASSING xmldata COLUMNS id INT PATH '@id', name TEXT PATH 'name/text()', value FLOAT PATH 'value')");
+
+    all_dialects().verified_only_select("SELECT * FROM XMLTABLE('//ROWS/ROW' PASSING data COLUMNS row_num FOR ORDINALITY, id INT PATH '@id', name TEXT PATH 'NAME' DEFAULT 'unnamed')");
+
+    // Example from https://www.postgresql.org/docs/15/functions-xml.html#FUNCTIONS-XML-PROCESSING
+    all_dialects().verified_only_select(
+        "SELECT xmltable.* FROM xmldata, XMLTABLE('//ROWS/ROW' PASSING data COLUMNS id INT PATH '@id', ordinality FOR ORDINALITY, \"COUNTRY_NAME\" TEXT, country_id TEXT PATH 'COUNTRY_ID', size_sq_km FLOAT PATH 'SIZE[@unit = \"sq_km\"]', size_other TEXT PATH 'concat(SIZE[@unit!=\"sq_km\"], \" \", SIZE[@unit!=\"sq_km\"]/@unit)', premier_name TEXT PATH 'PREMIER_NAME' DEFAULT 'not specified')"
+    );
+
+    // Example from DB2 docs without explicit PASSING clause: https://www.ibm.com/docs/en/db2/12.1.0?topic=xquery-simple-column-name-passing-xmlexists-xmlquery-xmltable
+    all_dialects().verified_only_select(
+        "SELECT X.* FROM T1, XMLTABLE('$CUSTLIST/customers/customerinfo' COLUMNS \"Cid\" BIGINT PATH '@Cid', \"Info\" XML PATH 'document{.}', \"History\" XML PATH 'NULL') AS X"
+    );
+
+    // Example from PostgreSQL with XMLNAMESPACES
+    all_dialects().verified_only_select(
+        "SELECT xmltable.* FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x, 'http://example.com/b' AS \"B\"), '/x:example/x:item' PASSING (SELECT data FROM xmldata) COLUMNS foo INT PATH '@foo', bar INT PATH '@B:bar')"
+    );
+}
+
 #[test]
 fn test_match_recognize() {
     use MatchRecognizePattern::*;
     use MatchRecognizeSymbol::*;
     use RepetitionQuantifier::*;
 
-    let table = TableFactor::Table {
-        name: ObjectName(vec![Ident::new("my_table")]),
-        alias: None,
-        args: None,
-        with_hints: vec![],
-        version: None,
-        partitions: vec![],
-        with_ordinality: false,
-    };
+    let table = table_from_name(ObjectName::from(vec![Ident::new("my_table")]));
 
     fn check(options: &str, expect: TableFactor) {
         let select = all_dialects_where(|d| d.supports_match_recognize()).verified_only_select(
@@ -10366,8 +12303,10 @@ fn test_match_recognize() {
             partition_by: vec![Expr::Identifier(Ident::new("company"))],
             order_by: vec![OrderByExpr {
                 expr: Expr::Identifier(Ident::new("price_date")),
-                asc: None,
-                nulls_first: None,
+                options: OrderByOptions {
+                    asc: None,
+                    nulls_first: None,
+                },
                 with_fill: None,
             }],
             measures: vec![
@@ -10646,7 +12585,9 @@ fn test_select_wildcard_with_replace() {
     let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
         opt_replace: Some(ReplaceSelectItem {
             items: vec![Box::new(ReplaceSelectElement {
-                expr: Expr::Value(Value::SingleQuotedString("widget".to_owned())),
+                expr: Expr::Value(
+                    (Value::SingleQuotedString("widget".to_owned())).with_empty_span(),
+                ),
                 column_name: Ident::new("item_name"),
                 as_keyword: true,
             })],
@@ -10665,13 +12606,13 @@ fn test_select_wildcard_with_replace() {
                     expr: Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("quantity"))),
                         op: BinaryOperator::Divide,
-                        right: Box::new(Expr::Value(number("2"))),
+                        right: Box::new(Expr::value(number("2"))),
                     },
                     column_name: Ident::new("quantity"),
                     as_keyword: true,
                 }),
                 Box::new(ReplaceSelectElement {
-                    expr: Expr::Value(number("3")),
+                    expr: Expr::value(number("3")),
                     column_name: Ident::new("order_id"),
                     as_keyword: true,
                 }),
@@ -10705,6 +12646,37 @@ fn insert_into_with_parentheses() {
         Box::new(GenericDialect {}),
     ]);
     dialects.verified_stmt("INSERT INTO t1 (id, name) (SELECT t2.id, t2.name FROM t2)");
+    dialects.verified_stmt("INSERT INTO t1 (SELECT t2.id, t2.name FROM t2)");
+    dialects.verified_stmt(r#"INSERT INTO t1 ("select", name) (SELECT t2.name FROM t2)"#);
+}
+
+#[test]
+fn parse_odbc_scalar_function() {
+    let select = verified_only_select("SELECT {fn my_func(1, 2)}");
+    let Expr::Function(Function {
+        name,
+        uses_odbc_syntax,
+        args,
+        ..
+    }) = expr_from_projection(only(&select.projection))
+    else {
+        unreachable!("expected function")
+    };
+    assert_eq!(name, &ObjectName::from(vec![Ident::new("my_func")]));
+    assert!(uses_odbc_syntax);
+    matches!(args, FunctionArguments::List(l) if l.args.len() == 2);
+
+    verified_stmt("SELECT {fn fna()} AS foo, fnb(1)");
+
+    // Testing invalid SQL with any-one dialect is intentional.
+    // Depending on dialect flags the error message may be different.
+    let pg = TestedDialects::new(vec![Box::new(PostgreSqlDialect {})]);
+    assert_eq!(
+        pg.parse_sql_statements("SELECT {fn2 my_func()}")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: an expression, found: {"
+    );
 }
 
 #[test]
@@ -10716,20 +12688,22 @@ fn test_dictionary_syntax() {
         );
     }
 
+    check("{}", Expr::Dictionary(vec![]));
+
     check(
         "{'Alberta': 'Edmonton', 'Manitoba': 'Winnipeg'}",
         Expr::Dictionary(vec![
             DictionaryField {
                 key: Ident::with_quote('\'', "Alberta"),
-                value: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "Edmonton".to_owned(),
-                ))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("Edmonton".to_owned())).with_empty_span(),
+                )),
             },
             DictionaryField {
                 key: Ident::with_quote('\'', "Manitoba"),
-                value: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "Winnipeg".to_owned(),
-                ))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("Winnipeg".to_owned())).with_empty_span(),
+                )),
             },
         ]),
     );
@@ -10741,9 +12715,9 @@ fn test_dictionary_syntax() {
                 key: Ident::with_quote('\'', "start"),
                 value: Box::new(Expr::Cast {
                     kind: CastKind::Cast,
-                    expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "2023-04-01".to_owned(),
-                    ))),
+                    expr: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("2023-04-01".to_owned())).with_empty_span(),
+                    )),
                     data_type: DataType::Timestamp(None, TimezoneInfo::None),
                     format: None,
                 }),
@@ -10752,9 +12726,9 @@ fn test_dictionary_syntax() {
                 key: Ident::with_quote('\'', "end"),
                 value: Box::new(Expr::Cast {
                     kind: CastKind::Cast,
-                    expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "2023-04-05".to_owned(),
-                    ))),
+                    expr: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("2023-04-05".to_owned())).with_empty_span(),
+                    )),
                     data_type: DataType::Timestamp(None, TimezoneInfo::None),
                     format: None,
                 }),
@@ -10777,25 +12751,27 @@ fn test_map_syntax() {
         Expr::Map(Map {
             entries: vec![
                 MapEntry {
-                    key: Box::new(Expr::Value(Value::SingleQuotedString("Alberta".to_owned()))),
-                    value: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "Edmonton".to_owned(),
-                    ))),
+                    key: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Alberta".to_owned())).with_empty_span(),
+                    )),
+                    value: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Edmonton".to_owned())).with_empty_span(),
+                    )),
                 },
                 MapEntry {
-                    key: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "Manitoba".to_owned(),
-                    ))),
-                    value: Box::new(Expr::Value(Value::SingleQuotedString(
-                        "Winnipeg".to_owned(),
-                    ))),
+                    key: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Manitoba".to_owned())).with_empty_span(),
+                    )),
+                    value: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Winnipeg".to_owned())).with_empty_span(),
+                    )),
                 },
             ],
         }),
     );
 
     fn number_expr(s: &str) -> Expr {
-        Expr::Value(number(s))
+        Expr::value(number(s))
     }
 
     check(
@@ -10823,14 +12799,14 @@ fn test_map_syntax() {
                         elem: vec![number_expr("1"), number_expr("2"), number_expr("3")],
                         named: false,
                     })),
-                    value: Box::new(Expr::Value(number("10.0"))),
+                    value: Box::new(Expr::value(number("10.0"))),
                 },
                 MapEntry {
                     key: Box::new(Expr::Array(Array {
                         elem: vec![number_expr("4"), number_expr("5"), number_expr("6")],
                         named: false,
                     })),
-                    value: Box::new(Expr::Value(number("20.0"))),
+                    value: Box::new(Expr::value(number("20.0"))),
                 },
             ],
         }),
@@ -10838,22 +12814,26 @@ fn test_map_syntax() {
 
     check(
         "MAP {'a': 10, 'b': 20}['a']",
-        Expr::Subscript {
-            expr: Box::new(Expr::Map(Map {
+        Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Map(Map {
                 entries: vec![
                     MapEntry {
-                        key: Box::new(Expr::Value(Value::SingleQuotedString("a".to_owned()))),
+                        key: Box::new(Expr::Value(
+                            (Value::SingleQuotedString("a".to_owned())).with_empty_span(),
+                        )),
                         value: Box::new(number_expr("10")),
                     },
                     MapEntry {
-                        key: Box::new(Expr::Value(Value::SingleQuotedString("b".to_owned()))),
+                        key: Box::new(Expr::Value(
+                            (Value::SingleQuotedString("b".to_owned())).with_empty_span(),
+                        )),
                         value: Box::new(number_expr("20")),
                     },
                 ],
             })),
-            subscript: Box::new(Subscript::Index {
-                index: Expr::Value(Value::SingleQuotedString("a".to_owned())),
-            }),
+            access_chain: vec![AccessExpr::Subscript(Subscript::Index {
+                index: Expr::Value((Value::SingleQuotedString("a".to_owned())).with_empty_span()),
+            })],
         },
     );
 
@@ -10947,27 +12927,12 @@ fn parse_select_wildcard_with_except() {
     );
 }
 
-#[test]
-fn parse_auto_increment_too_large() {
-    let dialect = GenericDialect {};
-    let u64_max = u64::MAX;
-    let sql =
-        format!("CREATE TABLE foo (bar INT NOT NULL AUTO_INCREMENT) AUTO_INCREMENT=1{u64_max}");
-
-    let res = Parser::new(&dialect)
-        .try_with_sql(&sql)
-        .expect("tokenize to work")
-        .parse_statements();
-
-    assert!(res.is_err(), "{res:?}");
-}
-
 #[test]
 fn test_group_by_nothing() {
     let Select { group_by, .. } = all_dialects_where(|d| d.supports_group_by_expr())
         .verified_only_select("SELECT count(1) FROM t GROUP BY ()");
     {
-        std::assert_eq!(
+        assert_eq!(
             GroupByExpr::Expressions(vec![Expr::Tuple(vec![])], vec![]),
             group_by
         );
@@ -10976,7 +12941,7 @@ fn test_group_by_nothing() {
     let Select { group_by, .. } = all_dialects_where(|d| d.supports_group_by_expr())
         .verified_only_select("SELECT name, count(1) FROM t GROUP BY name, ()");
     {
-        std::assert_eq!(
+        assert_eq!(
             GroupByExpr::Expressions(
                 vec![
                     Identifier(Ident::new("name".to_string())),
@@ -10992,26 +12957,82 @@ fn test_group_by_nothing() {
 #[test]
 fn test_extract_seconds_ok() {
     let dialects = all_dialects_where(|d| d.allow_extract_custom());
-    let stmt = dialects.verified_expr("EXTRACT(seconds FROM '2 seconds'::INTERVAL)");
+    let stmt = dialects.verified_expr("EXTRACT(SECONDS FROM '2 seconds'::INTERVAL)");
 
     assert_eq!(
         stmt,
         Expr::Extract {
-            field: DateTimeField::Custom(Ident {
-                value: "seconds".to_string(),
-                quote_style: None,
-            }),
+            field: Seconds,
             syntax: ExtractSyntax::From,
             expr: Box::new(Expr::Cast {
                 kind: CastKind::DoubleColon,
-                expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "2 seconds".to_string()
-                ))),
-                data_type: DataType::Interval,
+                expr: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("2 seconds".to_string())).with_empty_span()
+                )),
+                data_type: DataType::Interval {
+                    fields: None,
+                    precision: None
+                },
                 format: None,
             }),
         }
-    )
+    );
+
+    let actual_ast = dialects
+        .parse_sql_statements("SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)")
+        .unwrap();
+
+    let expected_ast = vec![Statement::Query(Box::new(Query {
+        with: None,
+        body: Box::new(SetExpr::Select(Box::new(Select {
+            select_token: AttachedToken::empty(),
+            distinct: None,
+            top: None,
+            top_before_distinct: false,
+            projection: vec![UnnamedExpr(Expr::Extract {
+                field: Seconds,
+                syntax: ExtractSyntax::From,
+                expr: Box::new(Expr::Cast {
+                    kind: CastKind::DoubleColon,
+                    expr: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("2 seconds".to_string())).with_empty_span(),
+                    )),
+                    data_type: DataType::Interval {
+                        fields: None,
+                        precision: None,
+                    },
+                    format: None,
+                }),
+            })],
+            exclude: None,
+            into: None,
+            from: vec![],
+            lateral_views: vec![],
+            prewhere: None,
+            selection: None,
+            group_by: GroupByExpr::Expressions(vec![], vec![]),
+            cluster_by: vec![],
+            distribute_by: vec![],
+            sort_by: vec![],
+            having: None,
+            named_window: vec![],
+            qualify: None,
+            window_before_qualify: false,
+            value_table_mode: None,
+            connect_by: None,
+            flavor: SelectFlavor::Standard,
+        }))),
+        order_by: None,
+        limit_clause: None,
+        fetch: None,
+        locks: vec![],
+        for_clause: None,
+        settings: None,
+        format_clause: None,
+        pipe_operators: vec![],
+    }))];
+
+    assert_eq!(actual_ast, expected_ast);
 }
 
 #[test]
@@ -11025,31 +13046,24 @@ fn test_extract_seconds_single_quote_ok() {
             field: DateTimeField::Custom(Ident {
                 value: "seconds".to_string(),
                 quote_style: Some('\''),
+                span: Span::empty(),
             }),
             syntax: ExtractSyntax::From,
             expr: Box::new(Expr::Cast {
                 kind: CastKind::DoubleColon,
-                expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "2 seconds".to_string()
-                ))),
-                data_type: DataType::Interval,
+                expr: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("2 seconds".to_string())).with_empty_span()
+                )),
+                data_type: DataType::Interval {
+                    fields: None,
+                    precision: None
+                },
                 format: None,
             }),
         }
     )
 }
 
-#[test]
-fn test_extract_seconds_err() {
-    let sql = "SELECT EXTRACT(seconds FROM '2 seconds'::INTERVAL)";
-    let dialects = all_dialects_except(|d| d.allow_extract_custom());
-    let err = dialects.parse_sql_statements(sql).unwrap_err();
-    assert_eq!(
-        err.to_string(),
-        "sql parser error: Expected: date/time field, found: seconds"
-    );
-}
-
 #[test]
 fn test_extract_seconds_single_quote_err() {
     let sql = r#"SELECT EXTRACT('seconds' FROM '2 seconds'::INTERVAL)"#;
@@ -11093,11 +13107,11 @@ fn parse_explain_with_option_list() {
         Some(vec![
             UtilityOption {
                 name: Ident::new("ANALYZE"),
-                arg: Some(Expr::Value(Value::Boolean(false))),
+                arg: Some(Expr::Value((Value::Boolean(false)).with_empty_span())),
             },
             UtilityOption {
                 name: Ident::new("VERBOSE"),
-                arg: Some(Expr::Value(Value::Boolean(true))),
+                arg: Some(Expr::Value((Value::Boolean(true)).with_empty_span())),
             },
         ]),
     );
@@ -11133,7 +13147,9 @@ fn parse_explain_with_option_list() {
             },
             UtilityOption {
                 name: Ident::new("FORMAT2"),
-                arg: Some(Expr::Value(Value::SingleQuotedString("JSON".to_string()))),
+                arg: Some(Expr::Value(
+                    (Value::SingleQuotedString("JSON".to_string())).with_empty_span(),
+                )),
             },
             UtilityOption {
                 name: Ident::new("FORMAT3"),
@@ -11155,20 +13171,26 @@ fn parse_explain_with_option_list() {
         Some(vec![
             UtilityOption {
                 name: Ident::new("NUM1"),
-                arg: Some(Expr::Value(Value::Number("10".parse().unwrap(), false))),
+                arg: Some(Expr::Value(
+                    (Value::Number("10".parse().unwrap(), false)).with_empty_span(),
+                )),
             },
             UtilityOption {
                 name: Ident::new("NUM2"),
                 arg: Some(Expr::UnaryOp {
                     op: UnaryOperator::Plus,
-                    expr: Box::new(Expr::Value(Value::Number("10.1".parse().unwrap(), false))),
+                    expr: Box::new(Expr::Value(
+                        (Value::Number("10.1".parse().unwrap(), false)).with_empty_span(),
+                    )),
                 }),
             },
             UtilityOption {
                 name: Ident::new("NUM3"),
                 arg: Some(Expr::UnaryOp {
                     op: UnaryOperator::Minus,
-                    expr: Box::new(Expr::Value(Value::Number("10.2".parse().unwrap(), false))),
+                    expr: Box::new(Expr::Value(
+                        (Value::Number("10.2".parse().unwrap(), false)).with_empty_span(),
+                    )),
                 }),
             },
         ]),
@@ -11181,7 +13203,7 @@ fn parse_explain_with_option_list() {
         },
         UtilityOption {
             name: Ident::new("VERBOSE"),
-            arg: Some(Expr::Value(Value::Boolean(true))),
+            arg: Some(Expr::Value((Value::Boolean(true)).with_empty_span())),
         },
         UtilityOption {
             name: Ident::new("WAL"),
@@ -11195,11 +13217,13 @@ fn parse_explain_with_option_list() {
             name: Ident::new("USER_DEF_NUM"),
             arg: Some(Expr::UnaryOp {
                 op: UnaryOperator::Minus,
-                expr: Box::new(Expr::Value(Value::Number("100.1".parse().unwrap(), false))),
+                expr: Box::new(Expr::Value(
+                    (Value::Number("100.1".parse().unwrap(), false)).with_empty_span(),
+                )),
             }),
         },
     ];
-    run_explain_analyze (
+    run_explain_analyze(
         all_dialects_where(|d| d.supports_explain_with_utility_options()),
         "EXPLAIN (ANALYZE, VERBOSE true, WAL OFF, FORMAT YAML, USER_DEF_NUM -100.1) SELECT sqrt(id) FROM foo",
         false,
@@ -11240,15 +13264,21 @@ fn test_create_policy() {
                 Some(Expr::BinaryOp {
                     left: Box::new(Expr::Identifier(Ident::new("c0"))),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                    right: Box::new(Expr::Value(
+                        (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                    )),
                 })
             );
             assert_eq!(
                 with_check,
                 Some(Expr::BinaryOp {
-                    left: Box::new(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                    left: Box::new(Expr::Value(
+                        (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                    )),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                    right: Box::new(Expr::Value(
+                        (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                    )),
                 })
             );
         }
@@ -11324,12 +13354,12 @@ fn test_drop_policy() {
             if_exists,
             name,
             table_name,
-            option,
+            drop_behavior,
         } => {
             assert_eq!(if_exists, true);
             assert_eq!(name.to_string(), "my_policy");
             assert_eq!(table_name.to_string(), "my_table");
-            assert_eq!(option, Some(ReferentialAction::Restrict));
+            assert_eq!(drop_behavior, Some(DropBehavior::Restrict));
         }
         _ => unreachable!(),
     }
@@ -11439,42 +13469,219 @@ fn test_alter_policy() {
 }
 
 #[test]
-fn test_select_where_with_like_or_ilike_any() {
-    verified_stmt(r#"SELECT * FROM x WHERE a ILIKE ANY '%abc%'"#);
-    verified_stmt(r#"SELECT * FROM x WHERE a LIKE ANY '%abc%'"#);
-    verified_stmt(r#"SELECT * FROM x WHERE a ILIKE ANY ('%Jo%oe%', 'T%e')"#);
-    verified_stmt(r#"SELECT * FROM x WHERE a LIKE ANY ('%Jo%oe%', 'T%e')"#);
-}
+fn test_create_connector() {
+    let sql = "CREATE CONNECTOR my_connector \
+               TYPE 'jdbc' \
+               URL 'jdbc:mysql://localhost:3306/mydb' \
+               WITH DCPROPERTIES('user' = 'root', 'password' = 'password')";
+    let dialects = all_dialects();
+    match dialects.verified_stmt(sql) {
+        Statement::CreateConnector(CreateConnector {
+            name,
+            connector_type,
+            url,
+            with_dcproperties,
+            ..
+        }) => {
+            assert_eq!(name.to_string(), "my_connector");
+            assert_eq!(connector_type, Some("jdbc".to_string()));
+            assert_eq!(url, Some("jdbc:mysql://localhost:3306/mydb".to_string()));
+            assert_eq!(
+                with_dcproperties,
+                Some(vec![
+                    SqlOption::KeyValue {
+                        key: Ident::with_quote('\'', "user"),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("root".to_string())).with_empty_span()
+                        )
+                    },
+                    SqlOption::KeyValue {
+                        key: Ident::with_quote('\'', "password"),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("password".to_string())).with_empty_span()
+                        )
+                    }
+                ])
+            );
+        }
+        _ => unreachable!(),
+    }
 
-#[test]
-fn test_any_some_all_comparison() {
-    verified_stmt("SELECT c1 FROM tbl WHERE c1 = ANY(SELECT c2 FROM tbl)");
-    verified_stmt("SELECT c1 FROM tbl WHERE c1 >= ALL(SELECT c2 FROM tbl)");
-    verified_stmt("SELECT c1 FROM tbl WHERE c1 <> SOME(SELECT c2 FROM tbl)");
-    verified_stmt("SELECT 1 = ANY(WITH x AS (SELECT 1) SELECT * FROM x)");
+    // omit IF NOT EXISTS/TYPE/URL/COMMENT/WITH DCPROPERTIES clauses is allowed
+    dialects.verified_stmt("CREATE CONNECTOR my_connector");
+
+    // missing connector name
+    assert_eq!(
+        dialects
+            .parse_sql_statements("CREATE CONNECTOR")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: identifier, found: EOF"
+    );
 }
 
 #[test]
-fn test_alias_equal_expr() {
-    let dialects = all_dialects_where(|d| d.supports_eq_alias_assignment());
-    let sql = r#"SELECT some_alias = some_column FROM some_table"#;
-    let expected = r#"SELECT some_column AS some_alias FROM some_table"#;
-    let _ = dialects.one_statement_parses_to(sql, expected);
+fn test_drop_connector() {
+    let dialects = all_dialects();
+    match dialects.verified_stmt("DROP CONNECTOR IF EXISTS my_connector") {
+        Statement::DropConnector { if_exists, name } => {
+            assert_eq!(if_exists, true);
+            assert_eq!(name.to_string(), "my_connector");
+        }
+        _ => unreachable!(),
+    }
 
-    let sql = r#"SELECT some_alias = (a*b) FROM some_table"#;
-    let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
-    let _ = dialects.one_statement_parses_to(sql, expected);
+    // omit IF EXISTS is allowed
+    dialects.verified_stmt("DROP CONNECTOR my_connector");
 
-    let dialects = all_dialects_where(|d| !d.supports_eq_alias_assignment());
-    let sql = r#"SELECT x = (a * b) FROM some_table"#;
-    let expected = r#"SELECT x = (a * b) FROM some_table"#;
-    let _ = dialects.one_statement_parses_to(sql, expected);
+    // missing connector name
+    assert_eq!(
+        dialects
+            .parse_sql_statements("DROP CONNECTOR")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: identifier, found: EOF"
+    );
 }
 
 #[test]
-fn test_try_convert() {
-    let dialects =
-        all_dialects_where(|d| d.supports_try_convert() && d.convert_type_before_value());
+fn test_alter_connector() {
+    let dialects = all_dialects();
+    match dialects.verified_stmt(
+        "ALTER CONNECTOR my_connector SET DCPROPERTIES('user' = 'root', 'password' = 'password')",
+    ) {
+        Statement::AlterConnector {
+            name,
+            properties,
+            url,
+            owner,
+        } => {
+            assert_eq!(name.to_string(), "my_connector");
+            assert_eq!(
+                properties,
+                Some(vec![
+                    SqlOption::KeyValue {
+                        key: Ident::with_quote('\'', "user"),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("root".to_string())).with_empty_span()
+                        )
+                    },
+                    SqlOption::KeyValue {
+                        key: Ident::with_quote('\'', "password"),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("password".to_string())).with_empty_span()
+                        )
+                    }
+                ])
+            );
+            assert_eq!(url, None);
+            assert_eq!(owner, None);
+        }
+        _ => unreachable!(),
+    }
+
+    match dialects
+        .verified_stmt("ALTER CONNECTOR my_connector SET URL 'jdbc:mysql://localhost:3306/mydb'")
+    {
+        Statement::AlterConnector {
+            name,
+            properties,
+            url,
+            owner,
+        } => {
+            assert_eq!(name.to_string(), "my_connector");
+            assert_eq!(properties, None);
+            assert_eq!(url, Some("jdbc:mysql://localhost:3306/mydb".to_string()));
+            assert_eq!(owner, None);
+        }
+        _ => unreachable!(),
+    }
+
+    match dialects.verified_stmt("ALTER CONNECTOR my_connector SET OWNER USER 'root'") {
+        Statement::AlterConnector {
+            name,
+            properties,
+            url,
+            owner,
+        } => {
+            assert_eq!(name.to_string(), "my_connector");
+            assert_eq!(properties, None);
+            assert_eq!(url, None);
+            assert_eq!(
+                owner,
+                Some(AlterConnectorOwner::User(Ident::with_quote('\'', "root")))
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    match dialects.verified_stmt("ALTER CONNECTOR my_connector SET OWNER ROLE 'admin'") {
+        Statement::AlterConnector {
+            name,
+            properties,
+            url,
+            owner,
+        } => {
+            assert_eq!(name.to_string(), "my_connector");
+            assert_eq!(properties, None);
+            assert_eq!(url, None);
+            assert_eq!(
+                owner,
+                Some(AlterConnectorOwner::Role(Ident::with_quote('\'', "admin")))
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Wrong option name
+    assert_eq!(
+        dialects
+            .parse_sql_statements(
+                "ALTER CONNECTOR my_connector SET WRONG 'jdbc:mysql://localhost:3306/mydb'"
+            )
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: end of statement, found: WRONG"
+    );
+}
+
+#[test]
+fn test_select_where_with_like_or_ilike_any() {
+    verified_stmt(r#"SELECT * FROM x WHERE a ILIKE ANY '%abc%'"#);
+    verified_stmt(r#"SELECT * FROM x WHERE a LIKE ANY '%abc%'"#);
+    verified_stmt(r#"SELECT * FROM x WHERE a ILIKE ANY ('%Jo%oe%', 'T%e')"#);
+    verified_stmt(r#"SELECT * FROM x WHERE a LIKE ANY ('%Jo%oe%', 'T%e')"#);
+}
+
+#[test]
+fn test_any_some_all_comparison() {
+    verified_stmt("SELECT c1 FROM tbl WHERE c1 = ANY(SELECT c2 FROM tbl)");
+    verified_stmt("SELECT c1 FROM tbl WHERE c1 >= ALL(SELECT c2 FROM tbl)");
+    verified_stmt("SELECT c1 FROM tbl WHERE c1 <> SOME(SELECT c2 FROM tbl)");
+    verified_stmt("SELECT 1 = ANY(WITH x AS (SELECT 1) SELECT * FROM x)");
+}
+
+#[test]
+fn test_alias_equal_expr() {
+    let dialects = all_dialects_where(|d| d.supports_eq_alias_assignment());
+    let sql = r#"SELECT some_alias = some_column FROM some_table"#;
+    let expected = r#"SELECT some_column AS some_alias FROM some_table"#;
+    let _ = dialects.one_statement_parses_to(sql, expected);
+
+    let sql = r#"SELECT some_alias = (a*b) FROM some_table"#;
+    let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
+    let _ = dialects.one_statement_parses_to(sql, expected);
+
+    let dialects = all_dialects_where(|d| !d.supports_eq_alias_assignment());
+    let sql = r#"SELECT x = (a * b) FROM some_table"#;
+    let expected = r#"SELECT x = (a * b) FROM some_table"#;
+    let _ = dialects.one_statement_parses_to(sql, expected);
+}
+
+#[test]
+fn test_try_convert() {
+    let dialects =
+        all_dialects_where(|d| d.supports_try_convert() && d.convert_type_before_value());
     dialects.verified_expr("TRY_CONVERT(VARCHAR(MAX), 'foo')");
 
     let dialects =
@@ -11484,68 +13691,76 @@ fn test_try_convert() {
 
 #[test]
 fn parse_method_select() {
-    let dialects = all_dialects_where(|d| d.supports_methods());
-    let _ = dialects.verified_only_select(
+    let _ = verified_only_select(
         "SELECT LEFT('abc', 1).value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)') AS T",
     );
-    let _ = dialects.verified_only_select("SELECT STUFF((SELECT ',' + name FROM sys.objects FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS T");
-    let _ = dialects
-        .verified_only_select("SELECT CAST(column AS XML).value('.', 'NVARCHAR(MAX)') AS T");
+    let _ = verified_only_select("SELECT STUFF((SELECT ',' + name FROM sys.objects FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS T");
+    let _ = verified_only_select("SELECT CAST(column AS XML).value('.', 'NVARCHAR(MAX)') AS T");
 
     // `CONVERT` support
-    let dialects = all_dialects_where(|d| {
-        d.supports_methods() && d.supports_try_convert() && d.convert_type_before_value()
-    });
+    let dialects =
+        all_dialects_where(|d| d.supports_try_convert() && d.convert_type_before_value());
     let _ = dialects.verified_only_select("SELECT CONVERT(XML, '<Book>abc</Book>').value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)') AS T");
 }
 
 #[test]
 fn parse_method_expr() {
-    let dialects = all_dialects_where(|d| d.supports_methods());
-    let expr = dialects
-        .verified_expr("LEFT('abc', 1).value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)')");
+    let expr =
+        verified_expr("LEFT('abc', 1).value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)')");
     match expr {
-        Expr::Method(Method { expr, method_chain }) => {
-            assert!(matches!(*expr, Expr::Function(_)));
+        Expr::CompoundFieldAccess { root, access_chain } => {
+            assert!(matches!(*root, Expr::Function(_)));
             assert!(matches!(
-                method_chain[..],
-                [Function { .. }, Function { .. }]
+                access_chain[..],
+                [
+                    AccessExpr::Dot(Expr::Function(_)),
+                    AccessExpr::Dot(Expr::Function(_))
+                ]
             ));
         }
         _ => unreachable!(),
     }
-    let expr = dialects.verified_expr(
+
+    let expr = verified_expr(
         "(SELECT ',' + name FROM sys.objects FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')",
     );
     match expr {
-        Expr::Method(Method { expr, method_chain }) => {
-            assert!(matches!(*expr, Expr::Subquery(_)));
-            assert!(matches!(method_chain[..], [Function { .. }]));
+        Expr::CompoundFieldAccess { root, access_chain } => {
+            assert!(matches!(*root, Expr::Subquery(_)));
+            assert!(matches!(
+                access_chain[..],
+                [AccessExpr::Dot(Expr::Function(_))]
+            ));
         }
         _ => unreachable!(),
     }
-    let expr = dialects.verified_expr("CAST(column AS XML).value('.', 'NVARCHAR(MAX)')");
+    let expr = verified_expr("CAST(column AS XML).value('.', 'NVARCHAR(MAX)')");
     match expr {
-        Expr::Method(Method { expr, method_chain }) => {
-            assert!(matches!(*expr, Expr::Cast { .. }));
-            assert!(matches!(method_chain[..], [Function { .. }]));
+        Expr::CompoundFieldAccess { root, access_chain } => {
+            assert!(matches!(*root, Expr::Cast { .. }));
+            assert!(matches!(
+                access_chain[..],
+                [AccessExpr::Dot(Expr::Function(_))]
+            ));
         }
         _ => unreachable!(),
     }
 
     // `CONVERT` support
-    let dialects = all_dialects_where(|d| {
-        d.supports_methods() && d.supports_try_convert() && d.convert_type_before_value()
-    });
+    let dialects =
+        all_dialects_where(|d| d.supports_try_convert() && d.convert_type_before_value());
     let expr = dialects.verified_expr(
         "CONVERT(XML, '<Book>abc</Book>').value('.', 'NVARCHAR(MAX)').value('.', 'NVARCHAR(MAX)')",
     );
     match expr {
-        Expr::Method(Method { expr, method_chain }) => {
-            assert!(matches!(*expr, Expr::Convert { .. }));
+        Expr::CompoundFieldAccess { root, access_chain } => {
+            assert!(matches!(*root, Expr::Convert { .. }));
             assert!(matches!(
-                method_chain[..],
-                [Function { .. }, Function { .. }]
+                access_chain[..],
+                [
+                    AccessExpr::Dot(Expr::Function(_)),
+                    AccessExpr::Dot(Expr::Function(_))
+                ]
             ));
         }
         _ => unreachable!(),
@@ -11718,7 +13933,7 @@ fn parse_load_data() {
             assert_eq!("/local/path/to/data.txt", inpath);
             assert_eq!(false, overwrite);
             assert_eq!(
-                ObjectName(vec![Ident::new("test"), Ident::new("my_table")]),
+                ObjectName::from(vec![Ident::new("test"), Ident::new("my_table")]),
                 table_name
             );
             assert_eq!(None, partitioned);
@@ -11741,7 +13956,7 @@ fn parse_load_data() {
             assert_eq!(false, local);
             assert_eq!("/local/path/to/data.txt", inpath);
             assert_eq!(true, overwrite);
-            assert_eq!(ObjectName(vec![Ident::new("my_table")]), table_name);
+            assert_eq!(ObjectName::from(vec![Ident::new("my_table")]), table_name);
             assert_eq!(None, partitioned);
             assert_eq!(None, table_format);
         }
@@ -11778,7 +13993,7 @@ fn parse_load_data() {
             assert_eq!("/local/path/to/data.txt", inpath);
             assert_eq!(false, overwrite);
             assert_eq!(
-                ObjectName(vec![Ident::new("test"), Ident::new("my_table")]),
+                ObjectName::from(vec![Ident::new("test"), Ident::new("my_table")]),
                 table_name
             );
             assert_eq!(None, partitioned);
@@ -11816,18 +14031,22 @@ fn parse_load_data() {
             assert_eq!(true, local);
             assert_eq!("/local/path/to/data.txt", inpath);
             assert_eq!(false, overwrite);
-            assert_eq!(ObjectName(vec![Ident::new("my_table")]), table_name);
+            assert_eq!(ObjectName::from(vec![Ident::new("my_table")]), table_name);
             assert_eq!(
                 Some(vec![
                     Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("year"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("2024".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("2024".parse().unwrap(), false)).with_empty_span()
+                        )),
                     },
                     Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("month"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("11".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("11".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }
                 ]),
                 partitioned
@@ -11852,7 +14071,7 @@ fn parse_load_data() {
             assert_eq!("/local/path/to/data.txt", inpath);
             assert_eq!(true, overwrite);
             assert_eq!(
-                ObjectName(vec![Ident::new("good"), Ident::new("my_table")]),
+                ObjectName::from(vec![Ident::new("good"), Ident::new("my_table")]),
                 table_name
             );
             assert_eq!(
@@ -11860,24 +14079,34 @@ fn parse_load_data() {
                     Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("year"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("2024".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("2024".parse().unwrap(), false)).with_empty_span()
+                        )),
                     },
                     Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("month"))),
                         op: BinaryOperator::Eq,
-                        right: Box::new(Expr::Value(Value::Number("11".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("11".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }
                 ]),
                 partitioned
             );
             assert_eq!(
                 Some(HiveLoadDataFormat {
-                    serde: Expr::Value(Value::SingleQuotedString(
-                        "org.apache.hadoop.hive.serde2.OpenCSVSerde".to_string()
-                    )),
-                    input_format: Expr::Value(Value::SingleQuotedString(
-                        "org.apache.hadoop.mapred.TextInputFormat".to_string()
-                    ))
+                    serde: Expr::Value(
+                        (Value::SingleQuotedString(
+                            "org.apache.hadoop.hive.serde2.OpenCSVSerde".to_string()
+                        ))
+                        .with_empty_span()
+                    ),
+                    input_format: Expr::Value(
+                        (Value::SingleQuotedString(
+                            "org.apache.hadoop.mapred.TextInputFormat".to_string()
+                        ))
+                        .with_empty_span()
+                    )
                 }),
                 table_format
             );
@@ -11924,7 +14153,8 @@ fn test_load_extension() {
             assert_eq!(
                 Ident {
                     value: "filename".to_string(),
-                    quote_style: Some('\'')
+                    quote_style: Some('\''),
+                    span: Span::empty(),
                 },
                 extension_name
             );
@@ -11954,7 +14184,9 @@ fn parse_bang_not() {
         Box::new(Expr::Nested(Box::new(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("b"))),
             op: BinaryOperator::Gt,
-            right: Box::new(Expr::Value(Value::Number("3".parse().unwrap(), false))),
+            right: Box::new(Expr::Value(
+                Value::Number("3".parse().unwrap(), false).with_empty_span(),
+            )),
         }))),
     ]
     .into_iter()
@@ -12161,3 +14393,2198 @@ fn parse_create_table_select() {
         );
     }
 }
+
+#[test]
+fn test_reserved_keywords_for_identifiers() {
+    let dialects = all_dialects_where(|d| d.is_reserved_for_identifier(Keyword::INTERVAL));
+    // Dialects that reserve the word INTERVAL will not allow it as an unquoted identifier
+    let sql = "SELECT MAX(interval) FROM tbl";
+    assert_eq!(
+        dialects.parse_sql_statements(sql),
+        Err(ParserError::ParserError(
+            "Expected: an expression, found: )".to_string()
+        ))
+    );
+
+    // Dialects that do not reserve the word INTERVAL will allow it
+    let dialects = all_dialects_where(|d| !d.is_reserved_for_identifier(Keyword::INTERVAL));
+    let sql = "SELECT MAX(interval) FROM tbl";
+    dialects.parse_sql_statements(sql).unwrap();
+}
+
+#[test]
+fn parse_create_table_with_bit_types() {
+    let sql = "CREATE TABLE t (a BIT, b BIT VARYING, c BIT(42), d BIT VARYING(43))";
+    match verified_stmt(sql) {
+        Statement::CreateTable(CreateTable { columns, .. }) => {
+            assert_eq!(columns.len(), 4);
+            assert_eq!(columns[0].data_type, DataType::Bit(None));
+            assert_eq!(columns[0].to_string(), "a BIT");
+            assert_eq!(columns[1].data_type, DataType::BitVarying(None));
+            assert_eq!(columns[1].to_string(), "b BIT VARYING");
+            assert_eq!(columns[2].data_type, DataType::Bit(Some(42)));
+            assert_eq!(columns[2].to_string(), "c BIT(42)");
+            assert_eq!(columns[3].data_type, DataType::BitVarying(Some(43)));
+            assert_eq!(columns[3].to_string(), "d BIT VARYING(43)");
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_composite_access_expr() {
+    assert_eq!(
+        verified_expr("f(a).b"),
+        Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Function(Function {
+                name: ObjectName::from(vec![Ident::new("f")]),
+                uses_odbc_syntax: false,
+                parameters: FunctionArguments::None,
+                args: FunctionArguments::List(FunctionArgumentList {
+                    duplicate_treatment: None,
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
+                        Expr::Identifier(Ident::new("a"))
+                    ))],
+                    clauses: vec![],
+                }),
+                null_treatment: None,
+                filter: None,
+                over: None,
+                within_group: vec![]
+            })),
+            access_chain: vec![AccessExpr::Dot(Expr::Identifier(Ident::new("b")))]
+        }
+    );
+
+    // Nested Composite Access
+    assert_eq!(
+        verified_expr("f(a).b.c"),
+        Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Function(Function {
+                name: ObjectName::from(vec![Ident::new("f")]),
+                uses_odbc_syntax: false,
+                parameters: FunctionArguments::None,
+                args: FunctionArguments::List(FunctionArgumentList {
+                    duplicate_treatment: None,
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
+                        Expr::Identifier(Ident::new("a"))
+                    ))],
+                    clauses: vec![],
+                }),
+                null_treatment: None,
+                filter: None,
+                over: None,
+                within_group: vec![]
+            })),
+            access_chain: vec![
+                AccessExpr::Dot(Expr::Identifier(Ident::new("b"))),
+                AccessExpr::Dot(Expr::Identifier(Ident::new("c"))),
+            ]
+        }
+    );
+
+    // Composite Access in Select and Where Clauses
+    let stmt = verified_only_select("SELECT f(a).b FROM t WHERE f(a).b IS NOT NULL");
+    let expr = Expr::CompoundFieldAccess {
+        root: Box::new(Expr::Function(Function {
+            name: ObjectName::from(vec![Ident::new("f")]),
+            uses_odbc_syntax: false,
+            parameters: FunctionArguments::None,
+            args: FunctionArguments::List(FunctionArgumentList {
+                duplicate_treatment: None,
+                args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
+                    Expr::Identifier(Ident::new("a")),
+                ))],
+                clauses: vec![],
+            }),
+            null_treatment: None,
+            filter: None,
+            over: None,
+            within_group: vec![],
+        })),
+        access_chain: vec![AccessExpr::Dot(Expr::Identifier(Ident::new("b")))],
+    };
+
+    assert_eq!(stmt.projection[0], SelectItem::UnnamedExpr(expr.clone()));
+    assert_eq!(stmt.selection.unwrap(), Expr::IsNotNull(Box::new(expr)));
+
+    // Compound access with quoted identifier.
+    all_dialects_where(|d| d.is_delimited_identifier_start('"'))
+        .verified_only_select("SELECT f(a).\"an id\"");
+
+    // Composite Access in struct literal
+    all_dialects_where(|d| d.supports_struct_literal()).verified_stmt(
+        "SELECT * FROM t WHERE STRUCT(STRUCT(1 AS a, NULL AS b) AS c, NULL AS d).c.a IS NOT NULL",
+    );
+    let support_struct = all_dialects_where(|d| d.supports_struct_literal());
+    let stmt = support_struct
+        .verified_only_select("SELECT STRUCT(STRUCT(1 AS a, NULL AS b) AS c, NULL AS d).c.a");
+    let expected = SelectItem::UnnamedExpr(Expr::CompoundFieldAccess {
+        root: Box::new(Expr::Struct {
+            values: vec![
+                Expr::Named {
+                    name: Ident::new("c"),
+                    expr: Box::new(Expr::Struct {
+                        values: vec![
+                            Expr::Named {
+                                name: Ident::new("a"),
+                                expr: Box::new(Expr::Value(
+                                    (Number("1".parse().unwrap(), false)).with_empty_span(),
+                                )),
+                            },
+                            Expr::Named {
+                                name: Ident::new("b"),
+                                expr: Box::new(Expr::Value((Value::Null).with_empty_span())),
+                            },
+                        ],
+                        fields: vec![],
+                    }),
+                },
+                Expr::Named {
+                    name: Ident::new("d"),
+                    expr: Box::new(Expr::Value((Value::Null).with_empty_span())),
+                },
+            ],
+            fields: vec![],
+        }),
+        access_chain: vec![
+            AccessExpr::Dot(Expr::Identifier(Ident::new("c"))),
+            AccessExpr::Dot(Expr::Identifier(Ident::new("a"))),
+        ],
+    });
+    assert_eq!(stmt.projection[0], expected);
+}
+
+#[test]
+fn parse_create_table_with_enum_types() {
+    let sql = "CREATE TABLE t0 (foo ENUM8('a' = 1, 'b' = 2), bar ENUM16('a' = 1, 'b' = 2), baz ENUM('a', 'b'))";
+    match all_dialects().verified_stmt(sql) {
+        Statement::CreateTable(CreateTable { name, columns, .. }) => {
+            assert_eq!(name.to_string(), "t0");
+            assert_eq!(
+                vec![
+                    ColumnDef {
+                        name: Ident::new("foo"),
+                        data_type: DataType::Enum(
+                            vec![
+                                EnumMember::NamedValue(
+                                    "a".to_string(),
+                                    Expr::Value(
+                                        (Number("1".parse().unwrap(), false)).with_empty_span()
+                                    )
+                                ),
+                                EnumMember::NamedValue(
+                                    "b".to_string(),
+                                    Expr::Value(
+                                        (Number("2".parse().unwrap(), false)).with_empty_span()
+                                    )
+                                )
+                            ],
+                            Some(8)
+                        ),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("bar"),
+                        data_type: DataType::Enum(
+                            vec![
+                                EnumMember::NamedValue(
+                                    "a".to_string(),
+                                    Expr::Value(
+                                        (Number("1".parse().unwrap(), false)).with_empty_span()
+                                    )
+                                ),
+                                EnumMember::NamedValue(
+                                    "b".to_string(),
+                                    Expr::Value(
+                                        (Number("2".parse().unwrap(), false)).with_empty_span()
+                                    )
+                                )
+                            ],
+                            Some(16)
+                        ),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("baz"),
+                        data_type: DataType::Enum(
+                            vec![
+                                EnumMember::Name("a".to_string()),
+                                EnumMember::Name("b".to_string())
+                            ],
+                            None
+                        ),
+                        options: vec![],
+                    }
+                ],
+                columns
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // invalid case missing value for enum pair
+    assert_eq!(
+        all_dialects()
+            .parse_sql_statements("CREATE TABLE t0 (foo ENUM8('a' = 1, 'b' = ))")
+            .unwrap_err(),
+        ParserError::ParserError("Expected: a value, found: )".to_string())
+    );
+
+    // invalid case that name is not a string
+    assert_eq!(
+        all_dialects()
+            .parse_sql_statements("CREATE TABLE t0 (foo ENUM8('a' = 1, 2))")
+            .unwrap_err(),
+        ParserError::ParserError("Expected: literal string, found: 2".to_string())
+    );
+}
+
+#[test]
+fn test_table_sample() {
+    let dialects = all_dialects_where(|d| d.supports_table_sample_before_alias());
+    dialects.verified_stmt("SELECT * FROM tbl TABLESAMPLE (50) AS t");
+    dialects.verified_stmt("SELECT * FROM tbl TABLESAMPLE (50 ROWS) AS t");
+    dialects.verified_stmt("SELECT * FROM tbl TABLESAMPLE (50 PERCENT) AS t");
+
+    let dialects = all_dialects_where(|d| !d.supports_table_sample_before_alias());
+    dialects.verified_stmt("SELECT * FROM tbl AS t TABLESAMPLE BERNOULLI (50)");
+    dialects.verified_stmt("SELECT * FROM tbl AS t TABLESAMPLE SYSTEM (50)");
+    dialects.verified_stmt("SELECT * FROM tbl AS t TABLESAMPLE SYSTEM (50) REPEATABLE (10)");
+}
+
+#[test]
+fn overflow() {
+    let expr = std::iter::repeat_n("1", 1000)
+        .collect::<Vec<_>>()
+        .join(" + ");
+    let sql = format!("SELECT {expr}");
+
+    let mut statements = Parser::parse_sql(&GenericDialect {}, sql.as_str()).unwrap();
+    let statement = statements.pop().unwrap();
+    assert_eq!(statement.to_string(), sql);
+}
+#[test]
+fn parse_select_without_projection() {
+    let dialects = all_dialects_where(|d| d.supports_empty_projections());
+    dialects.verified_stmt("SELECT FROM users");
+}
+
+#[test]
+fn parse_update_from_before_select() {
+    verified_stmt("UPDATE t1 FROM (SELECT name, id FROM t1 GROUP BY id) AS t2 SET name = t2.name WHERE t1.id = t2.id");
+    verified_stmt("UPDATE t1 FROM U, (SELECT id FROM V) AS W SET a = b WHERE 1 = 1");
+
+    let query =
+    "UPDATE t1 FROM (SELECT name, id FROM t1 GROUP BY id) AS t2 SET name = t2.name FROM (SELECT name from t2) AS t2";
+    assert_eq!(
+        ParserError::ParserError("Expected: end of statement, found: FROM".to_string()),
+        parse_sql_statements(query).unwrap_err()
+    );
+}
+#[test]
+fn parse_overlaps() {
+    verified_stmt("SELECT (DATE '2016-01-10', DATE '2016-02-01') OVERLAPS (DATE '2016-01-20', DATE '2016-02-10')");
+}
+
+#[test]
+fn parse_column_definition_trailing_commas() {
+    let dialects = all_dialects_where(|d| d.supports_column_definition_trailing_commas());
+
+    dialects.one_statement_parses_to("CREATE TABLE T (x INT64,)", "CREATE TABLE T (x INT64)");
+    dialects.one_statement_parses_to(
+        "CREATE TABLE T (x INT64, y INT64, )",
+        "CREATE TABLE T (x INT64, y INT64)",
+    );
+    dialects.one_statement_parses_to(
+        "CREATE VIEW T (x, y, ) AS SELECT 1",
+        "CREATE VIEW T (x, y) AS SELECT 1",
+    );
+
+    let unsupported_dialects = all_dialects_where(|d| {
+        !d.supports_projection_trailing_commas() && !d.supports_trailing_commas()
+    });
+    assert_eq!(
+        unsupported_dialects
+            .parse_sql_statements("CREATE TABLE employees (name text, age int,)")
+            .unwrap_err(),
+        ParserError::ParserError(
+            "Expected: column name or constraint definition, found: )".to_string()
+        ),
+    );
+}
+
+#[test]
+fn test_trailing_commas_in_from() {
+    let dialects = all_dialects_where(|d| d.supports_from_trailing_commas());
+    dialects.verified_only_select_with_canonical("SELECT 1, 2 FROM t,", "SELECT 1, 2 FROM t");
+
+    dialects
+        .verified_only_select_with_canonical("SELECT 1, 2 FROM t1, t2,", "SELECT 1, 2 FROM t1, t2");
+
+    let sql = "SELECT a, FROM b, LIMIT 1";
+    let _ = dialects.parse_sql_statements(sql).unwrap();
+
+    let sql = "INSERT INTO a SELECT b FROM c,";
+    let _ = dialects.parse_sql_statements(sql).unwrap();
+
+    let sql = "SELECT a FROM b, HAVING COUNT(*) > 1";
+    let _ = dialects.parse_sql_statements(sql).unwrap();
+
+    let sql = "SELECT a FROM b, WHERE c = 1";
+    let _ = dialects.parse_sql_statements(sql).unwrap();
+
+    // nested
+    let sql = "SELECT 1, 2 FROM (SELECT * FROM t,),";
+    let _ = dialects.parse_sql_statements(sql).unwrap();
+
+    // multiple_subqueries
+    dialects.verified_only_select_with_canonical(
+        "SELECT 1, 2 FROM (SELECT * FROM t1), (SELECT * FROM t2),",
+        "SELECT 1, 2 FROM (SELECT * FROM t1), (SELECT * FROM t2)",
+    );
+}
+
+#[test]
+#[cfg(feature = "visitor")]
+fn test_visit_order() {
+    let sql = "SELECT CASE a WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END";
+    let stmt = verified_stmt(sql);
+    let mut visited = vec![];
+    let _ = sqlparser::ast::visit_expressions(&stmt, |expr| {
+        visited.push(expr.to_string());
+        core::ops::ControlFlow::<()>::Continue(())
+    });
+
+    assert_eq!(
+        visited,
+        [
+            "CASE a WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END",
+            "a",
+            "1",
+            "2",
+            "3",
+            "4",
+            "5"
+        ]
+    );
+}
+
+#[test]
+fn parse_case_statement() {
+    let sql = "CASE 1 WHEN 2 THEN SELECT 1; SELECT 2; ELSE SELECT 3; END CASE";
+    let Statement::Case(stmt) = verified_stmt(sql) else {
+        unreachable!()
+    };
+
+    assert_eq!(Some(Expr::value(number("1"))), stmt.match_expr);
+    assert_eq!(
+        Some(Expr::value(number("2"))),
+        stmt.when_blocks[0].condition
+    );
+    assert_eq!(2, stmt.when_blocks[0].statements().len());
+    assert_eq!(1, stmt.else_block.unwrap().statements().len());
+
+    verified_stmt(concat!(
+        "CASE 1",
+        " WHEN a THEN",
+        " SELECT 1; SELECT 2; SELECT 3;",
+        " WHEN b THEN",
+        " SELECT 4; SELECT 5;",
+        " ELSE",
+        " SELECT 7; SELECT 8;",
+        " END CASE"
+    ));
+    verified_stmt(concat!(
+        "CASE 1",
+        " WHEN a THEN",
+        " SELECT 1; SELECT 2; SELECT 3;",
+        " WHEN b THEN",
+        " SELECT 4; SELECT 5;",
+        " END CASE"
+    ));
+    verified_stmt(concat!(
+        "CASE 1",
+        " WHEN a THEN",
+        " SELECT 1; SELECT 2; SELECT 3;",
+        " END CASE"
+    ));
+    verified_stmt(concat!(
+        "CASE 1",
+        " WHEN a THEN",
+        " SELECT 1; SELECT 2; SELECT 3;",
+        " END"
+    ));
+
+    assert_eq!(
+        ParserError::ParserError("Expected: THEN, found: END".to_string()),
+        parse_sql_statements("CASE 1 WHEN a END").unwrap_err()
+    );
+    assert_eq!(
+        ParserError::ParserError("Expected: WHEN, found: ELSE".to_string()),
+        parse_sql_statements("CASE 1 ELSE SELECT 1; END").unwrap_err()
+    );
+}
+
+#[test]
+fn test_case_statement_span() {
+    let sql = "CASE 1 WHEN 2 THEN SELECT 1; SELECT 2; ELSE SELECT 3; END CASE";
+    let mut parser = Parser::new(&GenericDialect {}).try_with_sql(sql).unwrap();
+    assert_eq!(
+        parser.parse_statement().unwrap().span(),
+        Span::new(Location::new(1, 1), Location::new(1, sql.len() as u64 + 1))
+    );
+}
+
+#[test]
+fn parse_if_statement() {
+    let dialects = all_dialects_except(|d| d.is::<MsSqlDialect>());
+
+    let sql = "IF 1 THEN SELECT 1; ELSEIF 2 THEN SELECT 2; ELSE SELECT 3; END IF";
+    let Statement::If(IfStatement {
+        if_block,
+        elseif_blocks,
+        else_block,
+        ..
+    }) = dialects.verified_stmt(sql)
+    else {
+        unreachable!()
+    };
+    assert_eq!(Some(Expr::value(number("1"))), if_block.condition);
+    assert_eq!(Some(Expr::value(number("2"))), elseif_blocks[0].condition);
+    assert_eq!(1, else_block.unwrap().statements().len());
+
+    dialects.verified_stmt(concat!(
+        "IF 1 THEN",
+        " SELECT 1;",
+        " SELECT 2;",
+        " SELECT 3;",
+        " ELSEIF 2 THEN",
+        " SELECT 4;",
+        " SELECT 5;",
+        " ELSEIF 3 THEN",
+        " SELECT 6;",
+        " SELECT 7;",
+        " ELSE",
+        " SELECT 8;",
+        " SELECT 9;",
+        " END IF"
+    ));
+    dialects.verified_stmt(concat!(
+        "IF 1 THEN",
+        " SELECT 1;",
+        " SELECT 2;",
+        " ELSE",
+        " SELECT 3;",
+        " SELECT 4;",
+        " END IF"
+    ));
+    dialects.verified_stmt(concat!(
+        "IF 1 THEN",
+        " SELECT 1;",
+        " SELECT 2;",
+        " SELECT 3;",
+        " ELSEIF 2 THEN",
+        " SELECT 3;",
+        " SELECT 4;",
+        " END IF"
+    ));
+    dialects.verified_stmt(concat!("IF 1 THEN", " SELECT 1;", " SELECT 2;", " END IF"));
+    dialects.verified_stmt(concat!(
+        "IF (1) THEN",
+        " SELECT 1;",
+        " SELECT 2;",
+        " END IF"
+    ));
+    dialects.verified_stmt("IF 1 THEN END IF");
+    dialects.verified_stmt("IF 1 THEN SELECT 1; ELSEIF 1 THEN END IF");
+
+    assert_eq!(
+        ParserError::ParserError("Expected: IF, found: EOF".to_string()),
+        dialects
+            .parse_sql_statements("IF 1 THEN SELECT 1; ELSEIF 1 THEN SELECT 2; END")
+            .unwrap_err()
+    );
+}
+
+#[test]
+fn test_if_statement_span() {
+    let sql = "IF 1=1 THEN SELECT 1; ELSEIF 1=2 THEN SELECT 2; ELSE SELECT 3; END IF";
+    let mut parser = Parser::new(&GenericDialect {}).try_with_sql(sql).unwrap();
+    assert_eq!(
+        parser.parse_statement().unwrap().span(),
+        Span::new(Location::new(1, 1), Location::new(1, sql.len() as u64 + 1))
+    );
+}
+
+#[test]
+fn test_if_statement_multiline_span() {
+    let sql_line1 = "IF 1 = 1 THEN SELECT 1;";
+    let sql_line2 = "ELSEIF 1 = 2 THEN SELECT 2;";
+    let sql_line3 = "ELSE SELECT 3;";
+    let sql_line4 = "END IF";
+    let sql = [sql_line1, sql_line2, sql_line3, sql_line4].join("\n");
+    let mut parser = Parser::new(&GenericDialect {}).try_with_sql(&sql).unwrap();
+    assert_eq!(
+        parser.parse_statement().unwrap().span(),
+        Span::new(
+            Location::new(1, 1),
+            Location::new(4, sql_line4.len() as u64 + 1)
+        )
+    );
+}
+
+#[test]
+fn test_conditional_statement_span() {
+    let sql = "IF 1=1 THEN SELECT 1; ELSEIF 1=2 THEN SELECT 2; ELSE SELECT 3; END IF";
+    let mut parser = Parser::new(&GenericDialect {}).try_with_sql(sql).unwrap();
+    match parser.parse_statement().unwrap() {
+        Statement::If(IfStatement {
+            if_block,
+            elseif_blocks,
+            else_block,
+            ..
+        }) => {
+            assert_eq!(
+                Span::new(Location::new(1, 1), Location::new(1, 21)),
+                if_block.span()
+            );
+            assert_eq!(
+                Span::new(Location::new(1, 23), Location::new(1, 47)),
+                elseif_blocks[0].span()
+            );
+            assert_eq!(
+                Span::new(Location::new(1, 49), Location::new(1, 62)),
+                else_block.unwrap().span()
+            );
+        }
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+}
+
+#[test]
+fn parse_raise_statement() {
+    let sql = "RAISE USING MESSAGE = 42";
+    let Statement::Raise(stmt) = verified_stmt(sql) else {
+        unreachable!()
+    };
+    assert_eq!(
+        Some(RaiseStatementValue::UsingMessage(Expr::value(number("42")))),
+        stmt.value
+    );
+
+    verified_stmt("RAISE USING MESSAGE = 'error'");
+    verified_stmt("RAISE myerror");
+    verified_stmt("RAISE 42");
+    verified_stmt("RAISE using");
+    verified_stmt("RAISE");
+
+    assert_eq!(
+        ParserError::ParserError("Expected: =, found: error".to_string()),
+        parse_sql_statements("RAISE USING MESSAGE error").unwrap_err()
+    );
+}
+
+#[test]
+fn test_lambdas() {
+    let dialects = all_dialects_where(|d| d.supports_lambda_functions());
+
+    #[rustfmt::skip]
+    let sql = concat!(
+        "SELECT array_sort(array('Hello', 'World'), ",
+            "(p1, p2) -> CASE WHEN p1 = p2 THEN 0 ",
+                        "WHEN reverse(p1) < reverse(p2) THEN -1 ",
+                        "ELSE 1 END)",
+    );
+    pretty_assertions::assert_eq!(
+        SelectItem::UnnamedExpr(call(
+            "array_sort",
+            [
+                call(
+                    "array",
+                    [
+                        Expr::Value(
+                            (Value::SingleQuotedString("Hello".to_owned())).with_empty_span()
+                        ),
+                        Expr::Value(
+                            (Value::SingleQuotedString("World".to_owned())).with_empty_span()
+                        )
+                    ]
+                ),
+                Expr::Lambda(LambdaFunction {
+                    params: OneOrManyWithParens::Many(vec![Ident::new("p1"), Ident::new("p2")]),
+                    body: Box::new(Expr::Case {
+                        case_token: AttachedToken::empty(),
+                        end_token: AttachedToken::empty(),
+                        operand: None,
+                        conditions: vec![
+                            CaseWhen {
+                                condition: Expr::BinaryOp {
+                                    left: Box::new(Expr::Identifier(Ident::new("p1"))),
+                                    op: BinaryOperator::Eq,
+                                    right: Box::new(Expr::Identifier(Ident::new("p2")))
+                                },
+                                result: Expr::value(number("0")),
+                            },
+                            CaseWhen {
+                                condition: Expr::BinaryOp {
+                                    left: Box::new(call(
+                                        "reverse",
+                                        [Expr::Identifier(Ident::new("p1"))]
+                                    )),
+                                    op: BinaryOperator::Lt,
+                                    right: Box::new(call(
+                                        "reverse",
+                                        [Expr::Identifier(Ident::new("p2"))]
+                                    )),
+                                },
+                                result: Expr::UnaryOp {
+                                    op: UnaryOperator::Minus,
+                                    expr: Box::new(Expr::value(number("1")))
+                                }
+                            },
+                        ],
+                        else_result: Some(Box::new(Expr::value(number("1")))),
+                    })
+                })
+            ]
+        )),
+        dialects.verified_only_select(sql).projection[0]
+    );
+
+    dialects.verified_expr(
+        "map_zip_with(map(1, 'a', 2, 'b'), map(1, 'x', 2, 'y'), (k, v1, v2) -> concat(v1, v2))",
+    );
+    dialects.verified_expr("transform(array(1, 2, 3), x -> x + 1)");
+}
+
+#[test]
+fn test_select_from_first() {
+    let dialects = all_dialects_where(|d| d.supports_from_first_select());
+    let q1 = "FROM capitals";
+    let q2 = "FROM capitals SELECT *";
+
+    for (q, flavor, projection) in [
+        (q1, SelectFlavor::FromFirstNoSelect, vec![]),
+        (
+            q2,
+            SelectFlavor::FromFirst,
+            vec![SelectItem::Wildcard(WildcardAdditionalOptions::default())],
+        ),
+    ] {
+        let ast = dialects.verified_query(q);
+        let expected = Query {
+            with: None,
+            body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
+                distinct: None,
+                top: None,
+                projection,
+                exclude: None,
+                top_before_distinct: false,
+                into: None,
+                from: vec![TableWithJoins {
+                    relation: table_from_name(ObjectName::from(vec![Ident {
+                        value: "capitals".to_string(),
+                        quote_style: None,
+                        span: Span::empty(),
+                    }])),
+                    joins: vec![],
+                }],
+                lateral_views: vec![],
+                prewhere: None,
+                selection: None,
+                group_by: GroupByExpr::Expressions(vec![], vec![]),
+                cluster_by: vec![],
+                distribute_by: vec![],
+                sort_by: vec![],
+                having: None,
+                named_window: vec![],
+                window_before_qualify: false,
+                qualify: None,
+                value_table_mode: None,
+                connect_by: None,
+                flavor,
+            }))),
+            order_by: None,
+            limit_clause: None,
+            fetch: None,
+            locks: vec![],
+            for_clause: None,
+            settings: None,
+            format_clause: None,
+            pipe_operators: vec![],
+        };
+        assert_eq!(expected, ast);
+        assert_eq!(ast.to_string(), q);
+    }
+}
+
+#[test]
+fn test_geometric_unary_operators() {
+    // Number of points in path or polygon
+    let sql = "# path '((1,0),(0,1),(-1,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::UnaryOp {
+            op: UnaryOperator::Hash,
+            ..
+        }
+    ));
+
+    // Length or circumference
+    let sql = "@-@ path '((0,0),(1,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::UnaryOp {
+            op: UnaryOperator::AtDashAt,
+            ..
+        }
+    ));
+
+    // Center
+    let sql = "@@ circle '((0,0),10)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::UnaryOp {
+            op: UnaryOperator::DoubleAt,
+            ..
+        }
+    ));
+    // Is horizontal?
+    let sql = "?- lseg '((-1,0),(1,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::UnaryOp {
+            op: UnaryOperator::QuestionDash,
+            ..
+        }
+    ));
+
+    // Is vertical?
+    let sql = "?| lseg '((-1,0),(1,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::UnaryOp {
+            op: UnaryOperator::QuestionPipe,
+            ..
+        }
+    ));
+}
+
+#[test]
+fn test_geometry_type() {
+    let sql = "point '1,2'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::Point),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+
+    let sql = "line '1,2,3,4'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::Line),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3,4".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+
+    let sql = "path '1,2,3,4'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::GeometricPath),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3,4".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+    let sql = "box '1,2,3,4'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::GeometricBox),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3,4".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+
+    let sql = "circle '1,2,3'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::Circle),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+
+    let sql = "polygon '1,2,3,4'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::Polygon),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3,4".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+    let sql = "lseg '1,2,3,4'";
+    assert_eq!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::TypedString(TypedString {
+            data_type: DataType::GeometricType(GeometricTypeKind::LineSegment),
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("1,2,3,4".to_string()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+}
+#[test]
+fn test_geometric_binary_operators() {
+    // Translation plus
+    let sql = "box '((0,0),(1,1))' + point '(2.0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::Plus,
+            ..
+        }
+    ));
+    // Translation minus
+    let sql = "box '((0,0),(1,1))' - point '(2.0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::Minus,
+            ..
+        }
+    ));
+
+    // Scaling multiply
+    let sql = "box '((0,0),(1,1))' * point '(2.0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::Multiply,
+            ..
+        }
+    ));
+
+    // Scaling divide
+    let sql = "box '((0,0),(1,1))' / point '(2.0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::Divide,
+            ..
+        }
+    ));
+
+    // Intersection
+    let sql = "'((1,-1),(-1,1))' # '((1,1),(-1,-1))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PGBitwiseXor,
+            ..
+        }
+    ));
+
+    //Point of closest proximity
+    let sql = "point '(0,0)' ## lseg '((2,0),(0,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::DoubleHash,
+            ..
+        }
+    ));
+
+    // Point of closest proximity
+    let sql = "box '((0,0),(1,1))' && box '((0,0),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PGOverlap,
+            ..
+        }
+    ));
+
+    // Overlaps to left?
+    let sql = "box '((0,0),(1,1))' &< box '((0,0),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::AndLt,
+            ..
+        }
+    ));
+
+    // Overlaps to right?
+    let sql = "box '((0,0),(3,3))' &> box '((0,0),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::AndGt,
+            ..
+        }
+    ));
+
+    // Distance between
+    let sql = "circle '((0,0),1)' <-> circle '((5,0),1)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::LtDashGt,
+            ..
+        }
+    ));
+
+    // Is left of?
+    let sql = "circle '((0,0),1)' << circle '((5,0),1)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PGBitwiseShiftLeft,
+            ..
+        }
+    ));
+
+    // Is right of?
+    let sql = "circle '((5,0),1)' >> circle '((0,0),1)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PGBitwiseShiftRight,
+            ..
+        }
+    ));
+
+    // Is below?
+    let sql = "circle '((0,0),1)' <^ circle '((0,5),1)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::LtCaret,
+            ..
+        }
+    ));
+
+    // 	Intersects or overlaps
+    let sql = "lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::QuestionHash,
+            ..
+        }
+    ));
+
+    // Is horizontal?
+    let sql = "point '(1,0)' ?- point '(0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::QuestionDash,
+            ..
+        }
+    ));
+
+    // Is perpendicular?
+    let sql = "lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::QuestionDashPipe,
+            ..
+        }
+    ));
+
+    // Is vertical?
+    let sql = "point '(0,1)' ?| point '(0,0)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::QuestionPipe,
+            ..
+        }
+    ));
+
+    // Are parallel?
+    let sql = "lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::QuestionDoublePipe,
+            ..
+        }
+    ));
+
+    // Contained or on?
+    let sql = "point '(1,1)' @ circle '((0,0),2)'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::At,
+            ..
+        }
+    ));
+
+    //
+    // Same as?
+    let sql = "polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::TildeEq,
+            ..
+        }
+    ));
+
+    // Is strictly below?
+    let sql = "box '((0,0),(3,3))' <<| box '((3,4),(5,5))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::LtLtPipe,
+            ..
+        }
+    ));
+
+    // Is strictly above?
+    let sql = "box '((3,4),(5,5))' |>> box '((0,0),(3,3))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PipeGtGt,
+            ..
+        }
+    ));
+
+    // Does not extend above?
+    let sql = "box '((0,0),(1,1))' &<| box '((0,0),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::AndLtPipe,
+            ..
+        }
+    ));
+
+    // Does not extend below?
+    let sql = "box '((0,0),(3,3))' |&> box '((0,0),(2,2))'";
+    assert!(matches!(
+        all_dialects_where(|d| d.supports_geometric_types()).verified_expr(sql),
+        Expr::BinaryOp {
+            op: BinaryOperator::PipeAndGt,
+            ..
+        }
+    ));
+}
+
+#[test]
+fn parse_array_type_def_with_brackets() {
+    let dialects = all_dialects_where(|d| d.supports_array_typedef_with_brackets());
+    dialects.verified_stmt("SELECT x::INT[]");
+    dialects.verified_stmt("SELECT STRING_TO_ARRAY('1,2,3', ',')::INT[3]");
+}
+
+#[test]
+fn parse_set_names() {
+    let dialects = all_dialects_where(|d| d.supports_set_names());
+    dialects.verified_stmt("SET NAMES 'UTF8'");
+    dialects.verified_stmt("SET NAMES 'utf8'");
+    dialects.verified_stmt("SET NAMES UTF8 COLLATE bogus");
+}
+
+#[test]
+fn parse_pipeline_operator() {
+    let dialects = all_dialects_where(|d| d.supports_pipe_operator());
+
+    // select pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> SELECT id");
+    dialects.verified_stmt("SELECT * FROM users |> SELECT id, name");
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> SELECT id user_id",
+        "SELECT * FROM users |> SELECT id AS user_id",
+    );
+    dialects.verified_stmt("SELECT * FROM users |> SELECT id AS user_id");
+
+    // extend pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> EXTEND id + 1 AS new_id");
+    dialects.verified_stmt("SELECT * FROM users |> EXTEND id AS new_id, name AS new_name");
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> EXTEND id user_id",
+        "SELECT * FROM users |> EXTEND id AS user_id",
+    );
+
+    // set pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> SET id = id + 1");
+    dialects.verified_stmt("SELECT * FROM users |> SET id = id + 1, name = name + ' Doe'");
+
+    // drop pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> DROP id");
+    dialects.verified_stmt("SELECT * FROM users |> DROP id, name");
+
+    // as pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> AS new_users");
+
+    // limit pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> LIMIT 10");
+    dialects.verified_stmt("SELECT * FROM users |> LIMIT 10 OFFSET 5");
+    dialects.verified_stmt("SELECT * FROM users |> LIMIT 10 |> LIMIT 5");
+    dialects.verified_stmt("SELECT * FROM users |> LIMIT 10 |> WHERE true");
+
+    // where pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> WHERE id = 1");
+    dialects.verified_stmt("SELECT * FROM users |> WHERE id = 1 AND name = 'John'");
+    dialects.verified_stmt("SELECT * FROM users |> WHERE id = 1 OR name = 'John'");
+
+    // aggregate pipe operator full table
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE COUNT(*)");
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> AGGREGATE COUNT(*) total_users",
+        "SELECT * FROM users |> AGGREGATE COUNT(*) AS total_users",
+    );
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE COUNT(*) AS total_users");
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE COUNT(*), MIN(id)");
+
+    // aggregate pipe opeprator with grouping
+    dialects.verified_stmt(
+        "SELECT * FROM users |> AGGREGATE SUM(o_totalprice) AS price, COUNT(*) AS cnt GROUP BY EXTRACT(YEAR FROM o_orderdate) AS year",
+    );
+    dialects.verified_stmt(
+        "SELECT * FROM users |> AGGREGATE GROUP BY EXTRACT(YEAR FROM o_orderdate) AS year",
+    );
+    dialects
+        .verified_stmt("SELECT * FROM users |> AGGREGATE GROUP BY EXTRACT(YEAR FROM o_orderdate)");
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE GROUP BY a, b");
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE SUM(c) GROUP BY a, b");
+    dialects.verified_stmt("SELECT * FROM users |> AGGREGATE SUM(c) ASC");
+
+    // order by pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> ORDER BY id ASC");
+    dialects.verified_stmt("SELECT * FROM users |> ORDER BY id DESC");
+    dialects.verified_stmt("SELECT * FROM users |> ORDER BY id DESC, name ASC");
+
+    // tablesample pipe operator
+    dialects.verified_stmt("SELECT * FROM tbl |> TABLESAMPLE BERNOULLI (50)");
+    dialects.verified_stmt("SELECT * FROM tbl |> TABLESAMPLE SYSTEM (50 PERCENT)");
+    dialects.verified_stmt("SELECT * FROM tbl |> TABLESAMPLE SYSTEM (50) REPEATABLE (10)");
+
+    // rename pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> RENAME old_name AS new_name");
+    dialects.verified_stmt("SELECT * FROM users |> RENAME id AS user_id, name AS user_name");
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> RENAME id user_id",
+        "SELECT * FROM users |> RENAME id AS user_id",
+    );
+
+    // union pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> UNION ALL (SELECT * FROM admins)");
+    dialects.verified_stmt("SELECT * FROM users |> UNION DISTINCT (SELECT * FROM admins)");
+    dialects.verified_stmt("SELECT * FROM users |> UNION (SELECT * FROM admins)");
+
+    // union pipe operator with multiple queries
+    dialects.verified_stmt(
+        "SELECT * FROM users |> UNION ALL (SELECT * FROM admins), (SELECT * FROM guests)",
+    );
+    dialects.verified_stmt("SELECT * FROM users |> UNION DISTINCT (SELECT * FROM admins), (SELECT * FROM guests), (SELECT * FROM employees)");
+    dialects.verified_stmt(
+        "SELECT * FROM users |> UNION (SELECT * FROM admins), (SELECT * FROM guests)",
+    );
+
+    // union pipe operator with BY NAME modifier
+    dialects.verified_stmt("SELECT * FROM users |> UNION BY NAME (SELECT * FROM admins)");
+    dialects.verified_stmt("SELECT * FROM users |> UNION ALL BY NAME (SELECT * FROM admins)");
+    dialects.verified_stmt("SELECT * FROM users |> UNION DISTINCT BY NAME (SELECT * FROM admins)");
+
+    // union pipe operator with BY NAME and multiple queries
+    dialects.verified_stmt(
+        "SELECT * FROM users |> UNION BY NAME (SELECT * FROM admins), (SELECT * FROM guests)",
+    );
+
+    // intersect pipe operator (BigQuery requires DISTINCT modifier for INTERSECT)
+    dialects.verified_stmt("SELECT * FROM users |> INTERSECT DISTINCT (SELECT * FROM admins)");
+
+    // intersect pipe operator with BY NAME modifier
+    dialects
+        .verified_stmt("SELECT * FROM users |> INTERSECT DISTINCT BY NAME (SELECT * FROM admins)");
+
+    // intersect pipe operator with multiple queries
+    dialects.verified_stmt(
+        "SELECT * FROM users |> INTERSECT DISTINCT (SELECT * FROM admins), (SELECT * FROM guests)",
+    );
+
+    // intersect pipe operator with BY NAME and multiple queries
+    dialects.verified_stmt("SELECT * FROM users |> INTERSECT DISTINCT BY NAME (SELECT * FROM admins), (SELECT * FROM guests)");
+
+    // except pipe operator (BigQuery requires DISTINCT modifier for EXCEPT)
+    dialects.verified_stmt("SELECT * FROM users |> EXCEPT DISTINCT (SELECT * FROM admins)");
+
+    // except pipe operator with BY NAME modifier
+    dialects.verified_stmt("SELECT * FROM users |> EXCEPT DISTINCT BY NAME (SELECT * FROM admins)");
+
+    // except pipe operator with multiple queries
+    dialects.verified_stmt(
+        "SELECT * FROM users |> EXCEPT DISTINCT (SELECT * FROM admins), (SELECT * FROM guests)",
+    );
+
+    // except pipe operator with BY NAME and multiple queries
+    dialects.verified_stmt("SELECT * FROM users |> EXCEPT DISTINCT BY NAME (SELECT * FROM admins), (SELECT * FROM guests)");
+
+    // call pipe operator
+    dialects.verified_stmt("SELECT * FROM users |> CALL my_function()");
+    dialects.verified_stmt("SELECT * FROM users |> CALL process_data(5, 'test')");
+    dialects.verified_stmt(
+        "SELECT * FROM users |> CALL namespace.function_name(col1, col2, 'literal')",
+    );
+
+    // call pipe operator with complex arguments
+    dialects.verified_stmt("SELECT * FROM users |> CALL transform_data(col1 + col2)");
+    dialects.verified_stmt("SELECT * FROM users |> CALL analyze_data('param1', 100, true)");
+
+    // call pipe operator with aliases
+    dialects.verified_stmt("SELECT * FROM input_table |> CALL tvf1(arg1) AS al");
+    dialects.verified_stmt("SELECT * FROM users |> CALL process_data(5) AS result_table");
+    dialects.verified_stmt("SELECT * FROM users |> CALL namespace.func() AS my_alias");
+
+    // multiple call pipe operators in sequence
+    dialects.verified_stmt("SELECT * FROM input_table |> CALL tvf1(arg1) |> CALL tvf2(arg2, arg3)");
+    dialects.verified_stmt(
+        "SELECT * FROM data |> CALL transform(col1) |> CALL validate() |> CALL process(param)",
+    );
+
+    // multiple call pipe operators with aliases
+    dialects.verified_stmt(
+        "SELECT * FROM input_table |> CALL tvf1(arg1) AS step1 |> CALL tvf2(arg2) AS step2",
+    );
+    dialects.verified_stmt(
+        "SELECT * FROM data |> CALL preprocess() AS clean_data |> CALL analyze(mode) AS results",
+    );
+
+    // call pipe operators mixed with other pipe operators
+    dialects.verified_stmt(
+        "SELECT * FROM users |> CALL transform() |> WHERE status = 'active' |> CALL process(param)",
+    );
+    dialects.verified_stmt(
+        "SELECT * FROM data |> CALL preprocess() AS clean |> SELECT col1, col2 |> CALL validate()",
+    );
+
+    // pivot pipe operator
+    dialects.verified_stmt(
+        "SELECT * FROM monthly_sales |> PIVOT(SUM(amount) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))",
+    );
+    dialects.verified_stmt("SELECT * FROM sales_data |> PIVOT(AVG(revenue) FOR region IN ('North', 'South', 'East', 'West'))");
+
+    // pivot pipe operator with multiple aggregate functions
+    dialects.verified_stmt("SELECT * FROM data |> PIVOT(SUM(sales) AS total_sales, COUNT(*) AS num_transactions FOR month IN ('Jan', 'Feb', 'Mar'))");
+
+    // pivot pipe operator with compound column names
+    dialects.verified_stmt("SELECT * FROM sales |> PIVOT(SUM(amount) FOR product.category IN ('Electronics', 'Clothing'))");
+
+    // pivot pipe operator mixed with other pipe operators
+    dialects.verified_stmt("SELECT * FROM sales_data |> WHERE year = 2023 |> PIVOT(SUM(revenue) FOR quarter IN ('Q1', 'Q2', 'Q3', 'Q4'))");
+
+    // pivot pipe operator with aliases
+    dialects.verified_stmt("SELECT * FROM monthly_sales |> PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2')) AS quarterly_sales");
+    dialects.verified_stmt("SELECT * FROM data |> PIVOT(AVG(price) FOR category IN ('A', 'B', 'C')) AS avg_by_category");
+    dialects.verified_stmt("SELECT * FROM sales |> PIVOT(COUNT(*) AS transactions, SUM(amount) AS total FOR region IN ('North', 'South')) AS regional_summary");
+
+    // pivot pipe operator with implicit aliases (without AS keyword)
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM monthly_sales |> PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2')) quarterly_sales",
+        "SELECT * FROM monthly_sales |> PIVOT(SUM(sales) FOR quarter IN ('Q1', 'Q2')) AS quarterly_sales",
+    );
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM data |> PIVOT(AVG(price) FOR category IN ('A', 'B', 'C')) avg_by_category",
+        "SELECT * FROM data |> PIVOT(AVG(price) FOR category IN ('A', 'B', 'C')) AS avg_by_category",
+    );
+
+    // unpivot pipe operator basic usage
+    dialects
+        .verified_stmt("SELECT * FROM sales |> UNPIVOT(revenue FOR quarter IN (Q1, Q2, Q3, Q4))");
+    dialects.verified_stmt("SELECT * FROM data |> UNPIVOT(value FOR category IN (A, B, C))");
+    dialects.verified_stmt(
+        "SELECT * FROM metrics |> UNPIVOT(measurement FOR metric_type IN (cpu, memory, disk))",
+    );
+
+    // unpivot pipe operator with multiple columns
+    dialects.verified_stmt("SELECT * FROM quarterly_sales |> UNPIVOT(amount FOR period IN (jan, feb, mar, apr, may, jun))");
+    dialects.verified_stmt(
+        "SELECT * FROM report |> UNPIVOT(score FOR subject IN (math, science, english, history))",
+    );
+
+    // unpivot pipe operator mixed with other pipe operators
+    dialects.verified_stmt("SELECT * FROM sales_data |> WHERE year = 2023 |> UNPIVOT(revenue FOR quarter IN (Q1, Q2, Q3, Q4))");
+
+    // unpivot pipe operator with aliases
+    dialects.verified_stmt("SELECT * FROM quarterly_sales |> UNPIVOT(amount FOR period IN (Q1, Q2)) AS unpivoted_sales");
+    dialects.verified_stmt(
+        "SELECT * FROM data |> UNPIVOT(value FOR category IN (A, B, C)) AS transformed_data",
+    );
+    dialects.verified_stmt("SELECT * FROM metrics |> UNPIVOT(measurement FOR metric_type IN (cpu, memory)) AS metric_measurements");
+
+    // unpivot pipe operator with implicit aliases (without AS keyword)
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM quarterly_sales |> UNPIVOT(amount FOR period IN (Q1, Q2)) unpivoted_sales",
+        "SELECT * FROM quarterly_sales |> UNPIVOT(amount FOR period IN (Q1, Q2)) AS unpivoted_sales",
+    );
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM data |> UNPIVOT(value FOR category IN (A, B, C)) transformed_data",
+        "SELECT * FROM data |> UNPIVOT(value FOR category IN (A, B, C)) AS transformed_data",
+    );
+
+    // many pipes
+    dialects.verified_stmt(
+        "SELECT * FROM CustomerOrders |> AGGREGATE SUM(cost) AS total_cost GROUP BY customer_id, state, item_type |> EXTEND COUNT(*) OVER (PARTITION BY customer_id) AS num_orders |> WHERE num_orders > 1 |> AGGREGATE AVG(total_cost) AS average GROUP BY state DESC, item_type ASC",
+    );
+
+    // join pipe operator - INNER JOIN
+    dialects.verified_stmt("SELECT * FROM users |> JOIN orders ON users.id = orders.user_id");
+    dialects.verified_stmt("SELECT * FROM users |> INNER JOIN orders ON users.id = orders.user_id");
+
+    // join pipe operator - LEFT JOIN
+    dialects.verified_stmt("SELECT * FROM users |> LEFT JOIN orders ON users.id = orders.user_id");
+    dialects.verified_stmt(
+        "SELECT * FROM users |> LEFT OUTER JOIN orders ON users.id = orders.user_id",
+    );
+
+    // join pipe operator - RIGHT JOIN
+    dialects.verified_stmt("SELECT * FROM users |> RIGHT JOIN orders ON users.id = orders.user_id");
+    dialects.verified_stmt(
+        "SELECT * FROM users |> RIGHT OUTER JOIN orders ON users.id = orders.user_id",
+    );
+
+    // join pipe operator - FULL JOIN
+    dialects.verified_stmt("SELECT * FROM users |> FULL JOIN orders ON users.id = orders.user_id");
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> FULL OUTER JOIN orders ON users.id = orders.user_id",
+        "SELECT * FROM users |> FULL JOIN orders ON users.id = orders.user_id",
+    );
+
+    // join pipe operator - CROSS JOIN
+    dialects.verified_stmt("SELECT * FROM users |> CROSS JOIN orders");
+
+    // join pipe operator with USING
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> JOIN orders USING (user_id)",
+        "SELECT * FROM users |> JOIN orders USING(user_id)",
+    );
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> LEFT JOIN orders USING (user_id, order_date)",
+        "SELECT * FROM users |> LEFT JOIN orders USING(user_id, order_date)",
+    );
+
+    // join pipe operator with alias
+    dialects.verified_query_with_canonical(
+        "SELECT * FROM users |> JOIN orders o ON users.id = o.user_id",
+        "SELECT * FROM users |> JOIN orders AS o ON users.id = o.user_id",
+    );
+    dialects.verified_stmt("SELECT * FROM users |> LEFT JOIN orders AS o ON users.id = o.user_id");
+
+    // join pipe operator with complex ON condition
+    dialects.verified_stmt("SELECT * FROM users |> JOIN orders ON users.id = orders.user_id AND orders.status = 'active'");
+    dialects.verified_stmt("SELECT * FROM users |> LEFT JOIN orders ON users.id = orders.user_id AND orders.amount > 100");
+
+    // multiple join pipe operators
+    dialects.verified_stmt("SELECT * FROM users |> JOIN orders ON users.id = orders.user_id |> JOIN products ON orders.product_id = products.id");
+    dialects.verified_stmt("SELECT * FROM users |> LEFT JOIN orders ON users.id = orders.user_id |> RIGHT JOIN products ON orders.product_id = products.id");
+
+    // join pipe operator with other pipe operators
+    dialects.verified_stmt("SELECT * FROM users |> JOIN orders ON users.id = orders.user_id |> WHERE orders.amount > 100");
+    dialects.verified_stmt("SELECT * FROM users |> WHERE users.active = true |> LEFT JOIN orders ON users.id = orders.user_id");
+    dialects.verified_stmt("SELECT * FROM users |> JOIN orders ON users.id = orders.user_id |> SELECT users.name, orders.amount");
+}
+
+#[test]
+fn parse_pipeline_operator_negative_tests() {
+    let dialects = all_dialects_where(|d| d.supports_pipe_operator());
+
+    // Test that plain EXCEPT without DISTINCT fails
+    assert_eq!(
+        ParserError::ParserError("EXCEPT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> EXCEPT (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that EXCEPT ALL fails
+    assert_eq!(
+        ParserError::ParserError("EXCEPT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> EXCEPT ALL (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that EXCEPT BY NAME without DISTINCT fails
+    assert_eq!(
+        ParserError::ParserError("EXCEPT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> EXCEPT BY NAME (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that EXCEPT ALL BY NAME fails
+    assert_eq!(
+        ParserError::ParserError("EXCEPT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements(
+                "SELECT * FROM users |> EXCEPT ALL BY NAME (SELECT * FROM admins)"
+            )
+            .unwrap_err()
+    );
+
+    // Test that plain INTERSECT without DISTINCT fails
+    assert_eq!(
+        ParserError::ParserError("INTERSECT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> INTERSECT (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that INTERSECT ALL fails
+    assert_eq!(
+        ParserError::ParserError("INTERSECT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> INTERSECT ALL (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that INTERSECT BY NAME without DISTINCT fails
+    assert_eq!(
+        ParserError::ParserError("INTERSECT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements("SELECT * FROM users |> INTERSECT BY NAME (SELECT * FROM admins)")
+            .unwrap_err()
+    );
+
+    // Test that INTERSECT ALL BY NAME fails
+    assert_eq!(
+        ParserError::ParserError("INTERSECT pipe operator requires DISTINCT modifier".to_string()),
+        dialects
+            .parse_sql_statements(
+                "SELECT * FROM users |> INTERSECT ALL BY NAME (SELECT * FROM admins)"
+            )
+            .unwrap_err()
+    );
+
+    // Test that CALL without function name fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CALL")
+        .is_err());
+
+    // Test that CALL without parentheses fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CALL my_function")
+        .is_err());
+
+    // Test that CALL with invalid function syntax fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CALL 123invalid")
+        .is_err());
+
+    // Test that CALL with malformed arguments fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CALL my_function(,)")
+        .is_err());
+
+    // Test that CALL with invalid alias syntax fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CALL my_function() AS")
+        .is_err());
+
+    // Test that PIVOT without parentheses fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> PIVOT SUM(amount) FOR month IN ('Jan')")
+        .is_err());
+
+    // Test that PIVOT without FOR keyword fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> PIVOT(SUM(amount) month IN ('Jan'))")
+        .is_err());
+
+    // Test that PIVOT without IN keyword fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> PIVOT(SUM(amount) FOR month ('Jan'))")
+        .is_err());
+
+    // Test that PIVOT with empty IN list fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> PIVOT(SUM(amount) FOR month IN ())")
+        .is_err());
+
+    // Test that PIVOT with invalid alias syntax fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> PIVOT(SUM(amount) FOR month IN ('Jan')) AS")
+        .is_err());
+
+    // Test UNPIVOT negative cases
+
+    // Test that UNPIVOT without parentheses fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT value FOR name IN col1, col2")
+        .is_err());
+
+    // Test that UNPIVOT without FOR keyword fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value name IN (col1, col2))")
+        .is_err());
+
+    // Test that UNPIVOT without IN keyword fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value FOR name (col1, col2))")
+        .is_err());
+
+    // Test that UNPIVOT with missing value column fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(FOR name IN (col1, col2))")
+        .is_err());
+
+    // Test that UNPIVOT with missing name column fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value FOR IN (col1, col2))")
+        .is_err());
+
+    // Test that UNPIVOT with empty IN list fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value FOR name IN ())")
+        .is_err());
+
+    // Test that UNPIVOT with invalid alias syntax fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value FOR name IN (col1, col2)) AS")
+        .is_err());
+
+    // Test that UNPIVOT with missing closing parenthesis fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> UNPIVOT(value FOR name IN (col1, col2)")
+        .is_err());
+
+    // Test that JOIN without table name fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> JOIN ON users.id = orders.user_id")
+        .is_err());
+
+    // Test that CROSS JOIN with ON condition fails
+    assert!(dialects
+        .parse_sql_statements(
+            "SELECT * FROM users |> CROSS JOIN orders ON users.id = orders.user_id"
+        )
+        .is_err());
+
+    // Test that CROSS JOIN with USING condition fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> CROSS JOIN orders USING (user_id)")
+        .is_err());
+
+    // Test that JOIN with empty USING list fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> JOIN orders USING ()")
+        .is_err());
+
+    // Test that JOIN with malformed ON condition fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> JOIN orders ON")
+        .is_err());
+
+    // Test that JOIN with invalid USING syntax fails
+    assert!(dialects
+        .parse_sql_statements("SELECT * FROM users |> JOIN orders USING user_id")
+        .is_err());
+}
+
+#[test]
+fn parse_multiple_set_statements() -> Result<(), ParserError> {
+    let dialects = all_dialects_where(|d| d.supports_comma_separated_set_assignments());
+    let stmt = dialects.verified_stmt("SET @a = 1, b = 2");
+
+    match stmt {
+        Statement::Set(Set::MultipleAssignments { assignments }) => {
+            assert_eq!(
+                assignments,
+                vec![
+                    SetAssignment {
+                        scope: None,
+                        name: ObjectName::from(vec!["@a".into()]),
+                        value: Expr::value(number("1"))
+                    },
+                    SetAssignment {
+                        scope: None,
+                        name: ObjectName::from(vec!["b".into()]),
+                        value: Expr::value(number("2"))
+                    }
+                ]
+            );
+        }
+        _ => panic!("Expected SetVariable with 2 variables and 2 values"),
+    };
+
+    let stmt = dialects.verified_stmt("SET GLOBAL @a = 1, SESSION b = 2, LOCAL c = 3, d = 4");
+
+    match stmt {
+        Statement::Set(Set::MultipleAssignments { assignments }) => {
+            assert_eq!(
+                assignments,
+                vec![
+                    SetAssignment {
+                        scope: Some(ContextModifier::Global),
+                        name: ObjectName::from(vec!["@a".into()]),
+                        value: Expr::value(number("1"))
+                    },
+                    SetAssignment {
+                        scope: Some(ContextModifier::Session),
+                        name: ObjectName::from(vec!["b".into()]),
+                        value: Expr::value(number("2"))
+                    },
+                    SetAssignment {
+                        scope: Some(ContextModifier::Local),
+                        name: ObjectName::from(vec!["c".into()]),
+                        value: Expr::value(number("3"))
+                    },
+                    SetAssignment {
+                        scope: None,
+                        name: ObjectName::from(vec!["d".into()]),
+                        value: Expr::value(number("4"))
+                    }
+                ]
+            );
+        }
+        _ => panic!("Expected MultipleAssignments with 4 scoped variables and 4 values"),
+    };
+
+    Ok(())
+}
+
+#[test]
+fn parse_set_time_zone_alias() {
+    match all_dialects().verified_stmt("SET TIME ZONE 'UTC'") {
+        Statement::Set(Set::SetTimeZone { local, value }) => {
+            assert!(!local);
+            assert_eq!(
+                value,
+                Expr::Value((Value::SingleQuotedString("UTC".into())).with_empty_span())
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_return() {
+    let stmt = all_dialects().verified_stmt("RETURN");
+    assert_eq!(stmt, Statement::Return(ReturnStatement { value: None }));
+
+    let _ = all_dialects().verified_stmt("RETURN 1");
+}
+
+#[test]
+fn parse_subquery_limit() {
+    let _ = all_dialects().verified_stmt("SELECT t1_id, t1_name FROM t1 WHERE t1_id IN (SELECT t2_id FROM t2 WHERE t1_name = t2_name LIMIT 10)");
+}
+
+#[test]
+fn test_open() {
+    let open_cursor = "OPEN Employee_Cursor";
+    let stmt = all_dialects().verified_stmt(open_cursor);
+    assert_eq!(
+        stmt,
+        Statement::Open(OpenStatement {
+            cursor_name: Ident::new("Employee_Cursor"),
+        })
+    );
+}
+
+#[test]
+fn parse_truncate_only() {
+    let truncate = all_dialects().verified_stmt("TRUNCATE TABLE employee, ONLY dept");
+
+    let table_names = vec![
+        TruncateTableTarget {
+            name: ObjectName::from(vec![Ident::new("employee")]),
+            only: false,
+        },
+        TruncateTableTarget {
+            name: ObjectName::from(vec![Ident::new("dept")]),
+            only: true,
+        },
+    ];
+
+    assert_eq!(
+        Statement::Truncate {
+            table_names,
+            partitions: None,
+            table: true,
+            identity: None,
+            cascade: None,
+            on_cluster: None,
+        },
+        truncate
+    );
+}
+
+#[test]
+fn check_enforced() {
+    all_dialects().verified_stmt(
+        "CREATE TABLE t (a INT, b INT, c INT, CHECK (a > 0) NOT ENFORCED, CHECK (b > 0) ENFORCED, CHECK (c > 0))",
+    );
+}
+
+#[test]
+fn join_precedence() {
+    all_dialects_except(|d| !d.supports_left_associative_joins_without_parens())
+        .verified_query_with_canonical(
+        "SELECT *
+         FROM t1
+         NATURAL JOIN t5
+         INNER JOIN t0 ON (t0.v1 + t5.v0) > 0
+         WHERE t0.v1 = t1.v0",
+        // canonical string without parentheses
+        "SELECT * FROM t1 NATURAL JOIN t5 INNER JOIN t0 ON (t0.v1 + t5.v0) > 0 WHERE t0.v1 = t1.v0",
+    );
+    all_dialects_except(|d| d.supports_left_associative_joins_without_parens()).verified_query_with_canonical(
+        "SELECT *
+         FROM t1
+         NATURAL JOIN t5
+         INNER JOIN t0 ON (t0.v1 + t5.v0) > 0
+         WHERE t0.v1 = t1.v0",
+        // canonical string with parentheses
+        "SELECT * FROM t1 NATURAL JOIN (t5 INNER JOIN t0 ON (t0.v1 + t5.v0) > 0) WHERE t0.v1 = t1.v0",
+    );
+}
+
+#[test]
+fn parse_create_procedure_with_language() {
+    let sql = r#"CREATE PROCEDURE test_proc LANGUAGE sql AS BEGIN SELECT 1; END"#;
+    match verified_stmt(sql) {
+        Statement::CreateProcedure {
+            or_alter,
+            name,
+            params,
+            language,
+            ..
+        } => {
+            assert_eq!(or_alter, false);
+            assert_eq!(name.to_string(), "test_proc");
+            assert_eq!(params, Some(vec![]));
+            assert_eq!(
+                language,
+                Some(Ident {
+                    value: "sql".into(),
+                    quote_style: None,
+                    span: Span {
+                        start: Location::empty(),
+                        end: Location::empty()
+                    }
+                })
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_procedure_with_parameter_modes() {
+    let sql = r#"CREATE PROCEDURE test_proc (IN a INTEGER, OUT b TEXT, INOUT c TIMESTAMP, d BOOL) AS BEGIN SELECT 1; END"#;
+    match verified_stmt(sql) {
+        Statement::CreateProcedure {
+            or_alter,
+            name,
+            params,
+            ..
+        } => {
+            assert_eq!(or_alter, false);
+            assert_eq!(name.to_string(), "test_proc");
+            let fake_span = Span {
+                start: Location { line: 0, column: 0 },
+                end: Location { line: 0, column: 0 },
+            };
+            assert_eq!(
+                params,
+                Some(vec![
+                    ProcedureParam {
+                        name: Ident {
+                            value: "a".into(),
+                            quote_style: None,
+                            span: fake_span,
+                        },
+                        data_type: DataType::Integer(None),
+                        mode: Some(ArgMode::In)
+                    },
+                    ProcedureParam {
+                        name: Ident {
+                            value: "b".into(),
+                            quote_style: None,
+                            span: fake_span,
+                        },
+                        data_type: DataType::Text,
+                        mode: Some(ArgMode::Out)
+                    },
+                    ProcedureParam {
+                        name: Ident {
+                            value: "c".into(),
+                            quote_style: None,
+                            span: fake_span,
+                        },
+                        data_type: DataType::Timestamp(None, TimezoneInfo::None),
+                        mode: Some(ArgMode::InOut)
+                    },
+                    ProcedureParam {
+                        name: Ident {
+                            value: "d".into(),
+                            quote_style: None,
+                            span: fake_span,
+                        },
+                        data_type: DataType::Bool,
+                        mode: None
+                    },
+                ])
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_not_null() {
+    let _ = all_dialects().expr_parses_to("x NOT NULL", "x IS NOT NULL");
+    let _ = all_dialects().expr_parses_to("NULL NOT NULL", "NULL IS NOT NULL");
+
+    assert_matches!(
+        all_dialects().expr_parses_to("NOT NULL NOT NULL", "NOT NULL IS NOT NULL"),
+        Expr::UnaryOp {
+            op: UnaryOperator::Not,
+            ..
+        }
+    );
+    assert_matches!(
+        all_dialects().expr_parses_to("NOT x NOT NULL", "NOT x IS NOT NULL"),
+        Expr::UnaryOp {
+            op: UnaryOperator::Not,
+            ..
+        }
+    );
+}
+
+#[test]
+fn test_select_exclude() {
+    let dialects = all_dialects_where(|d| d.supports_select_wildcard_exclude());
+    match &dialects
+        .verified_only_select("SELECT * EXCLUDE c1 FROM test")
+        .projection[0]
+    {
+        SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
+            assert_eq!(
+                *opt_exclude,
+                Some(ExcludeSelectItem::Single(Ident::new("c1")))
+            );
+        }
+        _ => unreachable!(),
+    }
+    match &dialects
+        .verified_only_select("SELECT * EXCLUDE (c1, c2) FROM test")
+        .projection[0]
+    {
+        SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
+            assert_eq!(
+                *opt_exclude,
+                Some(ExcludeSelectItem::Multiple(vec![
+                    Ident::new("c1"),
+                    Ident::new("c2")
+                ]))
+            );
+        }
+        _ => unreachable!(),
+    }
+    let select = dialects.verified_only_select("SELECT * EXCLUDE c1, c2 FROM test");
+    match &select.projection[0] {
+        SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
+            assert_eq!(
+                *opt_exclude,
+                Some(ExcludeSelectItem::Single(Ident::new("c1")))
+            );
+        }
+        _ => unreachable!(),
+    }
+    match &select.projection[1] {
+        SelectItem::UnnamedExpr(Expr::Identifier(ident)) => {
+            assert_eq!(*ident, Ident::new("c2"));
+        }
+        _ => unreachable!(),
+    }
+
+    let dialects = all_dialects_where(|d| d.supports_select_exclude());
+    let select = dialects.verified_only_select("SELECT *, c1 EXCLUDE c1 FROM test");
+    match &select.projection[0] {
+        SelectItem::Wildcard(additional_options) => {
+            assert_eq!(*additional_options, WildcardAdditionalOptions::default());
+        }
+        _ => unreachable!(),
+    }
+    assert_eq!(
+        select.exclude,
+        Some(ExcludeSelectItem::Single(Ident::new("c1")))
+    );
+
+    let dialects = all_dialects_where(|d| {
+        d.supports_select_wildcard_exclude() && !d.supports_select_exclude()
+    });
+    let select = dialects.verified_only_select("SELECT * EXCLUDE c1 FROM test");
+    match &select.projection[0] {
+        SelectItem::Wildcard(WildcardAdditionalOptions { opt_exclude, .. }) => {
+            assert_eq!(
+                *opt_exclude,
+                Some(ExcludeSelectItem::Single(Ident::new("c1")))
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Dialects that only support the wildcard form and do not accept EXCLUDE as an implicity alias
+    // will fail when encountered with the `c2` ident
+    let dialects = all_dialects_where(|d| {
+        d.supports_select_wildcard_exclude()
+            && !d.supports_select_exclude()
+            && d.is_column_alias(&Keyword::EXCLUDE, &mut Parser::new(d))
+    });
+    assert_eq!(
+        dialects
+            .parse_sql_statements("SELECT *, c1 EXCLUDE c2 FROM test")
+            .err()
+            .unwrap(),
+        ParserError::ParserError("Expected: end of statement, found: c2".to_string())
+    );
+
+    // Dialects that only support the wildcard form and accept EXCLUDE as an implicity alias
+    // will fail when encountered with the `EXCLUDE` keyword
+    let dialects = all_dialects_where(|d| {
+        d.supports_select_wildcard_exclude()
+            && !d.supports_select_exclude()
+            && !d.is_column_alias(&Keyword::EXCLUDE, &mut Parser::new(d))
+    });
+    assert_eq!(
+        dialects
+            .parse_sql_statements("SELECT *, c1 EXCLUDE c2 FROM test")
+            .err()
+            .unwrap(),
+        ParserError::ParserError("Expected: end of statement, found: EXCLUDE".to_string())
+    );
+}
+
+#[test]
+fn test_no_semicolon_required_between_statements() {
+    let sql = r#"
+SELECT * FROM tbl1
+SELECT * FROM tbl2
+    "#;
+
+    let dialects = all_dialects_with_options(ParserOptions {
+        trailing_commas: false,
+        unescape: true,
+        require_semicolon_stmt_delimiter: false,
+    });
+    let stmts = dialects.parse_sql_statements(sql).unwrap();
+    assert_eq!(stmts.len(), 2);
+    assert!(stmts.iter().all(|s| matches!(s, Statement::Query { .. })));
+}
+
+#[test]
+fn test_identifier_unicode_support() {
+    let sql = r#"SELECT phoneǤЖשचᎯ⻩☯♜🦄⚛🀄ᚠ⌛🌀 AS tbl FROM customers"#;
+    let dialects = TestedDialects::new(vec![
+        Box::new(MySqlDialect {}),
+        Box::new(RedshiftSqlDialect {}),
+        Box::new(PostgreSqlDialect {}),
+    ]);
+    let _ = dialects.verified_stmt(sql);
+}
+
+#[test]
+fn test_identifier_unicode_start() {
+    let sql = r#"SELECT 💝phone AS 💝 FROM customers"#;
+    let dialects = TestedDialects::new(vec![
+        Box::new(MySqlDialect {}),
+        Box::new(RedshiftSqlDialect {}),
+        Box::new(PostgreSqlDialect {}),
+    ]);
+    let _ = dialects.verified_stmt(sql);
+}
+
+#[test]
+fn parse_notnull() {
+    // Some dialects support `x NOTNULL` as an expression while others consider
+    // `x NOTNULL` like `x AS NOTNULL` and thus consider `NOTNULL` an alias for x.
+    let notnull_unsupported_dialects = all_dialects_except(|d| d.supports_notnull_operator());
+    let _ = notnull_unsupported_dialects
+        .verified_only_select_with_canonical("SELECT NULL NOTNULL", "SELECT NULL AS NOTNULL");
+
+    // Supported dialects consider `x NOTNULL` as an alias for `x IS NOT NULL`
+    let notnull_supported_dialects = all_dialects_where(|d| d.supports_notnull_operator());
+    let _ = notnull_supported_dialects.expr_parses_to("x NOTNULL", "x IS NOT NULL");
+
+    // For dialects which support it, `NOT NULL NOTNULL` should
+    // parse as `(NOT (NULL IS NOT NULL))`
+    assert_matches!(
+        notnull_supported_dialects.expr_parses_to("NOT NULL NOTNULL", "NOT NULL IS NOT NULL"),
+        Expr::UnaryOp {
+            op: UnaryOperator::Not,
+            ..
+        }
+    );
+
+    // for unsupported dialects, parsing should stop at `NOT NULL`
+    notnull_unsupported_dialects.expr_parses_to("NOT NULL NOTNULL", "NOT NULL");
+}
+
+#[test]
+fn parse_odbc_time_date_timestamp() {
+    // Supported statements
+    let sql_d = "SELECT {d '2025-07-17'}, category_name FROM categories";
+    let _ = all_dialects().verified_stmt(sql_d);
+    let sql_t = "SELECT {t '14:12:01'}, category_name FROM categories";
+    let _ = all_dialects().verified_stmt(sql_t);
+    let sql_ts = "SELECT {ts '2025-07-17 14:12:01'}, category_name FROM categories";
+    let _ = all_dialects().verified_stmt(sql_ts);
+    // Unsupported statement
+    let supports_dictionary = all_dialects_where(|d| d.supports_dictionary_syntax());
+    let dictionary_unsupported = all_dialects_where(|d| !d.supports_dictionary_syntax());
+    let sql = "SELECT {tt '14:12:01'} FROM foo";
+    let res = supports_dictionary.parse_sql_statements(sql);
+    let res_dict = dictionary_unsupported.parse_sql_statements(sql);
+    assert_eq!(
+        ParserError::ParserError("Expected: :, found: '14:12:01'".to_string()),
+        res.unwrap_err()
+    );
+    assert_eq!(
+        ParserError::ParserError("Expected: an expression, found: {".to_string()),
+        res_dict.unwrap_err()
+    );
+}
+
+#[test]
+fn parse_create_user() {
+    let create = verified_stmt("CREATE USER u1");
+    match create {
+        Statement::CreateUser(stmt) => {
+            assert_eq!(stmt.name, Ident::new("u1"));
+        }
+        _ => unreachable!(),
+    }
+    verified_stmt("CREATE OR REPLACE USER u1");
+    verified_stmt("CREATE OR REPLACE USER IF NOT EXISTS u1");
+    verified_stmt("CREATE OR REPLACE USER IF NOT EXISTS u1 PASSWORD='secret'");
+    verified_stmt(
+        "CREATE OR REPLACE USER IF NOT EXISTS u1 PASSWORD='secret' MUST_CHANGE_PASSWORD=TRUE",
+    );
+    verified_stmt("CREATE OR REPLACE USER IF NOT EXISTS u1 PASSWORD='secret' MUST_CHANGE_PASSWORD=TRUE TYPE=SERVICE TAG (t1='v1')");
+    let create = verified_stmt("CREATE OR REPLACE USER IF NOT EXISTS u1 PASSWORD='secret' MUST_CHANGE_PASSWORD=TRUE TYPE=SERVICE WITH TAG (t1='v1', t2='v2')");
+    match create {
+        Statement::CreateUser(stmt) => {
+            assert_eq!(stmt.name, Ident::new("u1"));
+            assert_eq!(stmt.or_replace, true);
+            assert_eq!(stmt.if_not_exists, true);
+            assert_eq!(
+                stmt.options,
+                KeyValueOptions {
+                    delimiter: KeyValueOptionsDelimiter::Space,
+                    options: vec![
+                        KeyValueOption {
+                            option_name: "PASSWORD".to_string(),
+                            value: "secret".to_string(),
+                            option_type: KeyValueOptionType::STRING
+                        },
+                        KeyValueOption {
+                            option_name: "MUST_CHANGE_PASSWORD".to_string(),
+                            value: "TRUE".to_string(),
+                            option_type: KeyValueOptionType::BOOLEAN
+                        },
+                        KeyValueOption {
+                            option_name: "TYPE".to_string(),
+                            value: "SERVICE".to_string(),
+                            option_type: KeyValueOptionType::ENUM
+                        },
+                    ],
+                },
+            );
+            assert_eq!(stmt.with_tags, true);
+            assert_eq!(
+                stmt.tags,
+                KeyValueOptions {
+                    delimiter: KeyValueOptionsDelimiter::Comma,
+                    options: vec![
+                        KeyValueOption {
+                            option_name: "t1".to_string(),
+                            value: "v1".to_string(),
+                            option_type: KeyValueOptionType::STRING
+                        },
+                        KeyValueOption {
+                            option_name: "t2".to_string(),
+                            value: "v2".to_string(),
+                            option_type: KeyValueOptionType::STRING
+                        },
+                    ]
+                }
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_drop_stream() {
+    let sql = "DROP STREAM s1";
+    match verified_stmt(sql) {
+        Statement::Drop {
+            names, object_type, ..
+        } => {
+            assert_eq!(
+                vec!["s1"],
+                names.iter().map(ToString::to_string).collect::<Vec<_>>()
+            );
+            assert_eq!(ObjectType::Stream, object_type);
+        }
+        _ => unreachable!(),
+    }
+    verified_stmt("DROP STREAM IF EXISTS s1");
+}
+
+#[test]
+fn parse_create_view_if_not_exists() {
+    // Name after IF NOT EXISTS
+    let sql: &'static str = "CREATE VIEW IF NOT EXISTS v AS SELECT 1";
+    let _ = all_dialects().verified_stmt(sql);
+    // Name before IF NOT EXISTS
+    let sql = "CREATE VIEW v IF NOT EXISTS AS SELECT 1";
+    let _ = all_dialects().verified_stmt(sql);
+    // Name missing from query
+    let sql = "CREATE VIEW IF NOT EXISTS AS SELECT 1";
+    let res = all_dialects().parse_sql_statements(sql);
+    assert_eq!(
+        ParserError::ParserError("Expected: AS, found: SELECT".to_string()),
+        res.unwrap_err()
+    );
+}
diff --git a/tests/sqlparser_custom_dialect.rs b/tests/sqlparser_custom_dialect.rs
index e9ca82aba..cee604aca 100644
--- a/tests/sqlparser_custom_dialect.rs
+++ b/tests/sqlparser_custom_dialect.rs
@@ -41,7 +41,7 @@ fn custom_prefix_parser() -> Result<(), ParserError> {
 
         fn parse_prefix(&self, parser: &mut Parser) -> Option<Result<Expr, ParserError>> {
             if parser.consume_token(&Token::Number("1".to_string(), false)) {
-                Some(Ok(Expr::Value(Value::Null)))
+                Some(Ok(Expr::Value(Value::Null.with_empty_span())))
             } else {
                 None
             }
@@ -115,7 +115,11 @@ fn custom_statement_parser() -> Result<(), ParserError> {
                 for _ in 0..3 {
                     let _ = parser.next_token();
                 }
-                Some(Ok(Statement::Commit { chain: false }))
+                Some(Ok(Statement::Commit {
+                    chain: false,
+                    end: false,
+                    modifier: None,
+                }))
             } else {
                 None
             }
diff --git a/tests/sqlparser_databricks.rs b/tests/sqlparser_databricks.rs
index 7b917bd06..e01611b6f 100644
--- a/tests/sqlparser_databricks.rs
+++ b/tests/sqlparser_databricks.rs
@@ -15,9 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use sqlparser::ast::helpers::attached_token::AttachedToken;
 use sqlparser::ast::*;
 use sqlparser::dialect::{DatabricksDialect, GenericDialect};
 use sqlparser::parser::ParserError;
+use sqlparser::tokenizer::Span;
 use test_utils::*;
 
 #[macro_use]
@@ -47,7 +49,9 @@ fn test_databricks_identifiers() {
         databricks()
             .verified_only_select(r#"SELECT "Ä""#)
             .projection[0],
-        SelectItem::UnnamedExpr(Expr::Value(Value::DoubleQuotedString("Ä".to_owned())))
+        SelectItem::UnnamedExpr(Expr::Value(
+            (Value::DoubleQuotedString("Ä".to_owned())).with_empty_span()
+        ))
     );
 }
 
@@ -62,9 +66,9 @@ fn test_databricks_exists() {
                 call(
                     "array",
                     [
-                        Expr::Value(number("1")),
-                        Expr::Value(number("2")),
-                        Expr::Value(number("3"))
+                        Expr::value(number("1")),
+                        Expr::value(number("2")),
+                        Expr::value(number("3"))
                     ]
                 ),
                 Expr::Lambda(LambdaFunction {
@@ -99,40 +103,44 @@ fn test_databricks_lambdas() {
                 call(
                     "array",
                     [
-                        Expr::Value(Value::SingleQuotedString("Hello".to_owned())),
-                        Expr::Value(Value::SingleQuotedString("World".to_owned()))
+                        Expr::value(Value::SingleQuotedString("Hello".to_owned())),
+                        Expr::value(Value::SingleQuotedString("World".to_owned()))
                     ]
                 ),
                 Expr::Lambda(LambdaFunction {
                     params: OneOrManyWithParens::Many(vec![Ident::new("p1"), Ident::new("p2")]),
                     body: Box::new(Expr::Case {
+                        case_token: AttachedToken::empty(),
+                        end_token: AttachedToken::empty(),
                         operand: None,
                         conditions: vec![
-                            Expr::BinaryOp {
-                                left: Box::new(Expr::Identifier(Ident::new("p1"))),
-                                op: BinaryOperator::Eq,
-                                right: Box::new(Expr::Identifier(Ident::new("p2")))
+                            CaseWhen {
+                                condition: Expr::BinaryOp {
+                                    left: Box::new(Expr::Identifier(Ident::new("p1"))),
+                                    op: BinaryOperator::Eq,
+                                    right: Box::new(Expr::Identifier(Ident::new("p2")))
+                                },
+                                result: Expr::value(number("0"))
+                            },
+                            CaseWhen {
+                                condition: Expr::BinaryOp {
+                                    left: Box::new(call(
+                                        "reverse",
+                                        [Expr::Identifier(Ident::new("p1"))]
+                                    )),
+                                    op: BinaryOperator::Lt,
+                                    right: Box::new(call(
+                                        "reverse",
+                                        [Expr::Identifier(Ident::new("p2"))]
+                                    )),
+                                },
+                                result: Expr::UnaryOp {
+                                    op: UnaryOperator::Minus,
+                                    expr: Box::new(Expr::value(number("1")))
+                                }
                             },
-                            Expr::BinaryOp {
-                                left: Box::new(call(
-                                    "reverse",
-                                    [Expr::Identifier(Ident::new("p1"))]
-                                )),
-                                op: BinaryOperator::Lt,
-                                right: Box::new(call(
-                                    "reverse",
-                                    [Expr::Identifier(Ident::new("p2"))]
-                                ))
-                            }
-                        ],
-                        results: vec![
-                            Expr::Value(number("0")),
-                            Expr::UnaryOp {
-                                op: UnaryOperator::Minus,
-                                expr: Box::new(Expr::Value(number("1")))
-                            }
                         ],
-                        else_result: Some(Box::new(Expr::Value(number("1"))))
+                        else_result: Some(Box::new(Expr::value(number("1"))))
                     })
                 })
             ]
@@ -152,12 +160,12 @@ fn test_values_clause() {
         explicit_row: false,
         rows: vec![
             vec![
-                Expr::Value(Value::DoubleQuotedString("one".to_owned())),
-                Expr::Value(number("1")),
+                Expr::Value((Value::DoubleQuotedString("one".to_owned())).with_empty_span()),
+                Expr::value(number("1")),
             ],
             vec![
-                Expr::Value(Value::SingleQuotedString("two".to_owned())),
-                Expr::Value(number("2")),
+                Expr::Value((Value::SingleQuotedString("two".to_owned())).with_empty_span()),
+                Expr::value(number("2")),
             ],
         ],
     };
@@ -185,15 +193,9 @@ fn test_values_clause() {
         "SELECT * FROM values",
     ));
     assert_eq!(
-        Some(&TableFactor::Table {
-            name: ObjectName(vec![Ident::new("values")]),
-            alias: None,
-            args: None,
-            with_hints: vec![],
-            version: None,
-            partitions: vec![],
-            with_ordinality: false,
-        }),
+        Some(&table_from_name(ObjectName::from(vec![Ident::new(
+            "values"
+        )]))),
         query
             .body
             .as_select()
@@ -212,16 +214,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            databricks().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            databricks().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                databricks().verified_stmt(&format!("USE {0}{1}{0}", quote, object_name)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                databricks().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -232,22 +234,22 @@ fn parse_use() {
     for &quote in &quote_styles {
         // Test single identifier with keyword and different type of quotes
         assert_eq!(
-            databricks().verified_stmt(&format!("USE CATALOG {0}my_catalog{0}", quote)),
-            Statement::Use(Use::Catalog(ObjectName(vec![Ident::with_quote(
+            databricks().verified_stmt(&format!("USE CATALOG {quote}my_catalog{quote}")),
+            Statement::Use(Use::Catalog(ObjectName::from(vec![Ident::with_quote(
                 quote,
                 "my_catalog".to_string(),
             )])))
         );
         assert_eq!(
-            databricks().verified_stmt(&format!("USE DATABASE {0}my_database{0}", quote)),
-            Statement::Use(Use::Database(ObjectName(vec![Ident::with_quote(
+            databricks().verified_stmt(&format!("USE DATABASE {quote}my_database{quote}")),
+            Statement::Use(Use::Database(ObjectName::from(vec![Ident::with_quote(
                 quote,
                 "my_database".to_string(),
             )])))
         );
         assert_eq!(
-            databricks().verified_stmt(&format!("USE SCHEMA {0}my_schema{0}", quote)),
-            Statement::Use(Use::Schema(ObjectName(vec![Ident::with_quote(
+            databricks().verified_stmt(&format!("USE SCHEMA {quote}my_schema{quote}")),
+            Statement::Use(Use::Schema(ObjectName::from(vec![Ident::with_quote(
                 quote,
                 "my_schema".to_string(),
             )])))
@@ -257,15 +259,19 @@ fn parse_use() {
     // Test single identifier with keyword and no quotes
     assert_eq!(
         databricks().verified_stmt("USE CATALOG my_catalog"),
-        Statement::Use(Use::Catalog(ObjectName(vec![Ident::new("my_catalog")])))
+        Statement::Use(Use::Catalog(ObjectName::from(vec![Ident::new(
+            "my_catalog"
+        )])))
     );
     assert_eq!(
         databricks().verified_stmt("USE DATABASE my_schema"),
-        Statement::Use(Use::Database(ObjectName(vec![Ident::new("my_schema")])))
+        Statement::Use(Use::Database(ObjectName::from(vec![Ident::new(
+            "my_schema"
+        )])))
     );
     assert_eq!(
         databricks().verified_stmt("USE SCHEMA my_schema"),
-        Statement::Use(Use::Schema(ObjectName(vec![Ident::new("my_schema")])))
+        Statement::Use(Use::Schema(ObjectName::from(vec![Ident::new("my_schema")])))
     );
 
     // Test invalid syntax - missing identifier
@@ -277,3 +283,85 @@ fn parse_use() {
         );
     }
 }
+
+#[test]
+fn parse_databricks_struct_function() {
+    assert_eq!(
+        databricks_and_generic()
+            .verified_only_select("SELECT STRUCT(1, 'foo')")
+            .projection[0],
+        SelectItem::UnnamedExpr(Expr::Struct {
+            values: vec![
+                Expr::value(number("1")),
+                Expr::Value((Value::SingleQuotedString("foo".to_string())).with_empty_span())
+            ],
+            fields: vec![]
+        })
+    );
+    assert_eq!(
+        databricks_and_generic()
+            .verified_only_select("SELECT STRUCT(1 AS one, 'foo' AS foo, false)")
+            .projection[0],
+        SelectItem::UnnamedExpr(Expr::Struct {
+            values: vec![
+                Expr::Named {
+                    expr: Expr::value(number("1")).into(),
+                    name: Ident::new("one")
+                },
+                Expr::Named {
+                    expr: Expr::Value(
+                        (Value::SingleQuotedString("foo".to_string())).with_empty_span()
+                    )
+                    .into(),
+                    name: Ident::new("foo")
+                },
+                Expr::Value((Value::Boolean(false)).with_empty_span())
+            ],
+            fields: vec![]
+        })
+    );
+}
+
+#[test]
+fn data_type_timestamp_ntz() {
+    // Literal
+    assert_eq!(
+        databricks().verified_expr("TIMESTAMP_NTZ '2025-03-29T18:52:00'"),
+        Expr::TypedString(TypedString {
+            data_type: DataType::TimestampNtz,
+            value: ValueWithSpan {
+                value: Value::SingleQuotedString("2025-03-29T18:52:00".to_owned()),
+                span: Span::empty(),
+            },
+            uses_odbc_syntax: false
+        })
+    );
+
+    // Cast
+    assert_eq!(
+        databricks().verified_expr("(created_at)::TIMESTAMP_NTZ"),
+        Expr::Cast {
+            kind: CastKind::DoubleColon,
+            expr: Box::new(Expr::Nested(Box::new(Expr::Identifier(
+                "created_at".into()
+            )))),
+            data_type: DataType::TimestampNtz,
+            format: None
+        }
+    );
+
+    // Column definition
+    match databricks().verified_stmt("CREATE TABLE foo (x TIMESTAMP_NTZ)") {
+        Statement::CreateTable(CreateTable { columns, .. }) => {
+            assert_eq!(
+                columns,
+                vec![ColumnDef {
+                    name: "x".into(),
+                    data_type: DataType::TimestampNtz,
+                    options: vec![],
+                }]
+            );
+        }
+        s => panic!("Unexpected statement: {s:?}"),
+    }
+}
diff --git a/tests/sqlparser_duckdb.rs b/tests/sqlparser_duckdb.rs
index a2db5c282..fe14b7ba5 100644
--- a/tests/sqlparser_duckdb.rs
+++ b/tests/sqlparser_duckdb.rs
@@ -18,10 +18,13 @@
 #[macro_use]
 mod test_utils;
 
+use helpers::attached_token::AttachedToken;
+use sqlparser::tokenizer::Span;
 use test_utils::*;
 
 use sqlparser::ast::*;
 use sqlparser::dialect::{DuckDbDialect, GenericDialect};
+use sqlparser::parser::ParserError;
 
 fn duckdb() -> TestedDialects {
     TestedDialects::new(vec![Box::new(DuckDbDialect {})])
@@ -42,10 +45,12 @@ fn test_struct() {
             StructField {
                 field_name: Some(Ident::new("v")),
                 field_type: DataType::Varchar(None),
+                options: None,
             },
             StructField {
                 field_name: Some(Ident::new("i")),
                 field_type: DataType::Integer(None),
+                options: None,
             },
         ],
         StructBracketKind::Parentheses,
@@ -58,7 +63,6 @@ fn test_struct() {
         vec![ColumnDef {
             name: "s".into(),
             data_type: struct_type1.clone(),
-            collation: None,
             options: vec![],
         }]
     );
@@ -73,7 +77,6 @@ fn test_struct() {
                 Box::new(struct_type1),
                 None
             )),
-            collation: None,
             options: vec![],
         }]
     );
@@ -84,6 +87,7 @@ fn test_struct() {
             StructField {
                 field_name: Some(Ident::new("v")),
                 field_type: DataType::Varchar(None),
+                options: None,
             },
             StructField {
                 field_name: Some(Ident::new("s")),
@@ -92,14 +96,17 @@ fn test_struct() {
                         StructField {
                             field_name: Some(Ident::new("a1")),
                             field_type: DataType::Integer(None),
+                            options: None,
                         },
                         StructField {
                             field_name: Some(Ident::new("a2")),
                             field_type: DataType::Varchar(None),
+                            options: None,
                         },
                     ],
                     StructBracketKind::Parentheses,
                 ),
+                options: None,
             },
         ],
         StructBracketKind::Parentheses,
@@ -118,7 +125,6 @@ fn test_struct() {
                 Box::new(struct_type2),
                 None
             )),
-            collation: None,
             options: vec![],
         }]
     );
@@ -158,7 +164,7 @@ fn test_select_wildcard_with_exclude() {
     let select =
         duckdb().verified_only_select("SELECT name.* EXCLUDE department_id FROM employee_table");
     let expected = SelectItem::QualifiedWildcard(
-        ObjectName(vec![Ident::new("name")]),
+        SelectItemQualifiedWildcardKind::ObjectName(ObjectName::from(vec![Ident::new("name")])),
         WildcardAdditionalOptions {
             opt_exclude: Some(ExcludeSelectItem::Single(Ident::new("department_id"))),
             ..Default::default()
@@ -189,7 +195,7 @@ fn test_create_macro() {
     let expected = Statement::CreateMacro {
         or_replace: false,
         temporary: false,
-        name: ObjectName(vec![Ident::new("schema"), Ident::new("add")]),
+        name: ObjectName::from(vec![Ident::new("schema"), Ident::new("add")]),
         args: Some(vec![MacroArg::new("a"), MacroArg::new("b")]),
         definition: MacroDefinition::Expr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("a"))),
@@ -206,12 +212,12 @@ fn test_create_macro_default_args() {
     let expected = Statement::CreateMacro {
         or_replace: false,
         temporary: false,
-        name: ObjectName(vec![Ident::new("add_default")]),
+        name: ObjectName::from(vec![Ident::new("add_default")]),
         args: Some(vec![
             MacroArg::new("a"),
             MacroArg {
                 name: Ident::new("b"),
-                default_expr: Some(Expr::Value(number("5"))),
+                default_expr: Some(Expr::value(number("5"))),
             },
         ]),
         definition: MacroDefinition::Expr(Expr::BinaryOp {
@@ -234,7 +240,7 @@ fn test_create_table_macro() {
     let expected = Statement::CreateMacro {
         or_replace: true,
         temporary: true,
-        name: ObjectName(vec![Ident::new("dynamic_table")]),
+        name: ObjectName::from(vec![Ident::new("dynamic_table")]),
         args: Some(vec![
             MacroArg::new("col1_value"),
             MacroArg::new("col2_value"),
@@ -259,30 +265,19 @@ fn test_select_union_by_name() {
             op: SetOperator::Union,
             set_quantifier: *expected_quantifier,
             left: Box::<SetExpr>::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
                 distinct: None,
                 top: None,
+                projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions::default())],
+                exclude: None,
                 top_before_distinct: false,
-                projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions {
-                    opt_ilike: None,
-                    opt_exclude: None,
-                    opt_except: None,
-                    opt_rename: None,
-                    opt_replace: None,
-                })],
                 into: None,
                 from: vec![TableWithJoins {
-                    relation: TableFactor::Table {
-                        name: ObjectName(vec![Ident {
-                            value: "capitals".to_string(),
-                            quote_style: None,
-                        }]),
-                        alias: None,
-                        args: None,
-                        with_hints: vec![],
-                        version: None,
-                        partitions: vec![],
-                        with_ordinality: false,
-                    },
+                    relation: table_from_name(ObjectName::from(vec![Ident {
+                        value: "capitals".to_string(),
+                        quote_style: None,
+                        span: Span::empty(),
+                    }])),
                     joins: vec![],
                 }],
                 lateral_views: vec![],
@@ -298,32 +293,22 @@ fn test_select_union_by_name() {
                 qualify: None,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             right: Box::<SetExpr>::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
                 distinct: None,
                 top: None,
+                projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions::default())],
+                exclude: None,
                 top_before_distinct: false,
-                projection: vec![SelectItem::Wildcard(WildcardAdditionalOptions {
-                    opt_ilike: None,
-                    opt_exclude: None,
-                    opt_except: None,
-                    opt_rename: None,
-                    opt_replace: None,
-                })],
                 into: None,
                 from: vec![TableWithJoins {
-                    relation: TableFactor::Table {
-                        name: ObjectName(vec![Ident {
-                            value: "weather".to_string(),
-                            quote_style: None,
-                        }]),
-                        alias: None,
-                        args: None,
-                        with_hints: vec![],
-                        version: None,
-                        partitions: vec![],
-                        with_ordinality: false,
-                    },
+                    relation: table_from_name(ObjectName::from(vec![Ident {
+                        value: "weather".to_string(),
+                        quote_style: None,
+                        span: Span::empty(),
+                    }])),
                     joins: vec![],
                 }],
                 lateral_views: vec![],
@@ -339,6 +324,7 @@ fn test_select_union_by_name() {
                 qualify: None,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
         });
         assert_eq!(ast.body, expected);
@@ -353,12 +339,54 @@ fn test_duckdb_install() {
         Statement::Install {
             extension_name: Ident {
                 value: "tpch".to_string(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty()
             }
         }
     );
 }
 
+#[test]
+fn test_duckdb_load_extension() {
+    let stmt = duckdb().verified_stmt("LOAD my_extension");
+    assert_eq!(
+        Statement::Load {
+            extension_name: Ident {
+                value: "my_extension".to_string(),
+                quote_style: None,
+                span: Span::empty()
+            }
+        },
+        stmt
+    );
+}
+
+#[test]
+fn test_duckdb_specific_int_types() {
+    let duckdb_dtypes = vec![
+        ("UTINYINT", DataType::UTinyInt),
+        ("USMALLINT", DataType::USmallInt),
+        ("UBIGINT", DataType::UBigInt),
+        ("UHUGEINT", DataType::UHugeInt),
+        ("HUGEINT", DataType::HugeInt),
+    ];
+    for (dtype_string, data_type) in duckdb_dtypes {
+        let sql = format!("SELECT 123::{dtype_string}");
+        let select = duckdb().verified_only_select(&sql);
+        assert_eq!(
+            &Expr::Cast {
+                kind: CastKind::DoubleColon,
+                expr: Box::new(Expr::Value(
+                    Value::Number("123".parse().unwrap(), false).with_empty_span()
+                )),
+                data_type: data_type.clone(),
+                format: None,
+            },
+            expr_from_projection(&select.projection[0])
+        );
+    }
+}
+
 #[test]
 fn test_duckdb_struct_literal() {
     //struct literal syntax https://duckdb.org/docs/sql/data_types/struct#creating-structs
@@ -370,15 +398,15 @@ fn test_duckdb_struct_literal() {
         &Expr::Dictionary(vec![
             DictionaryField {
                 key: Ident::with_quote('\'', "a"),
-                value: Box::new(Expr::Value(number("1"))),
+                value: Box::new(Expr::value(number("1"))),
             },
             DictionaryField {
                 key: Ident::with_quote('\'', "b"),
-                value: Box::new(Expr::Value(number("2"))),
+                value: Box::new(Expr::value(number("2"))),
             },
             DictionaryField {
                 key: Ident::with_quote('\'', "c"),
-                value: Box::new(Expr::Value(number("3"))),
+                value: Box::new(Expr::value(number("3"))),
             },
         ],),
         expr_from_projection(&select.projection[0])
@@ -388,7 +416,9 @@ fn test_duckdb_struct_literal() {
         &Expr::Array(Array {
             elem: vec![Expr::Dictionary(vec![DictionaryField {
                 key: Ident::with_quote('\'', "a"),
-                value: Box::new(Expr::Value(Value::SingleQuotedString("abc".to_string()))),
+                value: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("abc".to_string())).with_empty_span()
+                )),
             },],)],
             named: false
         }),
@@ -398,7 +428,7 @@ fn test_duckdb_struct_literal() {
         &Expr::Dictionary(vec![
             DictionaryField {
                 key: Ident::with_quote('\'', "a"),
-                value: Box::new(Expr::Value(number("1"))),
+                value: Box::new(Expr::value(number("1"))),
             },
             DictionaryField {
                 key: Ident::with_quote('\'', "b"),
@@ -417,11 +447,14 @@ fn test_duckdb_struct_literal() {
         &Expr::Dictionary(vec![
             DictionaryField {
                 key: Ident::with_quote('\'', "a"),
-                value: Expr::Value(number("1")).into(),
+                value: Expr::value(number("1")).into(),
             },
             DictionaryField {
                 key: Ident::with_quote('\'', "b"),
-                value: Expr::Value(Value::SingleQuotedString("abc".to_string())).into(),
+                value: Expr::Value(
+                    (Value::SingleQuotedString("abc".to_string())).with_empty_span()
+                )
+                .into(),
             },
         ],),
         expr_from_projection(&select.projection[3])
@@ -438,7 +471,7 @@ fn test_duckdb_struct_literal() {
             key: Ident::with_quote('\'', "a"),
             value: Expr::Dictionary(vec![DictionaryField {
                 key: Ident::with_quote('\'', "aa"),
-                value: Expr::Value(number("1")).into(),
+                value: Expr::value(number("1")).into(),
             }],)
             .into(),
         }],),
@@ -593,23 +626,24 @@ fn test_duckdb_named_argument_function_with_assignment_operator() {
     let select = duckdb_and_generic().verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("FUN")]),
+            name: ObjectName::from(vec![Ident::new("FUN")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
                 args: vec![
                     FunctionArg::Named {
                         name: Ident::new("a"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "1".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("1".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::Assignment
                     },
                     FunctionArg::Named {
                         name: Ident::new("b"),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "2".to_owned()
-                        ))),
+                        arg: FunctionArgExpr::Expr(Expr::Value(
+                            (Value::SingleQuotedString("2".to_owned())).with_empty_span()
+                        )),
                         operator: FunctionArgOperator::Assignment
                     },
                 ],
@@ -635,18 +669,18 @@ fn test_array_index() {
         _ => panic!("Expected an expression with alias"),
     };
     assert_eq!(
-        &Expr::Subscript {
-            expr: Box::new(Expr::Array(Array {
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Array(Array {
                 elem: vec![
-                    Expr::Value(Value::SingleQuotedString("a".to_owned())),
-                    Expr::Value(Value::SingleQuotedString("b".to_owned())),
-                    Expr::Value(Value::SingleQuotedString("c".to_owned()))
+                    Expr::Value((Value::SingleQuotedString("a".to_owned())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("b".to_owned())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("c".to_owned())).with_empty_span())
                 ],
                 named: false
             })),
-            subscript: Box::new(Subscript::Index {
-                index: Expr::Value(number("3"))
-            })
+            access_chain: vec![AccessExpr::Subscript(Subscript::Index {
+                index: Expr::value(number("3"))
+            })]
         },
         expr
     );
@@ -665,7 +699,8 @@ fn test_duckdb_union_datatype() {
             if_not_exists: Default::default(),
             transient: Default::default(),
             volatile: Default::default(),
-            name: ObjectName(vec!["tbl1".into()]),
+            iceberg: Default::default(),
+            name: ObjectName::from(vec!["tbl1".into()]),
             columns: vec![
                 ColumnDef {
                     name: "one".into(),
@@ -673,7 +708,6 @@ fn test_duckdb_union_datatype() {
                         field_name: "a".into(),
                         field_type: DataType::Int(None)
                     }]),
-                    collation: Default::default(),
                     options: Default::default()
                 },
                 ColumnDef {
@@ -688,7 +722,6 @@ fn test_duckdb_union_datatype() {
                             field_type: DataType::Int(None)
                         }
                     ]),
-                    collation: Default::default(),
                     options: Default::default()
                 },
                 ColumnDef {
@@ -700,7 +733,6 @@ fn test_duckdb_union_datatype() {
                             field_type: DataType::Int(None)
                         }])
                     }]),
-                    collation: Default::default(),
                     options: Default::default()
                 }
             ],
@@ -712,19 +744,13 @@ fn test_duckdb_union_datatype() {
                 storage: Default::default(),
                 location: Default::default()
             }),
-            table_properties: Default::default(),
-            with_options: Default::default(),
             file_format: Default::default(),
             location: Default::default(),
             query: Default::default(),
             without_rowid: Default::default(),
             like: Default::default(),
             clone: Default::default(),
-            engine: Default::default(),
             comment: Default::default(),
-            auto_increment_offset: Default::default(),
-            default_charset: Default::default(),
-            collation: Default::default(),
             on_commit: Default::default(),
             on_cluster: Default::default(),
             primary_key: Default::default(),
@@ -732,7 +758,7 @@ fn test_duckdb_union_datatype() {
             partition_by: Default::default(),
             cluster_by: Default::default(),
             clustered_by: Default::default(),
-            options: Default::default(),
+            inherits: Default::default(),
             strict: Default::default(),
             copy_grants: Default::default(),
             enable_schema_evolution: Default::default(),
@@ -742,7 +768,13 @@ fn test_duckdb_union_datatype() {
             default_ddl_collation: Default::default(),
             with_aggregation_policy: Default::default(),
             with_row_access_policy: Default::default(),
-            with_tags: Default::default()
+            with_tags: Default::default(),
+            base_location: Default::default(),
+            external_volume: Default::default(),
+            catalog: Default::default(),
+            catalog_sync: Default::default(),
+            storage_serialization_policy: Default::default(),
+            table_options: CreateTableOptions::None
         }),
         stmt
     );
@@ -763,16 +795,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            duckdb().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            duckdb().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                duckdb().verified_stmt(&format!("USE {0}{1}{0}", quote, object_name)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                duckdb().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -783,8 +815,10 @@ fn parse_use() {
     for &quote in &quote_styles {
         // Test double identifier with different type of quotes
         assert_eq!(
-            duckdb().verified_stmt(&format!("USE {0}CATALOG{0}.{0}my_schema{0}", quote)),
-            Statement::Use(Use::Object(ObjectName(vec![
+            duckdb().verified_stmt(&format!(
+                "USE {quote}CATALOG{quote}.{quote}my_schema{quote}"
+            )),
+            Statement::Use(Use::Object(ObjectName::from(vec![
                 Ident::with_quote(quote, "CATALOG"),
                 Ident::with_quote(quote, "my_schema")
             ])))
@@ -793,9 +827,38 @@ fn parse_use() {
     // Test double identifier without quotes
     assert_eq!(
         duckdb().verified_stmt("USE mydb.my_schema"),
-        Statement::Use(Use::Object(ObjectName(vec![
+        Statement::Use(Use::Object(ObjectName::from(vec![
             Ident::new("mydb"),
             Ident::new("my_schema")
         ])))
     );
 }
+
+#[test]
+fn test_duckdb_trim() {
+    let real_sql = r#"SELECT customer_id, TRIM(item_price_id, '"', "a") AS item_price_id FROM models_staging.subscriptions"#;
+    assert_eq!(duckdb().verified_stmt(real_sql).to_string(), real_sql);
+
+    let sql_only_select = "SELECT TRIM('xyz', 'a')";
+    let select = duckdb().verified_only_select(sql_only_select);
+    assert_eq!(
+        &Expr::Trim {
+            expr: Box::new(Expr::Value(
+                Value::SingleQuotedString("xyz".to_owned()).with_empty_span()
+            )),
+            trim_where: None,
+            trim_what: None,
+            trim_characters: Some(vec![Expr::Value(
+                Value::SingleQuotedString("a".to_owned()).with_empty_span()
+            )]),
+        },
+        expr_from_projection(only(&select.projection))
+    );
+
+    // missing comma separation
+    let error_sql = "SELECT TRIM('xyz' 'a')";
+    assert_eq!(
+        ParserError::ParserError("Expected: ), found: 'a'".to_owned()),
+        duckdb().parse_sql_statements(error_sql).unwrap_err()
+    );
+}
diff --git a/tests/sqlparser_hive.rs b/tests/sqlparser_hive.rs
index 10bd374c0..56a72ec84 100644
--- a/tests/sqlparser_hive.rs
+++ b/tests/sqlparser_hive.rs
@@ -21,11 +21,11 @@
 //! is also tested (on the inputs it can handle).
 
 use sqlparser::ast::{
-    ClusteredBy, CommentDef, CreateFunctionBody, CreateFunctionUsing, CreateTable, Expr, Function,
-    FunctionArgumentList, FunctionArguments, Ident, ObjectName, OneOrManyWithParens, OrderByExpr,
-    SelectItem, Statement, TableFactor, UnaryOperator, Use, Value,
+    ClusteredBy, CommentDef, CreateFunction, CreateFunctionBody, CreateFunctionUsing, CreateTable,
+    Expr, Function, FunctionArgumentList, FunctionArguments, Ident, ObjectName, OrderByExpr,
+    OrderByOptions, SelectItem, Set, Statement, TableFactor, UnaryOperator, Use, Value,
 };
-use sqlparser::dialect::{GenericDialect, HiveDialect, MsSqlDialect};
+use sqlparser::dialect::{AnsiDialect, GenericDialect, HiveDialect};
 use sqlparser::parser::ParserError;
 use sqlparser::test_utils::*;
 
@@ -91,7 +91,7 @@ fn parse_msck() {
 }
 
 #[test]
-fn parse_set() {
+fn parse_set_hivevar() {
     let set = "SET HIVEVAR:name = a, b, c_d";
     hive().verified_stmt(set);
 }
@@ -133,9 +133,7 @@ fn create_table_with_comment() {
         Statement::CreateTable(CreateTable { comment, .. }) => {
             assert_eq!(
                 comment,
-                Some(CommentDef::AfterColumnDefsWithoutEq(
-                    "table comment".to_string()
-                ))
+                Some(CommentDef::WithoutEq("table comment".to_string()))
             )
         }
         _ => unreachable!(),
@@ -170,14 +168,18 @@ fn create_table_with_clustered_by() {
                     sorted_by: Some(vec![
                         OrderByExpr {
                             expr: Expr::Identifier(Ident::new("a")),
-                            asc: Some(true),
-                            nulls_first: None,
+                            options: OrderByOptions {
+                                asc: Some(true),
+                                nulls_first: None,
+                            },
                             with_fill: None,
                         },
                         OrderByExpr {
                             expr: Expr::Identifier(Ident::new("b")),
-                            asc: Some(false),
-                            nulls_first: None,
+                            options: OrderByOptions {
+                                asc: Some(false),
+                                nulls_first: None,
+                            },
                             with_fill: None,
                         },
                     ]),
@@ -339,6 +341,9 @@ fn lateral_view() {
 fn sort_by() {
     let sort_by = "SELECT * FROM db.table SORT BY a";
     hive().verified_stmt(sort_by);
+
+    let sort_by_with_direction = "SELECT * FROM db.table SORT BY a, b DESC";
+    hive().verified_stmt(sort_by_with_direction);
 }
 
 #[test]
@@ -364,20 +369,20 @@ fn from_cte() {
 fn set_statement_with_minus() {
     assert_eq!(
         hive().verified_stmt("SET hive.tez.java.opts = -Xmx4g"),
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![
+            variable: ObjectName::from(vec![
                 Ident::new("hive"),
                 Ident::new("tez"),
                 Ident::new("java"),
                 Ident::new("opts")
-            ])),
-            value: vec![Expr::UnaryOp {
+            ]),
+            values: vec![Expr::UnaryOp {
                 op: UnaryOperator::Minus,
                 expr: Box::new(Expr::Identifier(Ident::new("Xmx4g")))
             }],
-        }
+        })
     );
 
     assert_eq!(
@@ -392,19 +397,20 @@ fn set_statement_with_minus() {
 fn parse_create_function() {
     let sql = "CREATE TEMPORARY FUNCTION mydb.myfunc AS 'org.random.class.Name' USING JAR 'hdfs://somewhere.com:8020/very/far'";
     match hive().verified_stmt(sql) {
-        Statement::CreateFunction {
+        Statement::CreateFunction(CreateFunction {
             temporary,
             name,
             function_body,
             using,
             ..
-        } => {
+        }) => {
             assert!(temporary);
             assert_eq!(name.to_string(), "mydb.myfunc");
             assert_eq!(
                 function_body,
                 Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
-                    Value::SingleQuotedString("org.random.class.Name".to_string())
+                    (Value::SingleQuotedString("org.random.class.Name".to_string()))
+                        .with_empty_span()
                 )))
             );
             assert_eq!(
@@ -418,7 +424,7 @@ fn parse_create_function() {
     }
 
     // Test error in dialect that doesn't support parsing CREATE FUNCTION
-    let unsupported_dialects = TestedDialects::new(vec![Box::new(MsSqlDialect {})]);
+    let unsupported_dialects = TestedDialects::new(vec![Box::new(AnsiDialect {})]);
 
     assert_eq!(
         unsupported_dialects.parse_sql_statements(sql).unwrap_err(),
@@ -457,8 +463,14 @@ fn parse_delimited_identifiers() {
             version,
             with_ordinality: _,
             partitions: _,
+            json_path: _,
+            sample: _,
+            index_hints: _,
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -477,7 +489,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -511,16 +524,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            hive().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            hive().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                hive().verified_stmt(&format!("USE {}{}{}", quote, object_name, quote)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                hive().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -534,6 +547,15 @@ fn parse_use() {
     );
 }
 
+#[test]
+fn test_tample_sample() {
+    hive().verified_stmt("SELECT * FROM source TABLESAMPLE (BUCKET 3 OUT OF 32 ON rand()) AS s");
+    hive().verified_stmt("SELECT * FROM source TABLESAMPLE (BUCKET 3 OUT OF 16 ON id)");
+    hive().verified_stmt("SELECT * FROM source TABLESAMPLE (100M) AS s");
+    hive().verified_stmt("SELECT * FROM source TABLESAMPLE (0.1 PERCENT) AS s");
+    hive().verified_stmt("SELECT * FROM source TABLESAMPLE (10 ROWS)");
+}
+
 fn hive() -> TestedDialects {
     TestedDialects::new(vec![Box::new(HiveDialect {})])
 }
diff --git a/tests/sqlparser_mssql.rs b/tests/sqlparser_mssql.rs
index 73fd99cf3..50c6448d9 100644
--- a/tests/sqlparser_mssql.rs
+++ b/tests/sqlparser_mssql.rs
@@ -22,14 +22,17 @@
 #[macro_use]
 mod test_utils;
 
+use helpers::attached_token::AttachedToken;
+use sqlparser::keywords::Keyword;
+use sqlparser::tokenizer::{Location, Span, Token, TokenWithSpan, Word};
 use test_utils::*;
 
-use sqlparser::ast::DataType::{Int, Text};
+use sqlparser::ast::DataType::{Int, Text, Varbinary};
 use sqlparser::ast::DeclareAssignment::MsSqlAssignment;
 use sqlparser::ast::Value::SingleQuotedString;
 use sqlparser::ast::*;
 use sqlparser::dialect::{GenericDialect, MsSqlDialect};
-use sqlparser::parser::ParserError;
+use sqlparser::parser::{Parser, ParserError, ParserOptions};
 
 #[test]
 fn parse_mssql_identifiers() {
@@ -61,15 +64,18 @@ fn parse_table_time_travel() {
         select.from,
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident::new("t1")]),
+                name: ObjectName::from(vec![Ident::new("t1")]),
                 alias: None,
                 args: None,
                 with_hints: vec![],
                 version: Some(TableVersion::ForSystemTimeAsOf(Expr::Value(
-                    Value::SingleQuotedString(version)
+                    (Value::SingleQuotedString(version)).with_empty_span()
                 ))),
                 partitions: vec![],
                 with_ordinality: false,
+                json_path: None,
+                sample: None,
+                index_hints: vec![]
             },
             joins: vec![]
         },]
@@ -94,87 +100,325 @@ fn parse_mssql_delimited_identifiers() {
 
 #[test]
 fn parse_create_procedure() {
-    let sql = "CREATE OR ALTER PROCEDURE test (@foo INT, @bar VARCHAR(256)) AS BEGIN SELECT 1 END";
+    let sql = "CREATE OR ALTER PROCEDURE test (@foo INT, @bar VARCHAR(256)) AS BEGIN SELECT 1; END";
 
     assert_eq!(
         ms().verified_stmt(sql),
         Statement::CreateProcedure {
             or_alter: true,
-            body: vec![Statement::Query(Box::new(Query {
-                with: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
-                fetch: None,
-                locks: vec![],
-                for_clause: None,
-                order_by: None,
-                settings: None,
-                format_clause: None,
-                body: Box::new(SetExpr::Select(Box::new(Select {
-                    distinct: None,
-                    top: None,
-                    top_before_distinct: false,
-                    projection: vec![SelectItem::UnnamedExpr(Expr::Value(number("1")))],
-                    into: None,
-                    from: vec![],
-                    lateral_views: vec![],
-                    prewhere: None,
-                    selection: None,
-                    group_by: GroupByExpr::Expressions(vec![], vec![]),
-                    cluster_by: vec![],
-                    distribute_by: vec![],
-                    sort_by: vec![],
-                    having: None,
-                    named_window: vec![],
-                    window_before_qualify: false,
-                    qualify: None,
-                    value_table_mode: None,
-                    connect_by: None,
-                })))
-            }))],
+            body: ConditionalStatements::BeginEnd(BeginEndStatements {
+                begin_token: AttachedToken::empty(),
+                statements: vec![Statement::Query(Box::new(Query {
+                    with: None,
+                    limit_clause: None,
+                    fetch: None,
+                    locks: vec![],
+                    for_clause: None,
+                    order_by: None,
+                    settings: None,
+                    format_clause: None,
+                    pipe_operators: vec![],
+                    body: Box::new(SetExpr::Select(Box::new(Select {
+                        select_token: AttachedToken::empty(),
+                        distinct: None,
+                        top: None,
+                        top_before_distinct: false,
+                        projection: vec![SelectItem::UnnamedExpr(Expr::Value(
+                            (number("1")).with_empty_span()
+                        ))],
+                        exclude: None,
+                        into: None,
+                        from: vec![],
+                        lateral_views: vec![],
+                        prewhere: None,
+                        selection: None,
+                        group_by: GroupByExpr::Expressions(vec![], vec![]),
+                        cluster_by: vec![],
+                        distribute_by: vec![],
+                        sort_by: vec![],
+                        having: None,
+                        named_window: vec![],
+                        window_before_qualify: false,
+                        qualify: None,
+                        value_table_mode: None,
+                        connect_by: None,
+                        flavor: SelectFlavor::Standard,
+                    })))
+                }))],
+                end_token: AttachedToken::empty(),
+            }),
             params: Some(vec![
                 ProcedureParam {
                     name: Ident {
                         value: "@foo".into(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     },
-                    data_type: DataType::Int(None)
+                    data_type: DataType::Int(None),
+                    mode: None,
                 },
                 ProcedureParam {
                     name: Ident {
                         value: "@bar".into(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     },
                     data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
                         length: 256,
                         unit: None
-                    }))
+                    })),
+                    mode: None,
                 }
             ]),
-            name: ObjectName(vec![Ident {
+            name: ObjectName::from(vec![Ident {
                 value: "test".into(),
-                quote_style: None
-            }])
+                quote_style: None,
+                span: Span::empty(),
+            }]),
+            language: None,
         }
     )
 }
 
 #[test]
 fn parse_mssql_create_procedure() {
-    let _ = ms_and_generic().verified_stmt("CREATE OR ALTER PROCEDURE foo AS BEGIN SELECT 1 END");
-    let _ = ms_and_generic().verified_stmt("CREATE PROCEDURE foo AS BEGIN SELECT 1 END");
+    let _ = ms_and_generic().verified_stmt("CREATE OR ALTER PROCEDURE foo AS SELECT 1;");
+    let _ = ms_and_generic().verified_stmt("CREATE OR ALTER PROCEDURE foo AS BEGIN SELECT 1; END");
+    let _ = ms_and_generic().verified_stmt("CREATE PROCEDURE foo AS BEGIN SELECT 1; END");
     let _ = ms().verified_stmt(
-        "CREATE PROCEDURE foo AS BEGIN SELECT [myColumn] FROM [myschema].[mytable] END",
+        "CREATE PROCEDURE foo AS BEGIN SELECT [myColumn] FROM [myschema].[mytable]; END",
     );
     let _ = ms_and_generic().verified_stmt(
-        "CREATE PROCEDURE foo (@CustomerName NVARCHAR(50)) AS BEGIN SELECT * FROM DEV END",
+        "CREATE PROCEDURE foo (@CustomerName NVARCHAR(50)) AS BEGIN SELECT * FROM DEV; END",
     );
-    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test' END");
+    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test'; END");
     // Test a statement with END in it
-    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN SELECT [foo], CASE WHEN [foo] IS NULL THEN 'empty' ELSE 'notempty' END AS [foo] END");
+    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN SELECT [foo], CASE WHEN [foo] IS NULL THEN 'empty' ELSE 'notempty' END AS [foo]; END");
     // Multiple statements
-    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test'; SELECT [foo] FROM BAR WHERE [FOO] > 10 END");
+    let _ = ms().verified_stmt("CREATE PROCEDURE [foo] AS BEGIN UPDATE bar SET col = 'test'; SELECT [foo] FROM BAR WHERE [FOO] > 10; END");
+}
+
+#[test]
+fn parse_create_function() {
+    let return_expression_function = "CREATE FUNCTION some_scalar_udf(@foo INT, @bar VARCHAR(256)) RETURNS INT AS BEGIN RETURN 1; END";
+    assert_eq!(
+        ms().verified_stmt(return_expression_function),
+        sqlparser::ast::Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: false,
+            temporary: false,
+            if_not_exists: false,
+            name: ObjectName::from(vec![Ident::new("some_scalar_udf")]),
+            args: Some(vec![
+                OperateFunctionArg {
+                    mode: None,
+                    name: Some(Ident::new("@foo")),
+                    data_type: DataType::Int(None),
+                    default_expr: None,
+                },
+                OperateFunctionArg {
+                    mode: None,
+                    name: Some(Ident::new("@bar")),
+                    data_type: DataType::Varchar(Some(CharacterLength::IntegerLength {
+                        length: 256,
+                        unit: None
+                    })),
+                    default_expr: None,
+                },
+            ]),
+            return_type: Some(DataType::Int(None)),
+            function_body: Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
+                begin_token: AttachedToken::empty(),
+                statements: vec![Statement::Return(ReturnStatement {
+                    value: Some(ReturnStatementValue::Expr(Expr::Value(
+                        (number("1")).with_empty_span()
+                    ))),
+                })],
+                end_token: AttachedToken::empty(),
+            })),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            using: None,
+            language: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        }),
+    );
+
+    let multi_statement_function = "\
+        CREATE FUNCTION some_scalar_udf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS INT \
+        AS \
+        BEGIN \
+            SET @foo = @foo + 1; \
+            RETURN @foo; \
+        END\
+    ";
+    let _ = ms().verified_stmt(multi_statement_function);
+
+    let multi_statement_function_without_as = multi_statement_function.replace(" AS", "");
+    let _ = ms().one_statement_parses_to(
+        &multi_statement_function_without_as,
+        multi_statement_function,
+    );
+
+    let create_function_with_conditional = "\
+        CREATE FUNCTION some_scalar_udf() \
+        RETURNS INT \
+        AS \
+        BEGIN \
+            IF 1 = 2 \
+            BEGIN \
+                RETURN 1; \
+            END; \
+            RETURN 0; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_function_with_conditional);
+
+    let create_or_alter_function = "\
+        CREATE OR ALTER FUNCTION some_scalar_udf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS INT \
+        AS \
+        BEGIN \
+            SET @foo = @foo + 1; \
+            RETURN @foo; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_or_alter_function);
+
+    let create_function_with_return_expression = "\
+        CREATE FUNCTION some_scalar_udf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS INT \
+        AS \
+        BEGIN \
+            RETURN CONVERT(INT, 1) + 2; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_function_with_return_expression);
+
+    let create_inline_table_value_function = "\
+        CREATE FUNCTION some_inline_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS TABLE \
+        AS \
+        RETURN (SELECT 1 AS col_1)\
+    ";
+    let _ = ms().verified_stmt(create_inline_table_value_function);
+
+    let create_inline_table_value_function_without_parentheses = "\
+        CREATE FUNCTION some_inline_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS TABLE \
+        AS \
+        RETURN SELECT 1 AS col_1\
+    ";
+    let _ = ms().verified_stmt(create_inline_table_value_function_without_parentheses);
+
+    let create_inline_table_value_function_without_as =
+        create_inline_table_value_function.replace(" AS", "");
+    let _ = ms().one_statement_parses_to(
+        &create_inline_table_value_function_without_as,
+        create_inline_table_value_function,
+    );
+
+    let create_multi_statement_table_value_function = "\
+        CREATE FUNCTION some_multi_statement_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS @t TABLE (col_1 INT) \
+        AS \
+        BEGIN \
+            INSERT INTO @t SELECT 1; \
+            RETURN; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_multi_statement_table_value_function);
+
+    let create_multi_statement_table_value_function_without_as =
+        create_multi_statement_table_value_function.replace(" AS", "");
+    let _ = ms().one_statement_parses_to(
+        &create_multi_statement_table_value_function_without_as,
+        create_multi_statement_table_value_function,
+    );
+
+    let create_multi_statement_table_value_function_with_constraints = "\
+        CREATE FUNCTION some_multi_statement_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS @t TABLE (col_1 INT NOT NULL) \
+        AS \
+        BEGIN \
+            INSERT INTO @t SELECT 1; \
+            RETURN @t; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_multi_statement_table_value_function_with_constraints);
+
+    let create_multi_statement_tvf_without_table_definition = "\
+        CREATE FUNCTION incorrect_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS @t TABLE ()
+        AS \
+        BEGIN \
+            INSERT INTO @t SELECT 1; \
+            RETURN @t; \
+        END\
+    ";
+    assert_eq!(
+        ParserError::ParserError("Unparsable function body".to_owned()),
+        ms().parse_sql_statements(create_multi_statement_tvf_without_table_definition)
+            .unwrap_err()
+    );
+
+    let create_inline_tvf_without_subquery_or_bare_select = "\
+        CREATE FUNCTION incorrect_tvf(@foo INT, @bar VARCHAR(256)) \
+        RETURNS TABLE
+        AS \
+        RETURN 'hi'\
+    ";
+    assert_eq!(
+        ParserError::ParserError(
+            "Expected a subquery (or bare SELECT statement) after RETURN".to_owned()
+        ),
+        ms().parse_sql_statements(create_inline_tvf_without_subquery_or_bare_select)
+            .unwrap_err()
+    );
+}
+
+#[test]
+fn parse_create_function_parameter_default_values() {
+    let single_default_sql =
+        "CREATE FUNCTION test_func(@param1 INT = 42) RETURNS INT AS BEGIN RETURN @param1; END";
+    assert_eq!(
+        ms().verified_stmt(single_default_sql),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: false,
+            temporary: false,
+            if_not_exists: false,
+            name: ObjectName::from(vec![Ident::new("test_func")]),
+            args: Some(vec![OperateFunctionArg {
+                mode: None,
+                name: Some(Ident::new("@param1")),
+                data_type: DataType::Int(None),
+                default_expr: Some(Expr::Value((number("42")).with_empty_span())),
+            },]),
+            return_type: Some(DataType::Int(None)),
+            function_body: Some(CreateFunctionBody::AsBeginEnd(BeginEndStatements {
+                begin_token: AttachedToken::empty(),
+                statements: vec![Statement::Return(ReturnStatement {
+                    value: Some(ReturnStatementValue::Expr(Expr::Identifier(Ident::new(
+                        "@param1"
+                    )))),
+                })],
+                end_token: AttachedToken::empty(),
+            })),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            using: None,
+            language: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        }),
+    );
 }
 
 #[test]
@@ -203,42 +447,29 @@ fn parse_mssql_openjson() {
     assert_eq!(
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "t_test_table".into(),
-                    quote_style: None,
-                },]),
+                name: ObjectName::from(vec![Ident::new("t_test_table")]),
                 alias: Some(TableAlias {
-                    name: Ident {
-                        value: "A".into(),
-                        quote_style: None
-                    },
+                    name: Ident::new("A"),
                     columns: vec![]
                 }),
                 args: None,
                 with_hints: vec![],
                 version: None,
                 with_ordinality: false,
-                partitions: vec![]
+                partitions: vec![],
+                json_path: None,
+                sample: None,
+                index_hints: vec![]
             },
             joins: vec![Join {
                 relation: TableFactor::OpenJsonTable {
-                    json_expr: Expr::CompoundIdentifier(vec![
-                        Ident {
-                            value: "A".into(),
-                            quote_style: None,
-                        },
-                        Ident {
-                            value: "param".into(),
-                            quote_style: None,
-                        }
-                    ]),
+                    json_expr: Expr::CompoundIdentifier(
+                        vec![Ident::new("A"), Ident::new("param"),]
+                    ),
                     json_path: Some(Value::SingleQuotedString("$.config".into())),
                     columns: vec![
                         OpenJsonTableColumn {
-                            name: Ident {
-                                value: "kind".into(),
-                                quote_style: None,
-                            },
+                            name: Ident::new("kind"),
                             r#type: DataType::Varchar(Some(CharacterLength::IntegerLength {
                                 length: 20,
                                 unit: None
@@ -250,6 +481,7 @@ fn parse_mssql_openjson() {
                             name: Ident {
                                 value: "id_list".into(),
                                 quote_style: Some('['),
+                                span: Span::empty(),
                             },
                             r#type: DataType::Nvarchar(Some(CharacterLength::Max)),
                             path: Some("$.id_list".into()),
@@ -257,10 +489,7 @@ fn parse_mssql_openjson() {
                         }
                     ],
                     alias: Some(TableAlias {
-                        name: Ident {
-                            value: "B".into(),
-                            quote_style: None
-                        },
+                        name: Ident::new("B"),
                         columns: vec![]
                     })
                 },
@@ -278,42 +507,29 @@ fn parse_mssql_openjson() {
     assert_eq!(
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "t_test_table".into(),
-                    quote_style: None,
-                },]),
+                name: ObjectName::from(vec![Ident::new("t_test_table"),]),
                 alias: Some(TableAlias {
-                    name: Ident {
-                        value: "A".into(),
-                        quote_style: None
-                    },
+                    name: Ident::new("A"),
                     columns: vec![]
                 }),
                 args: None,
                 with_hints: vec![],
                 version: None,
                 with_ordinality: false,
-                partitions: vec![]
+                partitions: vec![],
+                json_path: None,
+                sample: None,
+                index_hints: vec![]
             },
             joins: vec![Join {
                 relation: TableFactor::OpenJsonTable {
-                    json_expr: Expr::CompoundIdentifier(vec![
-                        Ident {
-                            value: "A".into(),
-                            quote_style: None,
-                        },
-                        Ident {
-                            value: "param".into(),
-                            quote_style: None,
-                        }
-                    ]),
+                    json_expr: Expr::CompoundIdentifier(
+                        vec![Ident::new("A"), Ident::new("param"),]
+                    ),
                     json_path: None,
                     columns: vec![
                         OpenJsonTableColumn {
-                            name: Ident {
-                                value: "kind".into(),
-                                quote_style: None,
-                            },
+                            name: Ident::new("kind"),
                             r#type: DataType::Varchar(Some(CharacterLength::IntegerLength {
                                 length: 20,
                                 unit: None
@@ -325,6 +541,7 @@ fn parse_mssql_openjson() {
                             name: Ident {
                                 value: "id_list".into(),
                                 quote_style: Some('['),
+                                span: Span::empty(),
                             },
                             r#type: DataType::Nvarchar(Some(CharacterLength::Max)),
                             path: Some("$.id_list".into()),
@@ -332,10 +549,7 @@ fn parse_mssql_openjson() {
                         }
                     ],
                     alias: Some(TableAlias {
-                        name: Ident {
-                            value: "B".into(),
-                            quote_style: None
-                        },
+                        name: Ident::new("B"),
                         columns: vec![]
                     })
                 },
@@ -353,42 +567,29 @@ fn parse_mssql_openjson() {
     assert_eq!(
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "t_test_table".into(),
-                    quote_style: None,
-                },]),
+                name: ObjectName::from(vec![Ident::new("t_test_table")]),
                 alias: Some(TableAlias {
-                    name: Ident {
-                        value: "A".into(),
-                        quote_style: None
-                    },
+                    name: Ident::new("A"),
                     columns: vec![]
                 }),
                 args: None,
                 with_hints: vec![],
                 version: None,
                 with_ordinality: false,
-                partitions: vec![]
+                partitions: vec![],
+                json_path: None,
+                sample: None,
+                index_hints: vec![]
             },
             joins: vec![Join {
                 relation: TableFactor::OpenJsonTable {
-                    json_expr: Expr::CompoundIdentifier(vec![
-                        Ident {
-                            value: "A".into(),
-                            quote_style: None,
-                        },
-                        Ident {
-                            value: "param".into(),
-                            quote_style: None,
-                        }
-                    ]),
+                    json_expr: Expr::CompoundIdentifier(
+                        vec![Ident::new("A"), Ident::new("param"),]
+                    ),
                     json_path: None,
                     columns: vec![
                         OpenJsonTableColumn {
-                            name: Ident {
-                                value: "kind".into(),
-                                quote_style: None,
-                            },
+                            name: Ident::new("kind"),
                             r#type: DataType::Varchar(Some(CharacterLength::IntegerLength {
                                 length: 20,
                                 unit: None
@@ -400,6 +601,7 @@ fn parse_mssql_openjson() {
                             name: Ident {
                                 value: "id_list".into(),
                                 quote_style: Some('['),
+                                span: Span::empty(),
                             },
                             r#type: DataType::Nvarchar(Some(CharacterLength::Max)),
                             path: None,
@@ -407,10 +609,7 @@ fn parse_mssql_openjson() {
                         }
                     ],
                     alias: Some(TableAlias {
-                        name: Ident {
-                            value: "B".into(),
-                            quote_style: None
-                        },
+                        name: Ident::new("B"),
                         columns: vec![]
                     })
                 },
@@ -428,42 +627,29 @@ fn parse_mssql_openjson() {
     assert_eq!(
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "t_test_table".into(),
-                    quote_style: None,
-                },]),
+                name: ObjectName::from(vec![Ident::new("t_test_table")]),
                 alias: Some(TableAlias {
-                    name: Ident {
-                        value: "A".into(),
-                        quote_style: None
-                    },
+                    name: Ident::new("A"),
                     columns: vec![]
                 }),
                 args: None,
                 with_hints: vec![],
                 version: None,
                 with_ordinality: false,
-                partitions: vec![]
+                partitions: vec![],
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             joins: vec![Join {
                 relation: TableFactor::OpenJsonTable {
-                    json_expr: Expr::CompoundIdentifier(vec![
-                        Ident {
-                            value: "A".into(),
-                            quote_style: None,
-                        },
-                        Ident {
-                            value: "param".into(),
-                            quote_style: None,
-                        }
-                    ]),
+                    json_expr: Expr::CompoundIdentifier(
+                        vec![Ident::new("A"), Ident::new("param"),]
+                    ),
                     json_path: Some(Value::SingleQuotedString("$.config".into())),
                     columns: vec![],
                     alias: Some(TableAlias {
-                        name: Ident {
-                            value: "B".into(),
-                            quote_style: None
-                        },
+                        name: Ident::new("B"),
                         columns: vec![]
                     })
                 },
@@ -481,42 +667,29 @@ fn parse_mssql_openjson() {
     assert_eq!(
         vec![TableWithJoins {
             relation: TableFactor::Table {
-                name: ObjectName(vec![Ident {
-                    value: "t_test_table".into(),
-                    quote_style: None,
-                },]),
+                name: ObjectName::from(vec![Ident::new("t_test_table")]),
                 alias: Some(TableAlias {
-                    name: Ident {
-                        value: "A".into(),
-                        quote_style: None
-                    },
+                    name: Ident::new("A"),
                     columns: vec![]
                 }),
                 args: None,
                 with_hints: vec![],
                 version: None,
                 with_ordinality: false,
-                partitions: vec![]
+                partitions: vec![],
+                json_path: None,
+                sample: None,
+                index_hints: vec![],
             },
             joins: vec![Join {
                 relation: TableFactor::OpenJsonTable {
-                    json_expr: Expr::CompoundIdentifier(vec![
-                        Ident {
-                            value: "A".into(),
-                            quote_style: None,
-                        },
-                        Ident {
-                            value: "param".into(),
-                            quote_style: None,
-                        }
-                    ]),
+                    json_expr: Expr::CompoundIdentifier(
+                        vec![Ident::new("A"), Ident::new("param"),]
+                    ),
                     json_path: None,
                     columns: vec![],
                     alias: Some(TableAlias {
-                        name: Ident {
-                            value: "B".into(),
-                            quote_style: None
-                        },
+                        name: Ident::new("B"),
                         columns: vec![]
                     })
                 },
@@ -534,7 +707,9 @@ fn parse_mssql_top_paren() {
     let select = ms_and_generic().verified_only_select(sql);
     let top = select.top.unwrap();
     assert_eq!(
-        Some(TopQuantity::Expr(Expr::Value(number("5")))),
+        Some(TopQuantity::Expr(Expr::Value(
+            (number("5")).with_empty_span()
+        ))),
         top.quantity
     );
     assert!(!top.percent);
@@ -546,7 +721,9 @@ fn parse_mssql_top_percent() {
     let select = ms_and_generic().verified_only_select(sql);
     let top = select.top.unwrap();
     assert_eq!(
-        Some(TopQuantity::Expr(Expr::Value(number("5")))),
+        Some(TopQuantity::Expr(Expr::Value(
+            (number("5")).with_empty_span()
+        ))),
         top.quantity
     );
     assert!(top.percent);
@@ -558,7 +735,9 @@ fn parse_mssql_top_with_ties() {
     let select = ms_and_generic().verified_only_select(sql);
     let top = select.top.unwrap();
     assert_eq!(
-        Some(TopQuantity::Expr(Expr::Value(number("5")))),
+        Some(TopQuantity::Expr(Expr::Value(
+            (number("5")).with_empty_span()
+        ))),
         top.quantity
     );
     assert!(top.with_ties);
@@ -570,7 +749,9 @@ fn parse_mssql_top_percent_with_ties() {
     let select = ms_and_generic().verified_only_select(sql);
     let top = select.top.unwrap();
     assert_eq!(
-        Some(TopQuantity::Expr(Expr::Value(number("10")))),
+        Some(TopQuantity::Expr(Expr::Value(
+            (number("10")).with_empty_span()
+        ))),
         top.quantity
     );
     assert!(top.percent);
@@ -599,9 +780,10 @@ fn parse_mssql_create_role() {
             assert_eq_vec(&["mssql"], &names);
             assert_eq!(
                 authorization_owner,
-                Some(ObjectName(vec![Ident {
+                Some(ObjectName::from(vec![Ident {
                     value: "helena".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]))
             );
         }
@@ -617,12 +799,14 @@ fn parse_alter_role() {
         [Statement::AlterRole {
             name: Ident {
                 value: "old_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::RenameRole {
                 role_name: Ident {
                     value: "new_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             },
         }]
@@ -634,12 +818,14 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::AddMember {
                 member_name: Ident {
                     value: "new_member".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             },
         }
@@ -651,12 +837,14 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::DropMember {
                 member_name: Ident {
                     value: "old_member".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             },
         }
@@ -677,10 +865,12 @@ fn parse_delimited_identifiers() {
             args,
             with_hints,
             version,
-            with_ordinality: _,
-            partitions: _,
+            ..
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -699,7 +889,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -731,11 +922,11 @@ fn parse_table_name_in_square_brackets() {
     let select = ms().verified_only_select(r#"SELECT [a column] FROM [a schema].[a table]"#);
     if let TableFactor::Table { name, .. } = only(select.from).relation {
         assert_eq!(
-            vec![
+            ObjectName::from(vec![
                 Ident::with_quote('[', "a schema"),
                 Ident::with_quote('[', "a table")
-            ],
-            name.0
+            ]),
+            name
         );
     } else {
         panic!("Expecting TableFactor::Table");
@@ -786,165 +977,6 @@ fn parse_for_json_expect_ast() {
 
 #[test]
 fn parse_mssql_json_object() {
-    let select = ms().verified_only_select("SELECT JSON_OBJECT('name' : 'value', 'type' : 1)");
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, .. }),
-            ..
-        }) => assert_eq!(
-            &[
-                FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString("name".into())),
-                    arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                        "value".into()
-                    ))),
-                    operator: FunctionArgOperator::Colon
-                },
-                FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString("type".into())),
-                    arg: FunctionArgExpr::Expr(Expr::Value(number("1"))),
-                    operator: FunctionArgOperator::Colon
-                }
-            ],
-            &args[..]
-        ),
-        _ => unreachable!(),
-    }
-    let select = ms()
-        .verified_only_select("SELECT JSON_OBJECT('name' : 'value', 'type' : NULL ABSENT ON NULL)");
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
-            ..
-        }) => {
-            assert_eq!(
-                &[
-                    FunctionArg::ExprNamed {
-                        name: Expr::Value(Value::SingleQuotedString("name".into())),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                            "value".into()
-                        ))),
-                        operator: FunctionArgOperator::Colon
-                    },
-                    FunctionArg::ExprNamed {
-                        name: Expr::Value(Value::SingleQuotedString("type".into())),
-                        arg: FunctionArgExpr::Expr(Expr::Value(Value::Null)),
-                        operator: FunctionArgOperator::Colon
-                    }
-                ],
-                &args[..]
-            );
-            assert_eq!(
-                &[FunctionArgumentClause::JsonNullClause(
-                    JsonNullClause::AbsentOnNull
-                )],
-                &clauses[..]
-            );
-        }
-        _ => unreachable!(),
-    }
-    let select = ms().verified_only_select("SELECT JSON_OBJECT(NULL ON NULL)");
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
-            ..
-        }) => {
-            assert!(args.is_empty());
-            assert_eq!(
-                &[FunctionArgumentClause::JsonNullClause(
-                    JsonNullClause::NullOnNull
-                )],
-                &clauses[..]
-            );
-        }
-        _ => unreachable!(),
-    }
-    let select = ms().verified_only_select("SELECT JSON_OBJECT(ABSENT ON NULL)");
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
-            ..
-        }) => {
-            assert!(args.is_empty());
-            assert_eq!(
-                &[FunctionArgumentClause::JsonNullClause(
-                    JsonNullClause::AbsentOnNull
-                )],
-                &clauses[..]
-            );
-        }
-        _ => unreachable!(),
-    }
-    let select = ms().verified_only_select(
-        "SELECT JSON_OBJECT('name' : 'value', 'type' : JSON_ARRAY(1, 2) ABSENT ON NULL)",
-    );
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
-            ..
-        }) => {
-            assert_eq!(
-                &FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString("name".into())),
-                    arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                        "value".into()
-                    ))),
-                    operator: FunctionArgOperator::Colon
-                },
-                &args[0]
-            );
-            assert!(matches!(
-                args[1],
-                FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
-                    arg: FunctionArgExpr::Expr(Expr::Function(_)),
-                    operator: FunctionArgOperator::Colon
-                }
-            ));
-            assert_eq!(
-                &[FunctionArgumentClause::JsonNullClause(
-                    JsonNullClause::AbsentOnNull
-                )],
-                &clauses[..]
-            );
-        }
-        _ => unreachable!(),
-    }
-    let select = ms().verified_only_select(
-        "SELECT JSON_OBJECT('name' : 'value', 'type' : JSON_OBJECT('type_id' : 1, 'name' : 'a') NULL ON NULL)",
-    );
-    match expr_from_projection(&select.projection[0]) {
-        Expr::Function(Function {
-            args: FunctionArguments::List(FunctionArgumentList { args, clauses, .. }),
-            ..
-        }) => {
-            assert_eq!(
-                &FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString("name".into())),
-                    arg: FunctionArgExpr::Expr(Expr::Value(Value::SingleQuotedString(
-                        "value".into()
-                    ))),
-                    operator: FunctionArgOperator::Colon
-                },
-                &args[0]
-            );
-            assert!(matches!(
-                args[1],
-                FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
-                    arg: FunctionArgExpr::Expr(Expr::Function(_)),
-                    operator: FunctionArgOperator::Colon
-                }
-            ));
-            assert_eq!(
-                &[FunctionArgumentClause::JsonNullClause(
-                    JsonNullClause::NullOnNull
-                )],
-                &clauses[..]
-            );
-        }
-        _ => unreachable!(),
-    }
     let select = ms().verified_only_select(
         "SELECT JSON_OBJECT('user_name' : USER_NAME(), LOWER(@id_key) : @id_value, 'sid' : (SELECT @@SPID) ABSENT ON NULL)",
     );
@@ -956,7 +988,10 @@ fn parse_mssql_json_object() {
             assert!(matches!(
                 args[0],
                 FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
                     arg: FunctionArgExpr::Expr(Expr::Function(_)),
                     operator: FunctionArgOperator::Colon
                 }
@@ -972,7 +1007,10 @@ fn parse_mssql_json_object() {
             assert!(matches!(
                 args[2],
                 FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
                     arg: FunctionArgExpr::Expr(Expr::Subquery(_)),
                     operator: FunctionArgOperator::Colon
                 }
@@ -1003,7 +1041,10 @@ fn parse_mssql_json_object() {
             assert!(matches!(
                 args[0],
                 FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
                     arg: FunctionArgExpr::Expr(Expr::CompoundIdentifier(_)),
                     operator: FunctionArgOperator::Colon
                 }
@@ -1011,7 +1052,10 @@ fn parse_mssql_json_object() {
             assert!(matches!(
                 args[1],
                 FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
                     arg: FunctionArgExpr::Expr(Expr::CompoundIdentifier(_)),
                     operator: FunctionArgOperator::Colon
                 }
@@ -1019,7 +1063,10 @@ fn parse_mssql_json_object() {
             assert!(matches!(
                 args[2],
                 FunctionArg::ExprNamed {
-                    name: Expr::Value(Value::SingleQuotedString(_)),
+                    name: Expr::Value(ValueWithSpan {
+                        value: Value::SingleQuotedString(_),
+                        span: _
+                    }),
                     arg: FunctionArgExpr::Expr(Expr::CompoundIdentifier(_)),
                     operator: FunctionArgOperator::Colon
                 }
@@ -1040,11 +1087,17 @@ fn parse_mssql_json_array() {
             assert_eq!(
                 &[
                     FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                        Value::SingleQuotedString("a".into())
+                        (Value::SingleQuotedString("a".into())).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (number("1")).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (Value::Null).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (number("2")).with_empty_span()
                     ))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("1")))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(Value::Null))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("2")))),
                 ],
                 &args[..]
             );
@@ -1066,11 +1119,17 @@ fn parse_mssql_json_array() {
             assert_eq!(
                 &[
                     FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                        Value::SingleQuotedString("a".into())
+                        (Value::SingleQuotedString("a".into())).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (number("1")).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (Value::Null).with_empty_span()
+                    ))),
+                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        (number("2")).with_empty_span()
                     ))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("1")))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(Value::Null))),
-                    FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("2")))),
                 ],
                 &args[..]
             );
@@ -1125,7 +1184,7 @@ fn parse_mssql_json_array() {
         }) => {
             assert_eq!(
                 &FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                    Value::SingleQuotedString("a".into())
+                    (Value::SingleQuotedString("a".into())).with_empty_span()
                 ))),
                 &args[0]
             );
@@ -1152,7 +1211,7 @@ fn parse_mssql_json_array() {
         }) => {
             assert_eq!(
                 &FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
-                    Value::SingleQuotedString("a".into())
+                    (Value::SingleQuotedString("a".into())).with_empty_span()
                 ))),
                 &args[0]
             );
@@ -1174,7 +1233,9 @@ fn parse_mssql_json_array() {
             ..
         }) => {
             assert_eq!(
-                &FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(number("1")))),
+                &FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                    (number("1")).with_empty_span()
+                ))),
                 &args[0]
             );
             assert!(matches!(
@@ -1252,15 +1313,15 @@ fn parse_convert() {
         unreachable!()
     };
     assert!(!is_try);
-    assert_eq!(Expr::Value(number("1")), *expr);
+    assert_eq!(Expr::value(number("1")), *expr);
     assert_eq!(Some(DataType::Int(None)), data_type);
     assert!(charset.is_none());
     assert!(target_before_value);
     assert_eq!(
         vec![
-            Expr::Value(number("2")),
-            Expr::Value(number("3")),
-            Expr::Value(Value::Null),
+            Expr::value(number("2")),
+            Expr::value(number("3")),
+            Expr::Value((Value::Null).with_empty_span()),
         ],
         styles
     );
@@ -1289,32 +1350,33 @@ fn parse_substring_in_select() {
                     with: None,
 
                     body: Box::new(SetExpr::Select(Box::new(Select {
+                        select_token: AttachedToken::empty(),
                         distinct: Some(Distinct::Distinct),
                         top: None,
                         top_before_distinct: false,
                         projection: vec![SelectItem::UnnamedExpr(Expr::Substring {
                             expr: Box::new(Expr::Identifier(Ident {
                                 value: "description".to_string(),
-                                quote_style: None
+                                quote_style: None,
+                                span: Span::empty(),
                             })),
-                            substring_from: Some(Box::new(Expr::Value(number("0")))),
-                            substring_for: Some(Box::new(Expr::Value(number("1")))),
+                            substring_from: Some(Box::new(Expr::Value(
+                                (number("0")).with_empty_span()
+                            ))),
+                            substring_for: Some(Box::new(Expr::Value(
+                                (number("1")).with_empty_span()
+                            ))),
                             special: true,
+                            shorthand: false,
                         })],
+                        exclude: None,
                         into: None,
                         from: vec![TableWithJoins {
-                            relation: TableFactor::Table {
-                                name: ObjectName(vec![Ident {
-                                    value: "test".to_string(),
-                                    quote_style: None
-                                }]),
-                                alias: None,
-                                args: None,
-                                with_hints: vec![],
-                                version: None,
-                                partitions: vec![],
-                                with_ordinality: false,
-                            },
+                            relation: table_from_name(ObjectName::from(vec![Ident {
+                                value: "test".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            }])),
                             joins: vec![]
                         }],
                         lateral_views: vec![],
@@ -1330,16 +1392,16 @@ fn parse_substring_in_select() {
                         window_before_qualify: false,
                         value_table_mode: None,
                         connect_by: None,
+                        flavor: SelectFlavor::Standard,
                     }))),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 }),
                 query
             );
@@ -1359,7 +1421,8 @@ fn parse_mssql_declare() {
                 Declare {
                     names: vec![Ident {
                         value: "@foo".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }],
                     data_type: None,
                     assignment: None,
@@ -1373,7 +1436,8 @@ fn parse_mssql_declare() {
                 Declare {
                     names: vec![Ident {
                         value: "@bar".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }],
                     data_type: Some(Int(None)),
                     assignment: None,
@@ -1387,12 +1451,13 @@ fn parse_mssql_declare() {
                 Declare {
                     names: vec![Ident {
                         value: "@baz".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }],
                     data_type: Some(Text),
-                    assignment: Some(MsSqlAssignment(Box::new(Expr::Value(SingleQuotedString(
-                        "foobar".to_string()
-                    ))))),
+                    assignment: Some(MsSqlAssignment(Box::new(Expr::Value(
+                        (SingleQuotedString("foobar".to_string())).with_empty_span()
+                    )))),
                     declare_type: None,
                     binary: None,
                     sensitive: None,
@@ -1411,10 +1476,7 @@ fn parse_mssql_declare() {
         vec![
             Statement::Declare {
                 stmts: vec![Declare {
-                    names: vec![Ident {
-                        value: "@bar".to_string(),
-                        quote_style: None
-                    }],
+                    names: vec![Ident::new("@bar"),],
                     data_type: Some(Int(None)),
                     assignment: None,
                     declare_type: None,
@@ -1425,32 +1487,38 @@ fn parse_mssql_declare() {
                     for_query: None
                 }]
             },
-            Statement::SetVariable {
-                local: false,
+            Statement::Set(Set::SingleAssignment {
+                scope: None,
                 hivevar: false,
-                variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("@bar")])),
-                value: vec![Expr::Value(Value::Number("2".parse().unwrap(), false))],
-            },
+                variable: ObjectName::from(vec![Ident::new("@bar")]),
+                values: vec![Expr::Value(
+                    (Value::Number("2".parse().unwrap(), false)).with_empty_span()
+                )],
+            }),
             Statement::Query(Box::new(Query {
                 with: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 order_by: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
+
                 body: Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken::empty(),
                     distinct: None,
                     top: None,
                     top_before_distinct: false,
                     projection: vec![SelectItem::UnnamedExpr(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident::new("@bar"))),
                         op: BinaryOperator::Multiply,
-                        right: Box::new(Expr::Value(Value::Number("4".parse().unwrap(), false))),
+                        right: Box::new(Expr::Value(
+                            (Value::Number("4".parse().unwrap(), false)).with_empty_span()
+                        )),
                     })],
+                    exclude: None,
                     into: None,
                     from: vec![],
                     lateral_views: vec![],
@@ -1466,11 +1534,132 @@ fn parse_mssql_declare() {
                     qualify: None,
                     value_table_mode: None,
                     connect_by: None,
+                    flavor: SelectFlavor::Standard,
                 })))
             }))
         ],
         ast
     );
+
+    let declare_cursor_for_select =
+        "DECLARE vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor";
+    let _ = ms().verified_stmt(declare_cursor_for_select);
+}
+
+#[test]
+fn test_mssql_cursor() {
+    let full_cursor_usage = "\
+        DECLARE Employee_Cursor CURSOR FOR \
+        SELECT LastName, FirstName \
+        FROM AdventureWorks2022.HumanResources.vEmployee \
+        WHERE LastName LIKE 'B%'; \
+        \
+        OPEN Employee_Cursor; \
+        \
+        FETCH NEXT FROM Employee_Cursor; \
+        \
+        WHILE @@FETCH_STATUS = 0 \
+        BEGIN \
+            FETCH NEXT FROM Employee_Cursor; \
+        END; \
+        \
+        CLOSE Employee_Cursor; \
+        DEALLOCATE Employee_Cursor\
+    ";
+    let _ = ms().statements_parse_to(full_cursor_usage, "");
+}
+
+#[test]
+fn test_mssql_while_statement() {
+    let while_single_statement = "WHILE 1 = 0 PRINT 'Hello World';";
+    let stmt = ms().verified_stmt(while_single_statement);
+    assert_eq!(
+        stmt,
+        Statement::While(sqlparser::ast::WhileStatement {
+            while_block: ConditionalStatementBlock {
+                start_token: AttachedToken(TokenWithSpan {
+                    token: Token::Word(Word {
+                        value: "WHILE".to_string(),
+                        quote_style: None,
+                        keyword: Keyword::WHILE
+                    }),
+                    span: Span::empty()
+                }),
+                condition: Some(Expr::BinaryOp {
+                    left: Box::new(Expr::Value(
+                        (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                    )),
+                    op: BinaryOperator::Eq,
+                    right: Box::new(Expr::Value(
+                        (Value::Number("0".parse().unwrap(), false)).with_empty_span()
+                    )),
+                }),
+                then_token: None,
+                conditional_statements: ConditionalStatements::Sequence {
+                    statements: vec![Statement::Print(PrintStatement {
+                        message: Box::new(Expr::Value(
+                            (Value::SingleQuotedString("Hello World".to_string()))
+                                .with_empty_span()
+                        )),
+                    })],
+                }
+            }
+        })
+    );
+
+    let while_begin_end = "\
+        WHILE @@FETCH_STATUS = 0 \
+        BEGIN \
+            FETCH NEXT FROM Employee_Cursor; \
+        END\
+    ";
+    let _ = ms().verified_stmt(while_begin_end);
+
+    let while_begin_end_multiple_statements = "\
+        WHILE @@FETCH_STATUS = 0 \
+        BEGIN \
+            FETCH NEXT FROM Employee_Cursor; \
+            PRINT 'Hello World'; \
+        END\
+    ";
+    let _ = ms().verified_stmt(while_begin_end_multiple_statements);
+}
+
+#[test]
+fn test_parse_raiserror() {
+    let sql = r#"RAISERROR('This is a test', 16, 1)"#;
+    let s = ms().verified_stmt(sql);
+    assert_eq!(
+        s,
+        Statement::RaisError {
+            message: Box::new(Expr::Value(
+                (Value::SingleQuotedString("This is a test".to_string())).with_empty_span()
+            )),
+            severity: Box::new(Expr::Value(
+                (Value::Number("16".parse().unwrap(), false)).with_empty_span()
+            )),
+            state: Box::new(Expr::Value(
+                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+            )),
+            arguments: vec![],
+            options: vec![],
+        }
+    );
+
+    let sql = r#"RAISERROR('This is a test', 16, 1) WITH NOWAIT"#;
+    let _ = ms().verified_stmt(sql);
+
+    let sql = r#"RAISERROR('This is a test', 16, 1, 'ARG') WITH SETERROR, LOG"#;
+    let _ = ms().verified_stmt(sql);
+
+    let sql = r#"RAISERROR(N'This is message %s %d.', 10, 1, N'number', 5)"#;
+    let _ = ms().verified_stmt(sql);
+
+    let sql = r#"RAISERROR(N'<<%*.*s>>', 10, 1, 7, 3, N'abcde')"#;
+    let _ = ms().verified_stmt(sql);
+
+    let sql = r#"RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)"#;
+    let _ = ms().verified_stmt(sql);
 }
 
 #[test]
@@ -1487,16 +1676,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            ms().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            ms().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                ms().verified_stmt(&format!("USE {}{}{}", quote, object_name, quote)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                ms().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -1515,16 +1704,18 @@ fn parse_create_table_with_valid_options() {
                     key: Ident {
                         value: "DISTRIBUTION".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                     value: Expr::Identifier(Ident {
                         value: "ROUND_ROBIN".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     })
                 },
                 SqlOption::Partition {
                     column_name: "column_a".into(),
                     range_direction: None,
-                    for_values: vec![Expr::Value(test_utils::number("10")), Expr::Value(test_utils::number("11"))] ,
+                    for_values: vec![Expr::Value((test_utils::number("10")).with_empty_span()), Expr::Value((test_utils::number("11")).with_empty_span())] ,
                 },
             ],
         ),
@@ -1535,8 +1726,8 @@ fn parse_create_table_with_valid_options() {
                         column_name: "column_a".into(),
                         range_direction: Some(PartitionRangeDirection::Left),
                         for_values: vec![
-                            Expr::Value(test_utils::number("10")),
-                            Expr::Value(test_utils::number("11")),
+                            Expr::Value((test_utils::number("10")).with_empty_span()),
+                            Expr::Value((test_utils::number("11")).with_empty_span()),
                         ],
                     }
             ],
@@ -1562,6 +1753,7 @@ fn parse_create_table_with_valid_options() {
                             name: Ident {
                                 value: "column_a".to_string(),
                                 quote_style: None,
+                                span: Span::empty(),
                             },
                             asc: Some(true),
                         },
@@ -1569,6 +1761,7 @@ fn parse_create_table_with_valid_options() {
                             name: Ident {
                                 value: "column_b".to_string(),
                                 quote_style: None,
+                                span: Span::empty(),
                             },
                             asc: Some(false),
                         },
@@ -1576,6 +1769,7 @@ fn parse_create_table_with_valid_options() {
                             name: Ident {
                                 value: "column_c".to_string(),
                                 quote_style: None,
+                                span: Span::empty(),
                             },
                             asc: None,
                         },
@@ -1589,17 +1783,20 @@ fn parse_create_table_with_valid_options() {
                     key: Ident {
                         value: "DISTRIBUTION".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                     value: Expr::Function(
                         Function {
-                            name: ObjectName(
+                            name: ObjectName::from(
                                 vec![
                                     Ident {
                                         value: "HASH".to_string(),
                                         quote_style: None,
+                                        span: Span::empty(),
                                     },
                                 ],
                             ),
+                            uses_odbc_syntax: false,
                             parameters: FunctionArguments::None,
                             args: FunctionArguments::List(
                                 FunctionArgumentList {
@@ -1611,6 +1808,7 @@ fn parse_create_table_with_valid_options() {
                                                     Ident {
                                                         value: "column_a".to_string(),
                                                         quote_style: None,
+                                                        span: Span::empty(),
                                                     },
                                                 ),
                                             ),
@@ -1621,6 +1819,7 @@ fn parse_create_table_with_valid_options() {
                                                     Ident {
                                                         value: "column_b".to_string(),
                                                         quote_style: None,
+                                                        span: Span::empty(),
                                                     },
                                                 ),
                                             ),
@@ -1652,36 +1851,37 @@ fn parse_create_table_with_valid_options() {
                 if_not_exists: false,
                 transient: false,
                 volatile: false,
-                name: ObjectName(vec![Ident {
+                name: ObjectName::from(vec![Ident {
                     value: "mytable".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },],),
                 columns: vec![
                     ColumnDef {
                         name: Ident {
                             value: "column_a".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         },
                         data_type: Int(None,),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident {
                             value: "column_b".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         },
                         data_type: Int(None,),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident {
                             value: "column_c".to_string(),
                             quote_style: None,
+                            span: Span::empty(),
                         },
                         data_type: Int(None,),
-                        collation: None,
                         options: vec![],
                     },
                 ],
@@ -1693,19 +1893,13 @@ fn parse_create_table_with_valid_options() {
                     storage: None,
                     location: None,
                 },),
-                table_properties: vec![],
-                with_options,
                 file_format: None,
                 location: None,
                 query: None,
                 without_rowid: false,
                 like: None,
                 clone: None,
-                engine: None,
                 comment: None,
-                auto_increment_offset: None,
-                default_charset: None,
-                collation: None,
                 on_commit: None,
                 on_cluster: None,
                 primary_key: None,
@@ -1713,8 +1907,9 @@ fn parse_create_table_with_valid_options() {
                 partition_by: None,
                 cluster_by: None,
                 clustered_by: None,
-                options: None,
+                inherits: None,
                 strict: false,
+                iceberg: false,
                 copy_grants: false,
                 enable_schema_evolution: None,
                 change_tracking: None,
@@ -1724,11 +1919,33 @@ fn parse_create_table_with_valid_options() {
                 with_aggregation_policy: None,
                 with_row_access_policy: None,
                 with_tags: None,
+                base_location: None,
+                external_volume: None,
+                catalog: None,
+                catalog_sync: None,
+                storage_serialization_policy: None,
+                table_options: CreateTableOptions::With(with_options)
             })
         );
     }
 }
 
+#[test]
+fn parse_nested_slash_star_comment() {
+    let sql = r#"
+    select
+    /*
+       comment level 1
+       /*
+          comment level 2
+       */
+    */
+    1;
+    "#;
+    let canonical = "SELECT 1";
+    ms().one_statement_parses_to(sql, canonical);
+}
+
 #[test]
 fn parse_create_table_with_invalid_options() {
     let invalid_cases = vec![
@@ -1790,8 +2007,8 @@ fn parse_create_table_with_identity_column() {
                         IdentityProperty {
                             parameters: Some(IdentityPropertyFormatKind::FunctionCall(
                                 IdentityParameters {
-                                    seed: Expr::Value(number("1")),
-                                    increment: Expr::Value(number("1")),
+                                    seed: Expr::value(number("1")),
+                                    increment: Expr::value(number("1")),
                                 },
                             )),
                             order: None,
@@ -1817,17 +2034,20 @@ fn parse_create_table_with_identity_column() {
                 if_not_exists: false,
                 transient: false,
                 volatile: false,
-                name: ObjectName(vec![Ident {
+                iceberg: false,
+                name: ObjectName::from(vec![Ident {
                     value: "mytable".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 },],),
                 columns: vec![ColumnDef {
                     name: Ident {
                         value: "columnA".to_string(),
                         quote_style: None,
+                        span: Span::empty(),
                     },
                     data_type: Int(None,),
-                    collation: None,
+
                     options: column_options,
                 },],
                 constraints: vec![],
@@ -1838,19 +2058,13 @@ fn parse_create_table_with_identity_column() {
                     storage: None,
                     location: None,
                 },),
-                table_properties: vec![],
-                with_options: vec![],
                 file_format: None,
                 location: None,
                 query: None,
                 without_rowid: false,
                 like: None,
                 clone: None,
-                engine: None,
                 comment: None,
-                auto_increment_offset: None,
-                default_charset: None,
-                collation: None,
                 on_commit: None,
                 on_cluster: None,
                 primary_key: None,
@@ -1858,7 +2072,7 @@ fn parse_create_table_with_identity_column() {
                 partition_by: None,
                 cluster_by: None,
                 clustered_by: None,
-                options: None,
+                inherits: None,
                 strict: false,
                 copy_grants: false,
                 enable_schema_evolution: None,
@@ -1869,6 +2083,12 @@ fn parse_create_table_with_identity_column() {
                 with_aggregation_policy: None,
                 with_row_access_policy: None,
                 with_tags: None,
+                base_location: None,
+                external_volume: None,
+                catalog: None,
+                catalog_sync: None,
+                storage_serialization_policy: None,
+                table_options: CreateTableOptions::None
             }),
         );
     }
@@ -1886,9 +2106,404 @@ fn parse_true_false_as_identifiers() {
     );
 }
 
+#[test]
+fn parse_mssql_set_session_value() {
+    ms().verified_stmt(
+        "SET OFFSETS SELECT, FROM, ORDER, TABLE, PROCEDURE, STATEMENT, PARAM, EXECUTE ON",
+    );
+    ms().verified_stmt("SET IDENTITY_INSERT dbo.Tool ON");
+    ms().verified_stmt("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
+    ms().verified_stmt("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
+    ms().verified_stmt("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ");
+    ms().verified_stmt("SET TRANSACTION ISOLATION LEVEL SNAPSHOT");
+    ms().verified_stmt("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");
+    ms().verified_stmt("SET STATISTICS IO ON");
+    ms().verified_stmt("SET STATISTICS XML ON");
+    ms().verified_stmt("SET STATISTICS PROFILE ON");
+    ms().verified_stmt("SET STATISTICS TIME ON");
+    ms().verified_stmt("SET DATEFIRST 7");
+    ms().verified_stmt("SET DATEFIRST @xxx");
+    ms().verified_stmt("SET DATEFIRST @@xxx");
+    ms().verified_stmt("SET DATEFORMAT dmy");
+    ms().verified_stmt("SET DATEFORMAT @datevar");
+    ms().verified_stmt("SET DATEFORMAT @@datevar");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY 'LOW'");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY LOW");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY 8");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY -8");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY @xxx");
+    ms().verified_stmt("SET DEADLOCK_PRIORITY @@xxx");
+    ms().verified_stmt("SET LOCK_TIMEOUT 1800");
+    ms().verified_stmt("SET CONCAT_NULL_YIELDS_NULL ON");
+    ms().verified_stmt("SET CURSOR_CLOSE_ON_COMMIT ON");
+    ms().verified_stmt("SET FIPS_FLAGGER 'level'");
+    ms().verified_stmt("SET FIPS_FLAGGER OFF");
+    ms().verified_stmt("SET LANGUAGE Italian");
+    ms().verified_stmt("SET QUOTED_IDENTIFIER ON");
+    ms().verified_stmt("SET ARITHABORT ON");
+    ms().verified_stmt("SET ARITHIGNORE OFF");
+    ms().verified_stmt("SET FMTONLY ON");
+    ms().verified_stmt("SET NOCOUNT OFF");
+    ms().verified_stmt("SET NOEXEC ON");
+    ms().verified_stmt("SET NUMERIC_ROUNDABORT ON");
+    ms().verified_stmt("SET QUERY_GOVERNOR_COST_LIMIT 11");
+    ms().verified_stmt("SET ROWCOUNT 4");
+    ms().verified_stmt("SET ROWCOUNT @xxx");
+    ms().verified_stmt("SET ROWCOUNT @@xxx");
+    ms().verified_stmt("SET TEXTSIZE 11");
+    ms().verified_stmt("SET ANSI_DEFAULTS ON");
+    ms().verified_stmt("SET ANSI_NULL_DFLT_OFF ON");
+    ms().verified_stmt("SET ANSI_NULL_DFLT_ON ON");
+    ms().verified_stmt("SET ANSI_NULLS ON");
+    ms().verified_stmt("SET ANSI_PADDING ON");
+    ms().verified_stmt("SET ANSI_WARNINGS ON");
+    ms().verified_stmt("SET FORCEPLAN ON");
+    ms().verified_stmt("SET SHOWPLAN_ALL ON");
+    ms().verified_stmt("SET SHOWPLAN_TEXT ON");
+    ms().verified_stmt("SET SHOWPLAN_XML ON");
+    ms().verified_stmt("SET IMPLICIT_TRANSACTIONS ON");
+    ms().verified_stmt("SET REMOTE_PROC_TRANSACTIONS ON");
+    ms().verified_stmt("SET XACT_ABORT ON");
+    ms().verified_stmt("SET ANSI_NULLS, ANSI_PADDING ON");
+}
+
+#[test]
+fn parse_mssql_if_else() {
+    // Simple statements and blocks
+    ms().verified_stmt("IF 1 = 1 SELECT '1'; ELSE SELECT '2';");
+    ms().verified_stmt("IF 1 = 1 BEGIN SET @A = 1; END ELSE SET @A = 2;");
+    ms().verified_stmt(
+        "IF DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') SELECT 'Weekend'; ELSE SELECT 'Weekday';"
+    );
+    ms().verified_stmt(
+        "IF (SELECT COUNT(*) FROM a.b WHERE c LIKE 'x%') > 1 SELECT 'yes'; ELSE SELECT 'No';",
+    );
+
+    // Multiple statements
+    let stmts = ms()
+        .parse_sql_statements("DECLARE @A INT; IF 1=1 BEGIN SET @A = 1 END ELSE SET @A = 2")
+        .unwrap();
+    match &stmts[..] {
+        [Statement::Declare { .. }, Statement::If(stmt)] => {
+            assert_eq!(
+                stmt.to_string(),
+                "IF 1 = 1 BEGIN SET @A = 1; END ELSE SET @A = 2;"
+            );
+        }
+        _ => panic!("Unexpected statements: {stmts:?}"),
+    }
+}
+
+#[test]
+fn test_mssql_if_else_span() {
+    let sql = "IF 1 = 1 SELECT '1' ELSE SELECT '2'";
+    let mut parser = Parser::new(&MsSqlDialect {}).try_with_sql(sql).unwrap();
+    assert_eq!(
+        parser.parse_statement().unwrap().span(),
+        Span::new(Location::new(1, 1), Location::new(1, sql.len() as u64 + 1))
+    );
+}
+
+#[test]
+fn test_mssql_if_else_multiline_span() {
+    let sql_line1 = "IF 1 = 1";
+    let sql_line2 = "SELECT '1'";
+    let sql_line3 = "ELSE SELECT '2'";
+    let sql = [sql_line1, sql_line2, sql_line3].join("\n");
+    let mut parser = Parser::new(&MsSqlDialect {}).try_with_sql(&sql).unwrap();
+    assert_eq!(
+        parser.parse_statement().unwrap().span(),
+        Span::new(
+            Location::new(1, 1),
+            Location::new(3, sql_line3.len() as u64 + 1)
+        )
+    );
+}
+
+#[test]
+fn test_mssql_if_statements_span() {
+    // Simple statements
+    let mut sql = "IF 1 = 1 SELECT '1' ELSE SELECT '2'";
+    let mut parser = Parser::new(&MsSqlDialect {}).try_with_sql(sql).unwrap();
+    match parser.parse_statement().unwrap() {
+        Statement::If(IfStatement {
+            if_block,
+            else_block: Some(else_block),
+            ..
+        }) => {
+            assert_eq!(
+                if_block.span(),
+                Span::new(Location::new(1, 1), Location::new(1, 20))
+            );
+            assert_eq!(
+                else_block.span(),
+                Span::new(Location::new(1, 21), Location::new(1, 36))
+            );
+        }
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Blocks
+    sql = "IF 1 = 1 BEGIN SET @A = 1; END ELSE BEGIN SET @A = 2 END";
+    parser = Parser::new(&MsSqlDialect {}).try_with_sql(sql).unwrap();
+    match parser.parse_statement().unwrap() {
+        Statement::If(IfStatement {
+            if_block,
+            else_block: Some(else_block),
+            ..
+        }) => {
+            assert_eq!(
+                if_block.span(),
+                Span::new(Location::new(1, 1), Location::new(1, 31))
+            );
+            assert_eq!(
+                else_block.span(),
+                Span::new(Location::new(1, 32), Location::new(1, 57))
+            );
+        }
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+}
+
+#[test]
+fn parse_mssql_varbinary_max_length() {
+    let sql = "CREATE TABLE example (var_binary_col VARBINARY(MAX))";
+
+    match ms_and_generic().verified_stmt(sql) {
+        Statement::CreateTable(CreateTable { name, columns, .. }) => {
+            assert_eq!(
+                name,
+                ObjectName::from(vec![Ident {
+                    value: "example".to_string(),
+                    quote_style: None,
+                    span: Span::empty(),
+                }])
+            );
+            assert_eq!(
+                columns,
+                vec![ColumnDef {
+                    name: Ident::new("var_binary_col"),
+                    data_type: Varbinary(Some(BinaryLength::Max)),
+
+                    options: vec![]
+                },],
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    let sql = "CREATE TABLE example (var_binary_col VARBINARY(50))";
+
+    match ms_and_generic().verified_stmt(sql) {
+        Statement::CreateTable(CreateTable { name, columns, .. }) => {
+            assert_eq!(
+                name,
+                ObjectName::from(vec![Ident {
+                    value: "example".to_string(),
+                    quote_style: None,
+                    span: Span::empty(),
+                }])
+            );
+            assert_eq!(
+                columns,
+                vec![ColumnDef {
+                    name: Ident::new("var_binary_col"),
+                    data_type: Varbinary(Some(BinaryLength::IntegerLength { length: 50 })),
+
+                    options: vec![]
+                },],
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_mssql_table_identifier_with_default_schema() {
+    ms().verified_stmt("SELECT * FROM mydatabase..MyTable");
+}
+
 fn ms() -> TestedDialects {
     TestedDialects::new(vec![Box::new(MsSqlDialect {})])
 }
+
+// MS SQL dialect with support for optional semi-colon statement delimiters
+fn tsql() -> TestedDialects {
+    TestedDialects::new_with_options(
+        vec![Box::new(MsSqlDialect {})],
+        ParserOptions {
+            trailing_commas: false,
+            unescape: true,
+            require_semicolon_stmt_delimiter: false,
+        },
+    )
+}
+
 fn ms_and_generic() -> TestedDialects {
     TestedDialects::new(vec![Box::new(MsSqlDialect {}), Box::new(GenericDialect {})])
 }
+
+#[test]
+fn parse_mssql_merge_with_output() {
+    let stmt = "MERGE dso.products AS t \
+        USING dsi.products AS \
+        s ON s.ProductID = t.ProductID \
+        WHEN MATCHED AND \
+        NOT (t.ProductName = s.ProductName OR (ISNULL(t.ProductName, s.ProductName) IS NULL)) \
+        THEN UPDATE SET t.ProductName = s.ProductName \
+        WHEN NOT MATCHED BY TARGET \
+        THEN INSERT (ProductID, ProductName) \
+        VALUES (s.ProductID, s.ProductName) \
+        WHEN NOT MATCHED BY SOURCE THEN DELETE \
+        OUTPUT $action, deleted.ProductID INTO dsi.temp_products";
+    ms_and_generic().verified_stmt(stmt);
+}
+
+#[test]
+fn parse_create_trigger() {
+    let create_trigger = "\
+        CREATE OR ALTER TRIGGER reminder1 \
+        ON Sales.Customer \
+        AFTER INSERT, UPDATE \
+        AS RAISERROR('Notify Customer Relations', 16, 10);\
+    ";
+    let create_stmt = ms().verified_stmt(create_trigger);
+    assert_eq!(
+        create_stmt,
+        Statement::CreateTrigger {
+            or_alter: true,
+            or_replace: false,
+            is_constraint: false,
+            name: ObjectName::from(vec![Ident::new("reminder1")]),
+            period: TriggerPeriod::After,
+            events: vec![TriggerEvent::Insert, TriggerEvent::Update(vec![]),],
+            table_name: ObjectName::from(vec![Ident::new("Sales"), Ident::new("Customer")]),
+            referenced_table_name: None,
+            referencing: vec![],
+            trigger_object: TriggerObject::Statement,
+            include_each: false,
+            condition: None,
+            exec_body: None,
+            statements: Some(ConditionalStatements::Sequence {
+                statements: vec![Statement::RaisError {
+                    message: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Notify Customer Relations".to_string()))
+                            .with_empty_span()
+                    )),
+                    severity: Box::new(Expr::Value(
+                        (Value::Number("16".parse().unwrap(), false)).with_empty_span()
+                    )),
+                    state: Box::new(Expr::Value(
+                        (Value::Number("10".parse().unwrap(), false)).with_empty_span()
+                    )),
+                    arguments: vec![],
+                    options: vec![],
+                }],
+            }),
+            characteristics: None,
+        }
+    );
+
+    let multi_statement_as_trigger = "\
+        CREATE TRIGGER some_trigger ON some_table FOR INSERT \
+        AS \
+        DECLARE @var INT; \
+        RAISERROR('Trigger fired', 10, 1);\
+    ";
+    let _ = ms().verified_stmt(multi_statement_as_trigger);
+
+    let multi_statement_trigger = "\
+        CREATE TRIGGER some_trigger ON some_table FOR INSERT \
+        AS \
+        BEGIN \
+            DECLARE @var INT; \
+            RAISERROR('Trigger fired', 10, 1); \
+        END\
+    ";
+    let _ = ms().verified_stmt(multi_statement_trigger);
+
+    let create_trigger_with_return = "\
+        CREATE TRIGGER some_trigger ON some_table FOR INSERT \
+        AS \
+        BEGIN \
+            RETURN; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_trigger_with_return);
+
+    let create_trigger_with_return = "\
+        CREATE TRIGGER some_trigger ON some_table FOR INSERT \
+        AS \
+        BEGIN \
+            RETURN; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_trigger_with_return);
+
+    let create_trigger_with_conditional = "\
+        CREATE TRIGGER some_trigger ON some_table FOR INSERT \
+        AS \
+        BEGIN \
+            IF 1 = 2 \
+            BEGIN \
+                RAISERROR('Trigger fired', 10, 1); \
+            END; \
+            RETURN; \
+        END\
+    ";
+    let _ = ms().verified_stmt(create_trigger_with_conditional);
+}
+
+#[test]
+fn parse_drop_trigger() {
+    let sql_drop_trigger = "DROP TRIGGER emp_stamp;";
+    let drop_stmt = ms().one_statement_parses_to(sql_drop_trigger, "");
+    assert_eq!(
+        drop_stmt,
+        Statement::DropTrigger {
+            if_exists: false,
+            trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+            table_name: None,
+            option: None,
+        }
+    );
+}
+
+#[test]
+fn parse_print() {
+    let print_string_literal = "PRINT 'Hello, world!'";
+    let print_stmt = ms().verified_stmt(print_string_literal);
+    assert_eq!(
+        print_stmt,
+        Statement::Print(PrintStatement {
+            message: Box::new(Expr::Value(
+                (Value::SingleQuotedString("Hello, world!".to_string())).with_empty_span()
+            )),
+        })
+    );
+
+    let _ = ms().verified_stmt("PRINT N'Hello, ⛄️!'");
+    let _ = ms().verified_stmt("PRINT @my_variable");
+}
+
+#[test]
+fn parse_mssql_grant() {
+    ms().verified_stmt("GRANT SELECT ON my_table TO public, db_admin");
+}
+
+#[test]
+fn parse_mssql_deny() {
+    ms().verified_stmt("DENY SELECT ON my_table TO public, db_admin");
+}
+
+#[test]
+fn test_tsql_no_semicolon_delimiter() {
+    let sql = r#"
+DECLARE @X AS NVARCHAR(MAX)='x'
+DECLARE @Y AS NVARCHAR(MAX)='y'
+    "#;
+
+    let stmts = tsql().parse_sql_statements(sql).unwrap();
+    assert_eq!(stmts.len(), 2);
+    assert!(stmts.iter().all(|s| matches!(s, Statement::Declare { .. })));
+}
diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs
index ce3296737..cf4e24adb 100644
--- a/tests/sqlparser_mysql.rs
+++ b/tests/sqlparser_mysql.rs
@@ -19,18 +19,28 @@
 //! Test SQL syntax specific to MySQL. The parser based on the generic dialect
 //! is also tested (on the inputs it can handle).
 
+use helpers::attached_token::AttachedToken;
 use matches::assert_matches;
 
 use sqlparser::ast::MysqlInsertPriority::{Delayed, HighPriority, LowPriority};
 use sqlparser::ast::*;
 use sqlparser::dialect::{GenericDialect, MySqlDialect};
 use sqlparser::parser::{ParserError, ParserOptions};
+use sqlparser::tokenizer::Span;
 use sqlparser::tokenizer::Token;
 use test_utils::*;
 
 #[macro_use]
 mod test_utils;
 
+fn mysql() -> TestedDialects {
+    TestedDialects::new(vec![Box::new(MySqlDialect {})])
+}
+
+fn mysql_and_generic() -> TestedDialects {
+    TestedDialects::new(vec![Box::new(MySqlDialect {}), Box::new(GenericDialect {})])
+}
+
 #[test]
 fn parse_identifiers() {
     mysql().verified_stmt("SELECT $a$, àà");
@@ -42,11 +52,11 @@ fn parse_literal_string() {
     let select = mysql().verified_only_select(sql);
     assert_eq!(2, select.projection.len());
     assert_eq!(
-        &Expr::Value(Value::SingleQuotedString("single".to_string())),
+        &Expr::Value((Value::SingleQuotedString("single".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
-        &Expr::Value(Value::DoubleQuotedString("double".to_string())),
+        &Expr::Value((Value::DoubleQuotedString("double".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[1])
     );
 }
@@ -139,19 +149,22 @@ fn parse_flush() {
             read_lock: false,
             export: false,
             tables: vec![
-                ObjectName(vec![
+                ObjectName::from(vec![
                     Ident {
                         value: "mek".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     },
                     Ident {
                         value: "table1".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     }
                 ]),
-                ObjectName(vec![Ident {
+                ObjectName::from(vec![Ident {
                     value: "table2".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }])
             ]
         }
@@ -176,19 +189,22 @@ fn parse_flush() {
             read_lock: true,
             export: false,
             tables: vec![
-                ObjectName(vec![
+                ObjectName::from(vec![
                     Ident {
                         value: "mek".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     },
                     Ident {
                         value: "table1".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     }
                 ]),
-                ObjectName(vec![Ident {
+                ObjectName::from(vec![Ident {
                     value: "table2".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }])
             ]
         }
@@ -202,19 +218,22 @@ fn parse_flush() {
             read_lock: false,
             export: true,
             tables: vec![
-                ObjectName(vec![
+                ObjectName::from(vec![
                     Ident {
                         value: "mek".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     },
                     Ident {
                         value: "table1".to_string(),
-                        quote_style: Some('`')
+                        quote_style: Some('`'),
+                        span: Span::empty(),
                     }
                 ]),
-                ObjectName(vec![Ident {
+                ObjectName::from(vec![Ident {
                     value: "table2".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }])
             ]
         }
@@ -232,7 +251,7 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mytable")])),
                 }),
                 filter_position: None,
                 limit_from: None,
@@ -250,7 +269,10 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mydb"), Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![
+                        Ident::new("mydb"),
+                        Ident::new("mytable")
+                    ])),
                 }),
                 filter_position: None,
                 limit_from: None,
@@ -268,7 +290,7 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mytable")])),
                 }),
                 filter_position: None,
                 limit_from: None,
@@ -286,7 +308,7 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mytable")])),
                 }),
                 filter_position: None,
                 limit_from: None,
@@ -304,7 +326,7 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mytable")])),
                 }),
                 filter_position: Some(ShowStatementFilterPosition::Suffix(
                     ShowStatementFilter::Like("pattern".into())
@@ -324,7 +346,7 @@ fn parse_show_columns() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mytable")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mytable")])),
                 }),
                 filter_position: Some(ShowStatementFilterPosition::Suffix(
                     ShowStatementFilter::Where(mysql_and_generic().verified_expr("1 = 2"))
@@ -411,7 +433,7 @@ fn parse_show_tables() {
                 show_in: Some(ShowStatementIn {
                     clause: ShowStatementInClause::FROM,
                     parent_type: None,
-                    parent_name: Some(ObjectName(vec![Ident::new("mydb")])),
+                    parent_name: Some(ObjectName::from(vec![Ident::new("mydb")])),
                 }),
                 filter_position: None
             }
@@ -515,7 +537,7 @@ fn parse_show_extended_full() {
 
 #[test]
 fn parse_show_create() {
-    let obj_name = ObjectName(vec![Ident::new("myident")]);
+    let obj_name = ObjectName::from(vec![Ident::new("myident")]);
 
     for obj_type in &[
         ShowCreateObject::Table,
@@ -571,17 +593,16 @@ fn parse_use() {
     for object_name in &valid_object_names {
         // Test single identifier without quotes
         assert_eq!(
-            mysql_and_generic().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+            mysql_and_generic().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
             assert_eq!(
-                mysql_and_generic()
-                    .verified_stmt(&format!("USE {}{}{}", quote, object_name, quote)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+                mysql_and_generic().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -595,12 +616,12 @@ fn parse_set_variables() {
     mysql_and_generic().verified_stmt("SET sql_mode = CONCAT(@@sql_mode, ',STRICT_TRANS_TABLES')");
     assert_eq!(
         mysql_and_generic().verified_stmt("SET LOCAL autocommit = 1"),
-        Statement::SetVariable {
-            local: true,
+        Statement::Set(Set::SingleAssignment {
+            scope: Some(ContextModifier::Local),
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec!["autocommit".into()])),
-            value: vec![Expr::Value(number("1"))],
-        }
+            variable: ObjectName::from(vec!["autocommit".into()]),
+            values: vec![Expr::value(number("1"))],
+        })
     );
 }
 
@@ -614,7 +635,6 @@ fn parse_create_table_auto_increment() {
                 vec![ColumnDef {
                     name: Ident::new("bar"),
                     data_type: DataType::Int(None),
-                    collation: None,
                     options: vec![
                         ColumnOptionDef {
                             name: None,
@@ -649,6 +669,20 @@ fn table_constraint_unique_primary_ctor(
     characteristics: Option<ConstraintCharacteristics>,
     unique_index_type_display: Option<KeyOrIndexDisplay>,
 ) -> TableConstraint {
+    let columns = columns
+        .into_iter()
+        .map(|ident| IndexColumn {
+            column: OrderByExpr {
+                expr: Expr::Identifier(ident),
+                options: OrderByOptions {
+                    asc: None,
+                    nulls_first: None,
+                },
+                with_fill: None,
+            },
+            operator_class: None,
+        })
+        .collect();
     match unique_index_type_display {
         Some(index_type_display) => TableConstraint::Unique {
             name,
@@ -658,6 +692,7 @@ fn table_constraint_unique_primary_ctor(
             columns,
             index_options,
             characteristics,
+            nulls_distinct: NullsDistinctOption::None,
         },
         None => TableConstraint::PrimaryKey {
             name,
@@ -673,7 +708,7 @@ fn table_constraint_unique_primary_ctor(
 #[test]
 fn parse_create_table_primary_and_unique_key() {
     let sqls = ["UNIQUE KEY", "PRIMARY KEY"]
-        .map(|key_ty|format!("CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, CONSTRAINT bar_key {key_ty} (bar))"));
+        .map(|key_ty| format!("CREATE TABLE foo (id INT PRIMARY KEY AUTO_INCREMENT, bar INT NOT NULL, CONSTRAINT bar_key {key_ty} (bar))"));
 
     let index_type_display = [Some(KeyOrIndexDisplay::Key), None];
 
@@ -703,7 +738,6 @@ fn parse_create_table_primary_and_unique_key() {
                         ColumnDef {
                             name: Ident::new("id"),
                             data_type: DataType::Int(None),
-                            collation: None,
                             options: vec![
                                 ColumnOptionDef {
                                     name: None,
@@ -723,7 +757,6 @@ fn parse_create_table_primary_and_unique_key() {
                         ColumnDef {
                             name: Ident::new("bar"),
                             data_type: DataType::Int(None),
-                            collation: None,
                             options: vec![ColumnOptionDef {
                                 name: None,
                                 option: ColumnOption::NotNull,
@@ -741,7 +774,7 @@ fn parse_create_table_primary_and_unique_key() {
 #[test]
 fn parse_create_table_primary_and_unique_key_with_index_options() {
     let sqls = ["UNIQUE INDEX", "PRIMARY KEY"]
-        .map(|key_ty|format!("CREATE TABLE foo (bar INT, var INT, CONSTRAINT constr {key_ty} index_name (bar, var) USING HASH COMMENT 'yes, ' USING BTREE COMMENT 'MySQL allows')"));
+        .map(|key_ty| format!("CREATE TABLE foo (bar INT, var INT, CONSTRAINT constr {key_ty} index_name (bar, var) USING HASH COMMENT 'yes, ' USING BTREE COMMENT 'MySQL allows')"));
 
     let index_type_display = [Some(KeyOrIndexDisplay::Index), None];
 
@@ -775,6 +808,67 @@ fn parse_create_table_primary_and_unique_key_with_index_options() {
     }
 }
 
+#[test]
+fn parse_prefix_key_part() {
+    let expected = vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::value(
+        number("10"),
+    )))];
+    for sql in [
+        "CREATE INDEX idx_index ON t(textcol(10))",
+        "ALTER TABLE tab ADD INDEX idx_index (textcol(10))",
+        "ALTER TABLE tab ADD PRIMARY KEY (textcol(10))",
+        "ALTER TABLE tab ADD UNIQUE KEY (textcol(10))",
+        "ALTER TABLE tab ADD UNIQUE KEY (textcol(10))",
+        "ALTER TABLE tab ADD FULLTEXT INDEX (textcol(10))",
+        "CREATE TABLE t (textcol TEXT, INDEX idx_index (textcol(10)))",
+    ] {
+        match index_column(mysql_and_generic().verified_stmt(sql)) {
+            Expr::Function(Function {
+                name,
+                args: FunctionArguments::List(FunctionArgumentList { args, .. }),
+                ..
+            }) => {
+                assert_eq!(name.to_string(), "textcol");
+                assert_eq!(args, expected);
+            }
+            expr => panic!("unexpected expression {expr} for {sql}"),
+        }
+    }
+}
+
+#[test]
+fn test_functional_key_part() {
+    assert_eq!(
+        index_column(
+            mysql_and_generic()
+                .verified_stmt("CREATE INDEX idx_index ON t((col COLLATE utf8mb4_bin) DESC)")
+        ),
+        Expr::Nested(Box::new(Expr::Collate {
+            expr: Box::new(Expr::Identifier("col".into())),
+            collation: ObjectName(vec![sqlparser::ast::ObjectNamePart::Identifier(
+                Ident::new("utf8mb4_bin")
+            )]),
+        }))
+    );
+    assert_eq!(
+        index_column(mysql_and_generic().verified_stmt(
+            r#"CREATE TABLE t (jsoncol JSON, PRIMARY KEY ((CAST(col ->> '$.id' AS UNSIGNED)) ASC))"#
+        )),
+        Expr::Nested(Box::new(Expr::Cast {
+            kind: CastKind::Cast,
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("col"))),
+                op: BinaryOperator::LongArrow,
+                right: Box::new(Expr::Value(
+                    Value::SingleQuotedString("$.id".to_string()).with_empty_span()
+                )),
+            }),
+            data_type: DataType::Unsigned,
+            format: None,
+        })),
+    );
+}
+
 #[test]
 fn parse_create_table_primary_and_unique_key_with_index_type() {
     let sqls = ["UNIQUE", "PRIMARY KEY"].map(|key_ty| {
@@ -815,7 +909,7 @@ fn parse_create_table_primary_and_unique_key_with_index_type() {
 #[test]
 fn parse_create_table_primary_and_unique_key_characteristic_test() {
     let sqls = ["UNIQUE INDEX", "PRIMARY KEY"]
-        .map(|key_ty|format!("CREATE TABLE x (y INT, CONSTRAINT constr {key_ty} (y) NOT DEFERRABLE INITIALLY IMMEDIATE)"));
+        .map(|key_ty| format!("CREATE TABLE x (y INT, CONSTRAINT constr {key_ty} (y) NOT DEFERRABLE INITIALLY IMMEDIATE)"));
     for sql in &sqls {
         mysql_and_generic().verified_stmt(sql);
     }
@@ -828,9 +922,23 @@ fn parse_create_table_comment() {
 
     for sql in [without_equal, with_equal] {
         match mysql().verified_stmt(sql) {
-            Statement::CreateTable(CreateTable { name, comment, .. }) => {
+            Statement::CreateTable(CreateTable {
+                name,
+                table_options,
+                ..
+            }) => {
                 assert_eq!(name.to_string(), "foo");
-                assert_eq!(comment.expect("Should exist").to_string(), "baz");
+
+                let plain_options = match table_options {
+                    CreateTableOptions::Plain(options) => options,
+                    _ => unreachable!(),
+                };
+                let comment = match plain_options.first().unwrap() {
+                    SqlOption::Comment(CommentDef::WithEq(c))
+                    | SqlOption::Comment(CommentDef::WithoutEq(c)) => c,
+                    _ => unreachable!(),
+                };
+                assert_eq!(comment, "baz");
             }
             _ => unreachable!(),
         }
@@ -839,29 +947,226 @@ fn parse_create_table_comment() {
 
 #[test]
 fn parse_create_table_auto_increment_offset() {
-    let canonical =
-        "CREATE TABLE foo (bar INT NOT NULL AUTO_INCREMENT) ENGINE=InnoDB AUTO_INCREMENT 123";
-    let with_equal =
-        "CREATE TABLE foo (bar INT NOT NULL AUTO_INCREMENT) ENGINE=InnoDB AUTO_INCREMENT=123";
+    let sql =
+        "CREATE TABLE foo (bar INT NOT NULL AUTO_INCREMENT) ENGINE = InnoDB AUTO_INCREMENT = 123";
 
-    for sql in [canonical, with_equal] {
-        match mysql().one_statement_parses_to(sql, canonical) {
+    match mysql().verified_stmt(sql) {
+        Statement::CreateTable(CreateTable {
+            name,
+            table_options,
+            ..
+        }) => {
+            assert_eq!(name.to_string(), "foo");
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("AUTO_INCREMENT"),
+                value: Expr::Value(test_utils::number("123").with_empty_span())
+            }));
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_table_multiple_options_order_independent() {
+    let sql1 = "CREATE TABLE mytable (id INT) ENGINE=InnoDB ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8 COMMENT='abc'";
+    let sql2 = "CREATE TABLE mytable (id INT) KEY_BLOCK_SIZE=8 COMMENT='abc' ENGINE=InnoDB ROW_FORMAT=DYNAMIC";
+    let sql3 = "CREATE TABLE mytable (id INT) ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8 COMMENT='abc' ENGINE=InnoDB";
+
+    for sql in [sql1, sql2, sql3] {
+        match mysql().parse_sql_statements(sql).unwrap().pop().unwrap() {
             Statement::CreateTable(CreateTable {
                 name,
-                auto_increment_offset,
+                table_options,
                 ..
             }) => {
-                assert_eq!(name.to_string(), "foo");
-                assert_eq!(
-                    auto_increment_offset.expect("Should exist").to_string(),
-                    "123"
-                );
+                assert_eq!(name.to_string(), "mytable");
+
+                let plain_options = match table_options {
+                    CreateTableOptions::Plain(options) => options,
+                    _ => unreachable!(),
+                };
+
+                assert!(plain_options.contains(&SqlOption::NamedParenthesizedList(
+                    NamedParenthesizedList {
+                        key: Ident::new("ENGINE"),
+                        name: Some(Ident::new("InnoDB")),
+                        values: vec![]
+                    }
+                )));
+
+                assert!(plain_options.contains(&SqlOption::KeyValue {
+                    key: Ident::new("KEY_BLOCK_SIZE"),
+                    value: Expr::Value(test_utils::number("8").with_empty_span())
+                }));
+
+                assert!(plain_options
+                    .contains(&SqlOption::Comment(CommentDef::WithEq("abc".to_owned()))));
+
+                assert!(plain_options.contains(&SqlOption::KeyValue {
+                    key: Ident::new("ROW_FORMAT"),
+                    value: Expr::Identifier(Ident::new("DYNAMIC".to_owned()))
+                }));
             }
             _ => unreachable!(),
         }
     }
 }
 
+#[test]
+fn parse_create_table_with_all_table_options() {
+    let sql =
+        "CREATE TABLE foo (bar INT NOT NULL AUTO_INCREMENT) ENGINE = InnoDB AUTO_INCREMENT = 123 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci INSERT_METHOD = FIRST KEY_BLOCK_SIZE = 8 ROW_FORMAT = DYNAMIC DATA DIRECTORY = '/var/lib/mysql/data' INDEX DIRECTORY = '/var/lib/mysql/index' PACK_KEYS = 1 STATS_AUTO_RECALC = 1 STATS_PERSISTENT = 0 STATS_SAMPLE_PAGES = 128 DELAY_KEY_WRITE = 1 COMPRESSION = 'ZLIB' ENCRYPTION = 'Y' MAX_ROWS = 10000 MIN_ROWS = 10 AUTOEXTEND_SIZE = 64 AVG_ROW_LENGTH = 128 CHECKSUM = 1 CONNECTION = 'mysql://localhost' ENGINE_ATTRIBUTE = 'primary' PASSWORD = 'secure_password' SECONDARY_ENGINE_ATTRIBUTE = 'secondary_attr' START TRANSACTION TABLESPACE my_tablespace STORAGE DISK UNION = (table1, table2, table3)";
+
+    match mysql().verified_stmt(sql) {
+        Statement::CreateTable(CreateTable {
+            name,
+            table_options,
+            ..
+        }) => {
+            assert_eq!(name, vec![Ident::new("foo".to_owned())].into());
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::NamedParenthesizedList(
+                NamedParenthesizedList {
+                    key: Ident::new("ENGINE"),
+                    name: Some(Ident::new("InnoDB")),
+                    values: vec![]
+                }
+            )));
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("COLLATE"),
+                value: Expr::Identifier(Ident::new("utf8mb4_0900_ai_ci".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("DEFAULT CHARSET"),
+                value: Expr::Identifier(Ident::new("utf8mb4".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("AUTO_INCREMENT"),
+                value: Expr::value(test_utils::number("123"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("KEY_BLOCK_SIZE"),
+                value: Expr::value(test_utils::number("8"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("ROW_FORMAT"),
+                value: Expr::Identifier(Ident::new("DYNAMIC".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("PACK_KEYS"),
+                value: Expr::value(test_utils::number("1"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("STATS_AUTO_RECALC"),
+                value: Expr::value(test_utils::number("1"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("STATS_PERSISTENT"),
+                value: Expr::value(test_utils::number("0"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("STATS_SAMPLE_PAGES"),
+                value: Expr::value(test_utils::number("128"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("STATS_SAMPLE_PAGES"),
+                value: Expr::value(test_utils::number("128"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("INSERT_METHOD"),
+                value: Expr::Identifier(Ident::new("FIRST".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("COMPRESSION"),
+                value: Expr::value(Value::SingleQuotedString("ZLIB".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("ENCRYPTION"),
+                value: Expr::value(Value::SingleQuotedString("Y".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("MAX_ROWS"),
+                value: Expr::value(test_utils::number("10000"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("MIN_ROWS"),
+                value: Expr::value(test_utils::number("10"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("AUTOEXTEND_SIZE"),
+                value: Expr::value(test_utils::number("64"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("AVG_ROW_LENGTH"),
+                value: Expr::value(test_utils::number("128"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("CHECKSUM"),
+                value: Expr::value(test_utils::number("1"))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("CONNECTION"),
+                value: Expr::value(Value::SingleQuotedString("mysql://localhost".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("ENGINE_ATTRIBUTE"),
+                value: Expr::value(Value::SingleQuotedString("primary".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("PASSWORD"),
+                value: Expr::value(Value::SingleQuotedString("secure_password".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("SECONDARY_ENGINE_ATTRIBUTE"),
+                value: Expr::value(Value::SingleQuotedString("secondary_attr".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::Ident(Ident::new(
+                "START TRANSACTION".to_owned()
+            ))));
+            assert!(
+                plain_options.contains(&SqlOption::TableSpace(TablespaceOption {
+                    name: "my_tablespace".to_string(),
+                    storage: Some(StorageType::Disk),
+                }))
+            );
+
+            assert!(plain_options.contains(&SqlOption::NamedParenthesizedList(
+                NamedParenthesizedList {
+                    key: Ident::new("UNION"),
+                    name: None,
+                    values: vec![
+                        Ident::new("table1".to_string()),
+                        Ident::new("table2".to_string()),
+                        Ident::new("table3".to_string())
+                    ]
+                }
+            )));
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("DATA DIRECTORY"),
+                value: Expr::value(Value::SingleQuotedString("/var/lib/mysql/data".to_owned()))
+            }));
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("INDEX DIRECTORY"),
+                value: Expr::value(Value::SingleQuotedString("/var/lib/mysql/index".to_owned()))
+            }));
+        }
+        _ => unreachable!(),
+    }
+}
+
 #[test]
 fn parse_create_table_set_enum() {
     let sql = "CREATE TABLE foo (bar SET('a', 'b'), baz ENUM('a', 'b'))";
@@ -873,13 +1178,17 @@ fn parse_create_table_set_enum() {
                     ColumnDef {
                         name: Ident::new("bar"),
                         data_type: DataType::Set(vec!["a".to_string(), "b".to_string()]),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("baz"),
-                        data_type: DataType::Enum(vec!["a".to_string(), "b".to_string()]),
-                        collation: None,
+                        data_type: DataType::Enum(
+                            vec![
+                                EnumMember::Name("a".to_string()),
+                                EnumMember::Name("b".to_string())
+                            ],
+                            None
+                        ),
                         options: vec![],
                     }
                 ],
@@ -892,13 +1201,12 @@ fn parse_create_table_set_enum() {
 
 #[test]
 fn parse_create_table_engine_default_charset() {
-    let sql = "CREATE TABLE foo (id INT(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3";
+    let sql = "CREATE TABLE foo (id INT(11)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb3";
     match mysql().verified_stmt(sql) {
         Statement::CreateTable(CreateTable {
             name,
             columns,
-            engine,
-            default_charset,
+            table_options,
             ..
         }) => {
             assert_eq!(name.to_string(), "foo");
@@ -906,19 +1214,28 @@ fn parse_create_table_engine_default_charset() {
                 vec![ColumnDef {
                     name: Ident::new("id"),
                     data_type: DataType::Int(Some(11)),
-                    collation: None,
                     options: vec![],
                 },],
                 columns
             );
-            assert_eq!(
-                engine,
-                Some(TableEngine {
-                    name: "InnoDB".to_string(),
-                    parameters: None
-                })
-            );
-            assert_eq!(default_charset, Some("utf8mb3".to_string()));
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("DEFAULT CHARSET"),
+                value: Expr::Identifier(Ident::new("utf8mb3".to_owned()))
+            }));
+
+            assert!(plain_options.contains(&SqlOption::NamedParenthesizedList(
+                NamedParenthesizedList {
+                    key: Ident::new("ENGINE"),
+                    name: Some(Ident::new("InnoDB")),
+                    values: vec![]
+                }
+            )));
         }
         _ => unreachable!(),
     }
@@ -926,12 +1243,12 @@ fn parse_create_table_engine_default_charset() {
 
 #[test]
 fn parse_create_table_collate() {
-    let sql = "CREATE TABLE foo (id INT(11)) COLLATE=utf8mb4_0900_ai_ci";
+    let sql = "CREATE TABLE foo (id INT(11)) COLLATE = utf8mb4_0900_ai_ci";
     match mysql().verified_stmt(sql) {
         Statement::CreateTable(CreateTable {
             name,
             columns,
-            collation,
+            table_options,
             ..
         }) => {
             assert_eq!(name.to_string(), "foo");
@@ -939,12 +1256,20 @@ fn parse_create_table_collate() {
                 vec![ColumnDef {
                     name: Ident::new("id"),
                     data_type: DataType::Int(Some(11)),
-                    collation: None,
                     options: vec![],
                 },],
                 columns
             );
-            assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string()));
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("COLLATE"),
+                value: Expr::Identifier(Ident::new("utf8mb4_0900_ai_ci".to_owned()))
+            }));
         }
         _ => unreachable!(),
     }
@@ -952,25 +1277,38 @@ fn parse_create_table_collate() {
 
 #[test]
 fn parse_create_table_both_options_and_as_query() {
-    let sql = "CREATE TABLE foo (id INT(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb4_0900_ai_ci AS SELECT 1";
+    let sql = "CREATE TABLE foo (id INT(11)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb3 COLLATE = utf8mb4_0900_ai_ci AS SELECT 1";
     match mysql_and_generic().verified_stmt(sql) {
         Statement::CreateTable(CreateTable {
             name,
-            collation,
             query,
+            table_options,
             ..
         }) => {
             assert_eq!(name.to_string(), "foo");
-            assert_eq!(collation, Some("utf8mb4_0900_ai_ci".to_string()));
+
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+
+            assert!(plain_options.contains(&SqlOption::KeyValue {
+                key: Ident::new("COLLATE"),
+                value: Expr::Identifier(Ident::new("utf8mb4_0900_ai_ci".to_owned()))
+            }));
+
             assert_eq!(
                 query.unwrap().body.as_select().unwrap().projection,
-                vec![SelectItem::UnnamedExpr(Expr::Value(number("1")))]
+                vec![SelectItem::UnnamedExpr(Expr::Value(
+                    (number("1")).with_empty_span()
+                ))]
             );
         }
         _ => unreachable!(),
     }
 
-    let sql = r"CREATE TABLE foo (id INT(11)) ENGINE=InnoDB AS SELECT 1 DEFAULT CHARSET=utf8mb3";
+    let sql =
+        r"CREATE TABLE foo (id INT(11)) ENGINE = InnoDB AS SELECT 1 DEFAULT CHARSET = utf8mb3";
     assert!(matches!(
         mysql_and_generic().parse_sql_statements(sql),
         Err(ParserError::ParserError(_))
@@ -987,11 +1325,10 @@ fn parse_create_table_comment_character_set() {
                 vec![ColumnDef {
                     name: Ident::new("s"),
                     data_type: DataType::Text,
-                    collation: None,
                     options: vec![
                         ColumnOptionDef {
                             name: None,
-                            option: ColumnOption::CharacterSet(ObjectName(vec![Ident::new(
+                            option: ColumnOption::CharacterSet(ObjectName::from(vec![Ident::new(
                                 "utf8mb4"
                             )]))
                         },
@@ -1024,6 +1361,13 @@ fn parse_create_table_gencol() {
     mysql_and_generic().verified_stmt("CREATE TABLE t1 (a INT, b INT AS (a * 2) STORED)");
 }
 
+#[test]
+fn parse_create_table_options_comma_separated() {
+    let sql = "CREATE TABLE t (x INT) DEFAULT CHARSET = utf8mb4, ENGINE = InnoDB , AUTO_INCREMENT 1 DATA DIRECTORY '/var/lib/mysql/data'";
+    let canonical = "CREATE TABLE t (x INT) DEFAULT CHARSET = utf8mb4 ENGINE = InnoDB AUTO_INCREMENT = 1 DATA DIRECTORY = '/var/lib/mysql/data'";
+    mysql_and_generic().one_statement_parses_to(sql, canonical);
+}
+
 #[test]
 fn parse_quote_identifiers() {
     let sql = "CREATE TABLE `PRIMARY` (`BEGIN` INT PRIMARY KEY)";
@@ -1034,7 +1378,6 @@ fn parse_quote_identifiers() {
                 vec![ColumnDef {
                     name: Ident::with_quote('`', "BEGIN"),
                     data_type: DataType::Int(None),
-                    collation: None,
                     options: vec![ColumnOptionDef {
                         name: None,
                         option: ColumnOption::Unique {
@@ -1058,13 +1401,16 @@ fn parse_escaped_quote_identifiers_with_escape() {
         Statement::Query(Box::new(Query {
             with: None,
             body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
                 distinct: None,
                 top: None,
                 top_before_distinct: false,
                 projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident {
                     value: "quoted ` identifier".into(),
                     quote_style: Some('`'),
+                    span: Span::empty(),
                 }))],
+                exclude: None,
                 into: None,
                 from: vec![],
                 lateral_views: vec![],
@@ -1080,16 +1426,16 @@ fn parse_escaped_quote_identifiers_with_escape() {
                 window_before_qualify: false,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             order_by: None,
-            limit: None,
-            limit_by: vec![],
-            offset: None,
+            limit_clause: None,
             fetch: None,
             locks: vec![],
             for_clause: None,
             settings: None,
             format_clause: None,
+            pipe_operators: vec![],
         }))
     );
 }
@@ -1103,19 +1449,23 @@ fn parse_escaped_quote_identifiers_with_no_escape() {
             ParserOptions {
                 trailing_commas: false,
                 unescape: false,
+                require_semicolon_stmt_delimiter: true,
             }
         )
         .verified_stmt(sql),
         Statement::Query(Box::new(Query {
             with: None,
             body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
                 distinct: None,
                 top: None,
                 top_before_distinct: false,
                 projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident {
                     value: "quoted `` identifier".into(),
                     quote_style: Some('`'),
+                    span: Span::empty(),
                 }))],
+                exclude: None,
                 into: None,
                 from: vec![],
                 lateral_views: vec![],
@@ -1131,16 +1481,16 @@ fn parse_escaped_quote_identifiers_with_no_escape() {
                 window_before_qualify: false,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             order_by: None,
-            limit: None,
-            limit_by: vec![],
-            offset: None,
+            limit_clause: None,
             fetch: None,
             locks: vec![],
             for_clause: None,
             settings: None,
             format_clause: None,
+            pipe_operators: vec![],
         }))
     );
 }
@@ -1153,13 +1503,17 @@ fn parse_escaped_backticks_with_escape() {
         Statement::Query(Box::new(Query {
             with: None,
             body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
+
                 distinct: None,
                 top: None,
                 top_before_distinct: false,
                 projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident {
                     value: "`quoted identifier`".into(),
                     quote_style: Some('`'),
+                    span: Span::empty(),
                 }))],
+                exclude: None,
                 into: None,
                 from: vec![],
                 lateral_views: vec![],
@@ -1175,16 +1529,16 @@ fn parse_escaped_backticks_with_escape() {
                 window_before_qualify: false,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             order_by: None,
-            limit: None,
-            limit_by: vec![],
-            offset: None,
+            limit_clause: None,
             fetch: None,
             locks: vec![],
             for_clause: None,
             settings: None,
             format_clause: None,
+            pipe_operators: vec![],
         }))
     );
 }
@@ -1201,13 +1555,17 @@ fn parse_escaped_backticks_with_no_escape() {
         Statement::Query(Box::new(Query {
             with: None,
             body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
+
                 distinct: None,
                 top: None,
                 top_before_distinct: false,
                 projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident {
                     value: "``quoted identifier``".into(),
                     quote_style: Some('`'),
+                    span: Span::empty(),
                 }))],
+                exclude: None,
                 into: None,
                 from: vec![],
                 lateral_views: vec![],
@@ -1223,16 +1581,16 @@ fn parse_escaped_backticks_with_no_escape() {
                 window_before_qualify: false,
                 value_table_mode: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             order_by: None,
-            limit: None,
-            limit_by: vec![],
-            offset: None,
+            limit_clause: None,
             fetch: None,
             locks: vec![],
             for_clause: None,
             settings: None,
             format_clause: None,
+            pipe_operators: vec![],
         }))
     );
 }
@@ -1283,31 +1641,26 @@ fn parse_create_table_with_minimum_display_width() {
                     ColumnDef {
                         name: Ident::new("bar_tinyint"),
                         data_type: DataType::TinyInt(Some(3)),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_smallint"),
                         data_type: DataType::SmallInt(Some(5)),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_mediumint"),
                         data_type: DataType::MediumInt(Some(6)),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_int"),
                         data_type: DataType::Int(Some(11)),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_bigint"),
                         data_type: DataType::BigInt(Some(20)),
-                        collation: None,
                         options: vec![],
                     }
                 ],
@@ -1328,32 +1681,27 @@ fn parse_create_table_unsigned() {
                 vec![
                     ColumnDef {
                         name: Ident::new("bar_tinyint"),
-                        data_type: DataType::UnsignedTinyInt(Some(3)),
-                        collation: None,
+                        data_type: DataType::TinyIntUnsigned(Some(3)),
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_smallint"),
-                        data_type: DataType::UnsignedSmallInt(Some(5)),
-                        collation: None,
+                        data_type: DataType::SmallIntUnsigned(Some(5)),
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_mediumint"),
-                        data_type: DataType::UnsignedMediumInt(Some(13)),
-                        collation: None,
+                        data_type: DataType::MediumIntUnsigned(Some(13)),
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_int"),
-                        data_type: DataType::UnsignedInt(Some(11)),
-                        collation: None,
+                        data_type: DataType::IntUnsigned(Some(11)),
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::new("bar_bigint"),
-                        data_type: DataType::UnsignedBigInt(Some(20)),
-                        collation: None,
+                        data_type: DataType::BigIntUnsigned(Some(20)),
                         options: vec![],
                     },
                 ],
@@ -1364,19 +1712,67 @@ fn parse_create_table_unsigned() {
     }
 }
 
+#[test]
+fn parse_signed_data_types() {
+    let sql = "CREATE TABLE foo (bar_tinyint TINYINT(3) SIGNED, bar_smallint SMALLINT(5) SIGNED, bar_mediumint MEDIUMINT(13) SIGNED, bar_int INT(11) SIGNED, bar_bigint BIGINT(20) SIGNED)";
+    let canonical = "CREATE TABLE foo (bar_tinyint TINYINT(3), bar_smallint SMALLINT(5), bar_mediumint MEDIUMINT(13), bar_int INT(11), bar_bigint BIGINT(20))";
+    match mysql().one_statement_parses_to(sql, canonical) {
+        Statement::CreateTable(CreateTable { name, columns, .. }) => {
+            assert_eq!(name.to_string(), "foo");
+            assert_eq!(
+                vec![
+                    ColumnDef {
+                        name: Ident::new("bar_tinyint"),
+                        data_type: DataType::TinyInt(Some(3)),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("bar_smallint"),
+                        data_type: DataType::SmallInt(Some(5)),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("bar_mediumint"),
+                        data_type: DataType::MediumInt(Some(13)),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("bar_int"),
+                        data_type: DataType::Int(Some(11)),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: Ident::new("bar_bigint"),
+                        data_type: DataType::BigInt(Some(20)),
+                        options: vec![],
+                    },
+                ],
+                columns
+            );
+        }
+        _ => unreachable!(),
+    }
+    all_dialects_except(|d| d.supports_data_type_signed_suffix())
+        .run_parser_method(sql, |p| p.parse_statement())
+        .expect_err("SIGNED suffix should not be allowed");
+}
+
 #[test]
 fn parse_simple_insert() {
     let sql = r"INSERT INTO tasks (title, priority) VALUES ('Test Some Inserts', 1), ('Test Entry 2', 2), ('Test Entry 3', 3)";
 
     match mysql().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tasks")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
+                table_name
+            );
             assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
             assert!(on.is_none());
             assert_eq!(
@@ -1386,30 +1782,36 @@ fn parse_simple_insert() {
                         explicit_row: false,
                         rows: vec![
                             vec![
-                                Expr::Value(Value::SingleQuotedString(
-                                    "Test Some Inserts".to_string()
-                                )),
-                                Expr::Value(number("1"))
+                                Expr::Value(
+                                    (Value::SingleQuotedString("Test Some Inserts".to_string()))
+                                        .with_empty_span()
+                                ),
+                                Expr::value(number("1"))
                             ],
                             vec![
-                                Expr::Value(Value::SingleQuotedString("Test Entry 2".to_string())),
-                                Expr::Value(number("2"))
+                                Expr::Value(
+                                    (Value::SingleQuotedString("Test Entry 2".to_string()))
+                                        .with_empty_span()
+                                ),
+                                Expr::value(number("2"))
                             ],
                             vec![
-                                Expr::Value(Value::SingleQuotedString("Test Entry 3".to_string())),
-                                Expr::Value(number("3"))
+                                Expr::Value(
+                                    (Value::SingleQuotedString("Test Entry 3".to_string()))
+                                        .with_empty_span()
+                                ),
+                                Expr::value(number("3"))
                             ]
                         ]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1424,14 +1826,17 @@ fn parse_ignore_insert() {
 
     match mysql_and_generic().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             ignore,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tasks")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
+                table_name
+            );
             assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
             assert!(on.is_none());
             assert!(ignore);
@@ -1441,19 +1846,21 @@ fn parse_ignore_insert() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(Value::SingleQuotedString("Test Some Inserts".to_string())),
-                            Expr::Value(number("1"))
+                            Expr::Value(
+                                (Value::SingleQuotedString("Test Some Inserts".to_string()))
+                                    .with_empty_span()
+                            ),
+                            Expr::value(number("1"))
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1468,14 +1875,17 @@ fn parse_priority_insert() {
 
     match mysql_and_generic().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             priority,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tasks")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
+                table_name
+            );
             assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
             assert!(on.is_none());
             assert_eq!(priority, Some(HighPriority));
@@ -1485,19 +1895,21 @@ fn parse_priority_insert() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(Value::SingleQuotedString("Test Some Inserts".to_string())),
-                            Expr::Value(number("1"))
+                            Expr::Value(
+                                (Value::SingleQuotedString("Test Some Inserts".to_string()))
+                                    .with_empty_span()
+                            ),
+                            Expr::value(number("1"))
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1509,14 +1921,17 @@ fn parse_priority_insert() {
 
     match mysql().verified_stmt(sql2) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             priority,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tasks")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
+                table_name
+            );
             assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
             assert!(on.is_none());
             assert_eq!(priority, Some(LowPriority));
@@ -1526,19 +1941,21 @@ fn parse_priority_insert() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(Value::SingleQuotedString("Test Some Inserts".to_string())),
-                            Expr::Value(number("1"))
+                            Expr::Value(
+                                (Value::SingleQuotedString("Test Some Inserts".to_string()))
+                                    .with_empty_span()
+                            ),
+                            Expr::value(number("1"))
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1552,21 +1969,21 @@ fn parse_insert_as() {
     let sql = r"INSERT INTO `table` (`date`) VALUES ('2024-01-01') AS `alias`";
     match mysql_and_generic().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             insert_alias,
             ..
         }) => {
             assert_eq!(
-                ObjectName(vec![Ident::with_quote('`', "table")]),
+                TableObject::TableName(ObjectName::from(vec![Ident::with_quote('`', "table")])),
                 table_name
             );
             assert_eq!(vec![Ident::with_quote('`', "date")], columns);
             let insert_alias = insert_alias.unwrap();
 
             assert_eq!(
-                ObjectName(vec![Ident::with_quote('`', "alias")]),
+                ObjectName::from(vec![Ident::with_quote('`', "alias")]),
                 insert_alias.row_alias
             );
             assert_eq!(Some(vec![]), insert_alias.col_aliases);
@@ -1575,19 +1992,18 @@ fn parse_insert_as() {
                     with: None,
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
-                        rows: vec![vec![Expr::Value(Value::SingleQuotedString(
-                            "2024-01-01".to_string()
-                        ))]]
+                        rows: vec![vec![Expr::Value(
+                            (Value::SingleQuotedString("2024-01-01".to_string())).with_empty_span()
+                        )]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1604,14 +2020,14 @@ fn parse_insert_as() {
     let sql = r"INSERT INTO `table` (`id`, `date`) VALUES (1, '2024-01-01') AS `alias` (`mek_id`, `mek_date`)";
     match mysql_and_generic().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             insert_alias,
             ..
         }) => {
             assert_eq!(
-                ObjectName(vec![Ident::with_quote('`', "table")]),
+                TableObject::TableName(ObjectName::from(vec![Ident::with_quote('`', "table")])),
                 table_name
             );
             assert_eq!(
@@ -1620,7 +2036,7 @@ fn parse_insert_as() {
             );
             let insert_alias = insert_alias.unwrap();
             assert_eq!(
-                ObjectName(vec![Ident::with_quote('`', "alias")]),
+                ObjectName::from(vec![Ident::with_quote('`', "alias")]),
                 insert_alias.row_alias
             );
             assert_eq!(
@@ -1636,19 +2052,21 @@ fn parse_insert_as() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(number("1")),
-                            Expr::Value(Value::SingleQuotedString("2024-01-01".to_string()))
+                            Expr::value(number("1")),
+                            Expr::Value(
+                                (Value::SingleQuotedString("2024-01-01".to_string()))
+                                    .with_empty_span()
+                            )
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1662,7 +2080,7 @@ fn parse_replace_insert() {
     let sql = r"REPLACE DELAYED INTO tasks (title, priority) VALUES ('Test Some Inserts', 1)";
     match mysql().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
@@ -1670,7 +2088,10 @@ fn parse_replace_insert() {
             priority,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tasks")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tasks")])),
+                table_name
+            );
             assert_eq!(vec![Ident::new("title"), Ident::new("priority")], columns);
             assert!(on.is_none());
             assert!(replace_into);
@@ -1681,19 +2102,21 @@ fn parse_replace_insert() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(Value::SingleQuotedString("Test Some Inserts".to_string())),
-                            Expr::Value(number("1"))
+                            Expr::Value(
+                                (Value::SingleQuotedString("Test Some Inserts".to_string()))
+                                    .with_empty_span()
+                            ),
+                            Expr::value(number("1"))
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1708,13 +2131,16 @@ fn parse_empty_row_insert() {
 
     match mysql().one_statement_parses_to(sql, "INSERT INTO tb VALUES (), ()") {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             ..
         }) => {
-            assert_eq!(ObjectName(vec![Ident::new("tb")]), table_name);
+            assert_eq!(
+                TableObject::TableName(ObjectName::from(vec![Ident::new("tb")])),
+                table_name
+            );
             assert!(columns.is_empty());
             assert!(on.is_none());
             assert_eq!(
@@ -1725,14 +2151,13 @@ fn parse_empty_row_insert() {
                         rows: vec![vec![], vec![]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
@@ -1747,14 +2172,14 @@ fn parse_insert_with_on_duplicate_update() {
 
     match mysql().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source,
             on,
             ..
         }) => {
             assert_eq!(
-                ObjectName(vec![Ident::new("permission_groups")]),
+                TableObject::TableName(ObjectName::from(vec![Ident::new("permission_groups")])),
                 table_name
             );
             assert_eq!(
@@ -1774,58 +2199,61 @@ fn parse_insert_with_on_duplicate_update() {
                     body: Box::new(SetExpr::Values(Values {
                         explicit_row: false,
                         rows: vec![vec![
-                            Expr::Value(Value::SingleQuotedString(
-                                "accounting_manager".to_string()
-                            )),
-                            Expr::Value(Value::SingleQuotedString(
-                                "Some description about the group".to_string()
-                            )),
-                            Expr::Value(Value::Boolean(true)),
-                            Expr::Value(Value::Boolean(true)),
-                            Expr::Value(Value::Boolean(true)),
-                            Expr::Value(Value::Boolean(true)),
+                            Expr::Value(
+                                (Value::SingleQuotedString("accounting_manager".to_string()))
+                                    .with_empty_span()
+                            ),
+                            Expr::Value(
+                                (Value::SingleQuotedString(
+                                    "Some description about the group".to_string()
+                                ))
+                                .with_empty_span()
+                            ),
+                            Expr::Value((Value::Boolean(true)).with_empty_span()),
+                            Expr::Value((Value::Boolean(true)).with_empty_span()),
+                            Expr::Value((Value::Boolean(true)).with_empty_span()),
+                            Expr::Value((Value::Boolean(true)).with_empty_span()),
                         ]]
                     })),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 })),
                 source
             );
             assert_eq!(
                 Some(OnInsert::DuplicateKeyUpdate(vec![
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new(
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new(
                             "description".to_string()
                         )])),
                         value: call("VALUES", [Expr::Identifier(Ident::new("description"))]),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new(
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new(
                             "perm_create".to_string()
                         )])),
                         value: call("VALUES", [Expr::Identifier(Ident::new("perm_create"))]),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new(
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new(
                             "perm_read".to_string()
                         )])),
                         value: call("VALUES", [Expr::Identifier(Ident::new("perm_read"))]),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new(
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new(
                             "perm_update".to_string()
                         )])),
                         value: call("VALUES", [Expr::Identifier(Ident::new("perm_update"))]),
                     },
                     Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec![Ident::new(
+                        target: AssignmentTarget::ColumnName(ObjectName::from(vec![Ident::new(
                             "perm_delete".to_string()
                         )])),
                         value: call("VALUES", [Expr::Identifier(Ident::new("perm_delete"))]),
@@ -1846,23 +2274,20 @@ fn parse_select_with_numeric_prefix_column_name() {
             assert_eq!(
                 q.body,
                 Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken::empty(),
+
                     distinct: None,
                     top: None,
                     top_before_distinct: false,
                     projection: vec![SelectItem::UnnamedExpr(Expr::Identifier(Ident::new(
                         "123col_$@123abc"
                     )))],
+                    exclude: None,
                     into: None,
                     from: vec![TableWithJoins {
-                        relation: TableFactor::Table {
-                            name: ObjectName(vec![Ident::with_quote('"', "table")]),
-                            alias: None,
-                            args: None,
-                            with_hints: vec![],
-                            version: None,
-                            partitions: vec![],
-                            with_ordinality: false,
-                        },
+                        relation: table_from_name(ObjectName::from(vec![Ident::with_quote(
+                            '"', "table"
+                        )])),
                         joins: vec![]
                     }],
                     lateral_views: vec![],
@@ -1878,6 +2303,7 @@ fn parse_select_with_numeric_prefix_column_name() {
                     window_before_qualify: false,
                     value_table_mode: None,
                     connect_by: None,
+                    flavor: SelectFlavor::Standard,
                 })))
             );
         }
@@ -1885,6 +2311,128 @@ fn parse_select_with_numeric_prefix_column_name() {
     }
 }
 
+#[test]
+fn parse_qualified_identifiers_with_numeric_prefix() {
+    // Case 1: Qualified column name that starts with digits.
+    match mysql().verified_stmt("SELECT t.15to29 FROM my_table AS t") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::CompoundIdentifier(parts))) => {
+                    assert_eq!(&[Ident::new("t"), Ident::new("15to29")], &parts[..]);
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 2: Qualified column name that starts with digits and on its own represents a number.
+    match mysql().verified_stmt("SELECT t.15e29 FROM my_table AS t") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::CompoundIdentifier(parts))) => {
+                    assert_eq!(&[Ident::new("t"), Ident::new("15e29")], &parts[..]);
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 3: Unqualified, the same token is parsed as a number.
+    match mysql()
+        .parse_sql_statements("SELECT 15e29 FROM my_table")
+        .unwrap()
+        .pop()
+    {
+        Some(Statement::Query(q)) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::Value(ValueWithSpan { value, .. }))) => {
+                    assert_eq!(&number("15e29"), value);
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 4: Quoted simple identifier.
+    match mysql().verified_stmt("SELECT `15e29` FROM my_table") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::Identifier(name))) => {
+                    assert_eq!(&Ident::with_quote('`', "15e29"), name);
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 5: Quoted compound identifier.
+    match mysql().verified_stmt("SELECT t.`15e29` FROM my_table AS t") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::CompoundIdentifier(parts))) => {
+                    assert_eq!(
+                        &[Ident::new("t"), Ident::with_quote('`', "15e29")],
+                        &parts[..]
+                    );
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 6: Multi-level compound identifiers.
+    match mysql().verified_stmt("SELECT 1db.1table.1column") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::CompoundIdentifier(parts))) => {
+                    assert_eq!(
+                        &[
+                            Ident::new("1db"),
+                            Ident::new("1table"),
+                            Ident::new("1column")
+                        ],
+                        &parts[..]
+                    );
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+
+    // Case 7: Multi-level compound quoted identifiers.
+    match mysql().verified_stmt("SELECT `1`.`2`.`3`") {
+        Statement::Query(q) => match *q.body {
+            SetExpr::Select(s) => match s.projection.last() {
+                Some(SelectItem::UnnamedExpr(Expr::CompoundIdentifier(parts))) => {
+                    assert_eq!(
+                        &[
+                            Ident::with_quote('`', "1"),
+                            Ident::with_quote('`', "2"),
+                            Ident::with_quote('`', "3")
+                        ],
+                        &parts[..]
+                    );
+                }
+                proj => panic!("Unexpected projection: {proj:?}"),
+            },
+            body => panic!("Unexpected statement body: {body:?}"),
+        },
+        stmt => panic!("Unexpected statement: {stmt:?}"),
+    }
+}
+
 // Don't run with bigdecimal as it fails like this on rust beta:
 //
 // 'parse_select_with_concatenation_of_exp_number_and_numeric_prefix_column'
@@ -1901,24 +2449,20 @@ fn parse_select_with_concatenation_of_exp_number_and_numeric_prefix_column() {
             assert_eq!(
                 q.body,
                 Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken::empty(),
                     distinct: None,
                     top: None,
                     top_before_distinct: false,
                     projection: vec![
-                        SelectItem::UnnamedExpr(Expr::Value(number("123e4"))),
+                        SelectItem::UnnamedExpr(Expr::value(number("123e4"))),
                         SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("123col_$@123abc")))
                     ],
+                    exclude: None,
                     into: None,
                     from: vec![TableWithJoins {
-                        relation: TableFactor::Table {
-                            name: ObjectName(vec![Ident::with_quote('"', "table")]),
-                            alias: None,
-                            args: None,
-                            with_hints: vec![],
-                            version: None,
-                            partitions: vec![],
-                            with_ordinality: false,
-                        },
+                        relation: table_from_name(ObjectName::from(vec![Ident::with_quote(
+                            '"', "table"
+                        )])),
                         joins: vec![]
                     }],
                     lateral_views: vec![],
@@ -1934,6 +2478,7 @@ fn parse_select_with_concatenation_of_exp_number_and_numeric_prefix_column() {
                     window_before_qualify: false,
                     value_table_mode: None,
                     connect_by: None,
+                    flavor: SelectFlavor::Standard,
                 })))
             );
         }
@@ -1946,12 +2491,12 @@ fn parse_insert_with_numeric_prefix_column_name() {
     let sql = "INSERT INTO s1.t1 (123col_$@length123) VALUES (67.654)";
     match mysql().verified_stmt(sql) {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             ..
         }) => {
             assert_eq!(
-                ObjectName(vec![Ident::new("s1"), Ident::new("t1")]),
+                TableObject::TableName(ObjectName::from(vec![Ident::new("s1"), Ident::new("t1")])),
                 table_name
             );
             assert_eq!(vec![Ident::new("123col_$@length123")], columns);
@@ -1975,7 +2520,7 @@ fn parse_update_with_joins() {
             assert_eq!(
                 TableWithJoins {
                     relation: TableFactor::Table {
-                        name: ObjectName(vec![Ident::new("orders")]),
+                        name: ObjectName::from(vec![Ident::new("orders")]),
                         alias: Some(TableAlias {
                             name: Ident::new("o"),
                             columns: vec![]
@@ -1985,10 +2530,13 @@ fn parse_update_with_joins() {
                         version: None,
                         partitions: vec![],
                         with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
                     },
                     joins: vec![Join {
                         relation: TableFactor::Table {
-                            name: ObjectName(vec![Ident::new("customers")]),
+                            name: ObjectName::from(vec![Ident::new("customers")]),
                             alias: Some(TableAlias {
                                 name: Ident::new("c"),
                                 columns: vec![]
@@ -1998,9 +2546,12 @@ fn parse_update_with_joins() {
                             version: None,
                             partitions: vec![],
                             with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
                         },
                         global: false,
-                        join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+                        join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
                             left: Box::new(Expr::CompoundIdentifier(vec![
                                 Ident::new("o"),
                                 Ident::new("customer_id")
@@ -2017,11 +2568,11 @@ fn parse_update_with_joins() {
             );
             assert_eq!(
                 vec![Assignment {
-                    target: AssignmentTarget::ColumnName(ObjectName(vec![
+                    target: AssignmentTarget::ColumnName(ObjectName::from(vec![
                         Ident::new("o"),
                         Ident::new("completed")
                     ])),
-                    value: Expr::Value(Value::Boolean(true))
+                    value: Expr::Value((Value::Boolean(true)).with_empty_span())
                 }],
                 assignments
             );
@@ -2032,7 +2583,9 @@ fn parse_update_with_joins() {
                         Ident::new("firstname")
                     ])),
                     op: BinaryOperator::Eq,
-                    right: Box::new(Expr::Value(Value::SingleQuotedString("Peter".to_string())))
+                    right: Box::new(Expr::Value(
+                        (Value::SingleQuotedString("Peter".to_string())).with_empty_span()
+                    ))
                 }),
                 selection
             );
@@ -2051,10 +2604,13 @@ fn parse_delete_with_order_by() {
                 vec![OrderByExpr {
                     expr: Expr::Identifier(Ident {
                         value: "id".to_owned(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }),
-                    asc: Some(false),
-                    nulls_first: None,
+                    options: OrderByOptions {
+                        asc: Some(false),
+                        nulls_first: None,
+                    },
                     with_fill: None,
                 }],
                 order_by
@@ -2069,7 +2625,7 @@ fn parse_delete_with_limit() {
     let sql = "DELETE FROM customers LIMIT 100";
     match mysql().verified_stmt(sql) {
         Statement::Delete(Delete { limit, .. }) => {
-            assert_eq!(Some(Expr::Value(number("100"))), limit);
+            assert_eq!(Some(Expr::value(number("100"))), limit);
         }
         _ => unreachable!(),
     }
@@ -2083,11 +2639,13 @@ fn parse_alter_table_add_column() {
             if_exists,
             only,
             operations,
+            iceberg,
             location: _,
             on_cluster: _,
         } => {
             assert_eq!(name.to_string(), "tab");
             assert!(!if_exists);
+            assert!(!iceberg);
             assert!(!only);
             assert_eq!(
                 operations,
@@ -2097,7 +2655,6 @@ fn parse_alter_table_add_column() {
                     column_def: ColumnDef {
                         name: "b".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                     column_position: Some(MySQLColumnPosition::First),
@@ -2113,8 +2670,7 @@ fn parse_alter_table_add_column() {
             if_exists,
             only,
             operations,
-            location: _,
-            on_cluster: _,
+            ..
         } => {
             assert_eq!(name.to_string(), "tab");
             assert!(!if_exists);
@@ -2127,12 +2683,12 @@ fn parse_alter_table_add_column() {
                     column_def: ColumnDef {
                         name: "b".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                     column_position: Some(MySQLColumnPosition::After(Ident {
                         value: String::from("foo"),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     })),
                 },]
             );
@@ -2151,8 +2707,7 @@ fn parse_alter_table_add_columns() {
             if_exists,
             only,
             operations,
-            location: _,
-            on_cluster: _,
+            ..
         } => {
             assert_eq!(name.to_string(), "tab");
             assert!(!if_exists);
@@ -2166,7 +2721,6 @@ fn parse_alter_table_add_columns() {
                         column_def: ColumnDef {
                             name: "a".into(),
                             data_type: DataType::Text,
-                            collation: None,
                             options: vec![],
                         },
                         column_position: Some(MySQLColumnPosition::First),
@@ -2177,12 +2731,12 @@ fn parse_alter_table_add_columns() {
                         column_def: ColumnDef {
                             name: "b".into(),
                             data_type: DataType::Int(None),
-                            collation: None,
                             options: vec![],
                         },
                         column_position: Some(MySQLColumnPosition::After(Ident {
                             value: String::from("foo"),
                             quote_style: None,
+                            span: Span::empty(),
                         })),
                     },
                 ]
@@ -2200,9 +2754,19 @@ fn parse_alter_table_drop_primary_key() {
     );
 }
 
+#[test]
+fn parse_alter_table_drop_foreign_key() {
+    assert_matches!(
+        alter_table_op(
+            mysql_and_generic().verified_stmt("ALTER TABLE tab DROP FOREIGN KEY foo_ibfk_1")
+        ),
+        AlterTableOperation::DropForeignKey { name } if name.value == "foo_ibfk_1"
+    );
+}
+
 #[test]
 fn parse_alter_table_change_column() {
-    let expected_name = ObjectName(vec![Ident::new("orders")]);
+    let expected_name = ObjectName::from(vec![Ident::new("orders")]);
     let expected_operation = AlterTableOperation::ChangeColumn {
         old_name: Ident::new("description"),
         new_name: Ident::new("desc"),
@@ -2243,6 +2807,7 @@ fn parse_alter_table_change_column() {
         column_position: Some(MySQLColumnPosition::After(Ident {
             value: String::from("foo"),
             quote_style: None,
+            span: Span::empty(),
         })),
     };
     let sql4 = "ALTER TABLE orders CHANGE COLUMN description desc TEXT NOT NULL AFTER foo";
@@ -2253,7 +2818,7 @@ fn parse_alter_table_change_column() {
 
 #[test]
 fn parse_alter_table_change_column_with_column_position() {
-    let expected_name = ObjectName(vec![Ident::new("orders")]);
+    let expected_name = ObjectName::from(vec![Ident::new("orders")]);
     let expected_operation_first = AlterTableOperation::ChangeColumn {
         old_name: Ident::new("description"),
         new_name: Ident::new("desc"),
@@ -2282,6 +2847,7 @@ fn parse_alter_table_change_column_with_column_position() {
         column_position: Some(MySQLColumnPosition::After(Ident {
             value: String::from("total_count"),
             quote_style: None,
+            span: Span::empty(),
         })),
     };
 
@@ -2300,7 +2866,7 @@ fn parse_alter_table_change_column_with_column_position() {
 
 #[test]
 fn parse_alter_table_modify_column() {
-    let expected_name = ObjectName(vec![Ident::new("orders")]);
+    let expected_name = ObjectName::from(vec![Ident::new("orders")]);
     let expected_operation = AlterTableOperation::ModifyColumn {
         col_name: Ident::new("description"),
         data_type: DataType::Text,
@@ -2338,6 +2904,7 @@ fn parse_alter_table_modify_column() {
         column_position: Some(MySQLColumnPosition::After(Ident {
             value: String::from("foo"),
             quote_style: None,
+            span: Span::empty(),
         })),
     };
     let sql4 = "ALTER TABLE orders MODIFY COLUMN description TEXT NOT NULL AFTER foo";
@@ -2346,9 +2913,118 @@ fn parse_alter_table_modify_column() {
     assert_eq!(expected_operation, operation);
 }
 
+#[test]
+fn parse_alter_table_with_algorithm() {
+    let sql = "ALTER TABLE tab ALGORITHM = COPY";
+    let expected_operation = AlterTableOperation::Algorithm {
+        equals: true,
+        algorithm: AlterTableAlgorithm::Copy,
+    };
+    let operation = alter_table_op(mysql_and_generic().verified_stmt(sql));
+    assert_eq!(expected_operation, operation);
+
+    //  Check order doesn't matter
+    let sql =
+        "ALTER TABLE users DROP COLUMN password_digest, ALGORITHM = COPY, RENAME COLUMN name TO username";
+    let stmt = mysql_and_generic().verified_stmt(sql);
+    match stmt {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![
+                    AlterTableOperation::DropColumn {
+                        has_column_keyword: true,
+                        column_names: vec![Ident::new("password_digest")],
+                        if_exists: false,
+                        drop_behavior: None,
+                    },
+                    AlterTableOperation::Algorithm {
+                        equals: true,
+                        algorithm: AlterTableAlgorithm::Copy,
+                    },
+                    AlterTableOperation::RenameColumn {
+                        old_column_name: Ident::new("name"),
+                        new_column_name: Ident::new("username")
+                    },
+                ]
+            )
+        }
+        _ => panic!("Unexpected statement {stmt}"),
+    }
+
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM DEFAULT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM INSTANT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM INPLACE");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM COPY");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM = DEFAULT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM = INSTANT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM = INPLACE");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` ALGORITHM = COPY");
+}
+
+#[test]
+fn parse_alter_table_with_lock() {
+    let sql = "ALTER TABLE tab LOCK = SHARED";
+    let expected_operation = AlterTableOperation::Lock {
+        equals: true,
+        lock: AlterTableLock::Shared,
+    };
+    let operation = alter_table_op(mysql_and_generic().verified_stmt(sql));
+    assert_eq!(expected_operation, operation);
+
+    let sql =
+        "ALTER TABLE users DROP COLUMN password_digest, LOCK = EXCLUSIVE, RENAME COLUMN name TO username";
+    let stmt = mysql_and_generic().verified_stmt(sql);
+    match stmt {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![
+                    AlterTableOperation::DropColumn {
+                        has_column_keyword: true,
+                        column_names: vec![Ident::new("password_digest")],
+                        if_exists: false,
+                        drop_behavior: None,
+                    },
+                    AlterTableOperation::Lock {
+                        equals: true,
+                        lock: AlterTableLock::Exclusive,
+                    },
+                    AlterTableOperation::RenameColumn {
+                        old_column_name: Ident::new("name"),
+                        new_column_name: Ident::new("username")
+                    },
+                ]
+            )
+        }
+        _ => panic!("Unexpected statement {stmt}"),
+    }
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK DEFAULT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK SHARED");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK NONE");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK EXCLUSIVE");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK = DEFAULT");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK = SHARED");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK = NONE");
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` LOCK = EXCLUSIVE");
+}
+
+#[test]
+fn parse_alter_table_auto_increment() {
+    let sql = "ALTER TABLE tab AUTO_INCREMENT = 42";
+    let expected_operation = AlterTableOperation::AutoIncrement {
+        equals: true,
+        value: number("42").with_empty_span(),
+    };
+    let operation = alter_table_op(mysql().verified_stmt(sql));
+    assert_eq!(expected_operation, operation);
+
+    mysql_and_generic().verified_stmt("ALTER TABLE `users` AUTO_INCREMENT 42");
+}
+
 #[test]
 fn parse_alter_table_modify_column_with_column_position() {
-    let expected_name = ObjectName(vec![Ident::new("orders")]);
+    let expected_name = ObjectName::from(vec![Ident::new("orders")]);
     let expected_operation_first = AlterTableOperation::ModifyColumn {
         col_name: Ident::new("description"),
         data_type: DataType::Text,
@@ -2375,6 +3051,7 @@ fn parse_alter_table_modify_column_with_column_position() {
         column_position: Some(MySQLColumnPosition::After(Ident {
             value: String::from("total_count"),
             quote_style: None,
+            span: Span::empty(),
         })),
     };
 
@@ -2393,6 +3070,8 @@ fn parse_alter_table_modify_column_with_column_position() {
 
 #[test]
 fn parse_substring_in_select() {
+    use sqlparser::tokenizer::Span;
+
     let sql = "SELECT DISTINCT SUBSTRING(description, 0, 1) FROM test";
     match mysql().one_statement_parses_to(
         sql,
@@ -2403,32 +3082,33 @@ fn parse_substring_in_select() {
                 Box::new(Query {
                     with: None,
                     body: Box::new(SetExpr::Select(Box::new(Select {
+                        select_token: AttachedToken::empty(),
                         distinct: Some(Distinct::Distinct),
                         top: None,
                         top_before_distinct: false,
                         projection: vec![SelectItem::UnnamedExpr(Expr::Substring {
                             expr: Box::new(Expr::Identifier(Ident {
                                 value: "description".to_string(),
-                                quote_style: None
+                                quote_style: None,
+                                span: Span::empty(),
                             })),
-                            substring_from: Some(Box::new(Expr::Value(number("0")))),
-                            substring_for: Some(Box::new(Expr::Value(number("1")))),
+                            substring_from: Some(Box::new(Expr::Value(
+                                (number("0")).with_empty_span()
+                            ))),
+                            substring_for: Some(Box::new(Expr::Value(
+                                (number("1")).with_empty_span()
+                            ))),
                             special: true,
+                            shorthand: false,
                         })],
+                        exclude: None,
                         into: None,
                         from: vec![TableWithJoins {
-                            relation: TableFactor::Table {
-                                name: ObjectName(vec![Ident {
-                                    value: "test".to_string(),
-                                    quote_style: None
-                                }]),
-                                alias: None,
-                                args: None,
-                                with_hints: vec![],
-                                version: None,
-                                partitions: vec![],
-                                with_ordinality: false,
-                            },
+                            relation: table_from_name(ObjectName::from(vec![Ident {
+                                value: "test".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            }])),
                             joins: vec![]
                         }],
                         lateral_views: vec![],
@@ -2444,16 +3124,16 @@ fn parse_substring_in_select() {
                         qualify: None,
                         value_table_mode: None,
                         connect_by: None,
+                        flavor: SelectFlavor::Standard,
                     }))),
                     order_by: None,
-                    limit: None,
-                    limit_by: vec![],
-                    offset: None,
+                    limit_clause: None,
                     fetch: None,
                     locks: vec![],
                     for_clause: None,
                     settings: None,
                     format_clause: None,
+                    pipe_operators: vec![],
                 }),
                 query
             );
@@ -2487,6 +3167,17 @@ fn parse_rlike_and_regexp() {
     }
 }
 
+#[test]
+fn parse_like_with_escape() {
+    // verify backslash is not stripped for escaped wildcards
+    mysql().verified_only_select(r#"SELECT 'a\%c' LIKE 'a\%c'"#);
+    mysql().verified_only_select(r#"SELECT 'a\_c' LIKE 'a\_c'"#);
+    mysql().verified_only_select(r#"SELECT '%\_\%' LIKE '%\_\%'"#);
+    mysql().verified_only_select(r#"SELECT '\_\%' LIKE CONCAT('\_', '\%')"#);
+    mysql().verified_only_select(r#"SELECT 'a%c' LIKE 'a$%c' ESCAPE '$'"#);
+    mysql().verified_only_select(r#"SELECT 'a_c' LIKE 'a#_c' ESCAPE '#'"#);
+}
+
 #[test]
 fn parse_kill() {
     let stmt = mysql_and_generic().verified_stmt("KILL CONNECTION 5");
@@ -2518,7 +3209,7 @@ fn parse_kill() {
 }
 
 #[test]
-fn parse_table_colum_option_on_update() {
+fn parse_table_column_option_on_update() {
     let sql1 = "CREATE TABLE foo (`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP())";
     match mysql().verified_stmt(sql1) {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
@@ -2527,7 +3218,6 @@ fn parse_table_colum_option_on_update() {
                 vec![ColumnDef {
                     name: Ident::with_quote('`', "modification_time"),
                     data_type: DataType::Datetime(None),
-                    collation: None,
                     options: vec![ColumnOptionDef {
                         name: None,
                         option: ColumnOption::OnUpdate(call("CURRENT_TIMESTAMP", [])),
@@ -2545,19 +3235,19 @@ fn parse_set_names() {
     let stmt = mysql_and_generic().verified_stmt("SET NAMES utf8mb4");
     assert_eq!(
         stmt,
-        Statement::SetNames {
-            charset_name: "utf8mb4".to_string(),
+        Statement::Set(Set::SetNames {
+            charset_name: "utf8mb4".into(),
             collation_name: None,
-        }
+        })
     );
 
     let stmt = mysql_and_generic().verified_stmt("SET NAMES utf8mb4 COLLATE bogus");
     assert_eq!(
         stmt,
-        Statement::SetNames {
-            charset_name: "utf8mb4".to_string(),
+        Statement::Set(Set::SetNames {
+            charset_name: "utf8mb4".into(),
             collation_name: Some("bogus".to_string()),
-        }
+        })
     );
 
     let stmt = mysql_and_generic()
@@ -2565,22 +3255,20 @@ fn parse_set_names() {
         .unwrap();
     assert_eq!(
         stmt,
-        vec![Statement::SetNames {
-            charset_name: "utf8mb4".to_string(),
+        vec![Statement::Set(Set::SetNames {
+            charset_name: "utf8mb4".into(),
             collation_name: Some("bogus".to_string()),
-        }]
+        })]
     );
 
     let stmt = mysql_and_generic().verified_stmt("SET NAMES DEFAULT");
-    assert_eq!(stmt, Statement::SetNamesDefault {});
+    assert_eq!(stmt, Statement::Set(Set::SetNamesDefault {}));
 }
 
 #[test]
 fn parse_limit_my_sql_syntax() {
-    mysql_and_generic().one_statement_parses_to(
-        "SELECT id, fname, lname FROM customer LIMIT 5, 10",
-        "SELECT id, fname, lname FROM customer LIMIT 10 OFFSET 5",
-    );
+    mysql_and_generic().verified_stmt("SELECT id, fname, lname FROM customer LIMIT 10 OFFSET 5");
+    mysql_and_generic().verified_stmt("SELECT id, fname, lname FROM customer LIMIT 5, 10");
     mysql_and_generic().verified_stmt("SELECT * FROM user LIMIT ? OFFSET ?");
 }
 
@@ -2704,14 +3392,6 @@ fn parse_create_table_with_fulltext_definition_should_not_accept_constraint_name
     mysql_and_generic().verified_stmt("CREATE TABLE tb (c1 INT, CONSTRAINT cons FULLTEXT (c1))");
 }
 
-fn mysql() -> TestedDialects {
-    TestedDialects::new(vec![Box::new(MySqlDialect {})])
-}
-
-fn mysql_and_generic() -> TestedDialects {
-    TestedDialects::new(vec![Box::new(MySqlDialect {}), Box::new(GenericDialect {})])
-}
-
 #[test]
 fn parse_values() {
     mysql().verified_stmt("VALUES ROW(1, true, 'a')");
@@ -2725,13 +3405,18 @@ fn parse_hex_string_introducer() {
         Statement::Query(Box::new(Query {
             with: None,
             body: Box::new(SetExpr::Select(Box::new(Select {
+                select_token: AttachedToken::empty(),
                 distinct: None,
                 top: None,
                 top_before_distinct: false,
-                projection: vec![SelectItem::UnnamedExpr(Expr::IntroducedString {
-                    introducer: "_latin1".to_string(),
-                    value: Value::HexStringLiteral("4D7953514C".to_string())
+                projection: vec![SelectItem::UnnamedExpr(Expr::Prefixed {
+                    prefix: Ident::from("_latin1"),
+                    value: Expr::Value(
+                        Value::HexStringLiteral("4D7953514C".to_string()).with_empty_span()
+                    )
+                    .into(),
                 })],
+                exclude: None,
                 from: vec![],
                 lateral_views: vec![],
                 prewhere: None,
@@ -2747,16 +3432,16 @@ fn parse_hex_string_introducer() {
                 value_table_mode: None,
                 into: None,
                 connect_by: None,
+                flavor: SelectFlavor::Standard,
             }))),
             order_by: None,
-            limit: None,
-            limit_by: vec![],
-            offset: None,
+            limit_clause: None,
             fetch: None,
             locks: vec![],
             for_clause: None,
             settings: None,
             format_clause: None,
+            pipe_operators: vec![],
         }))
     )
 }
@@ -2818,19 +3503,27 @@ fn parse_convert_using() {
 #[test]
 fn parse_create_table_with_column_collate() {
     let sql = "CREATE TABLE tb (id TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci)";
-    let canonical = "CREATE TABLE tb (id TEXT COLLATE utf8mb4_0900_ai_ci CHARACTER SET utf8mb4)";
-    match mysql().one_statement_parses_to(sql, canonical) {
+    match mysql().verified_stmt(sql) {
         Statement::CreateTable(CreateTable { name, columns, .. }) => {
             assert_eq!(name.to_string(), "tb");
             assert_eq!(
                 vec![ColumnDef {
                     name: Ident::new("id"),
                     data_type: DataType::Text,
-                    collation: Some(ObjectName(vec![Ident::new("utf8mb4_0900_ai_ci")])),
-                    options: vec![ColumnOptionDef {
-                        name: None,
-                        option: ColumnOption::CharacterSet(ObjectName(vec![Ident::new("utf8mb4")]))
-                    }],
+                    options: vec![
+                        ColumnOptionDef {
+                            name: None,
+                            option: ColumnOption::CharacterSet(ObjectName::from(vec![Ident::new(
+                                "utf8mb4"
+                            )]))
+                        },
+                        ColumnOptionDef {
+                            name: None,
+                            option: ColumnOption::Collation(ObjectName::from(vec![Ident::new(
+                                "utf8mb4_0900_ai_ci"
+                            )]))
+                        }
+                    ],
                 },],
                 columns
             );
@@ -2891,7 +3584,7 @@ fn parse_json_table() {
             .from[0]
             .relation,
         TableFactor::JsonTable {
-            json_expr: Expr::Value(Value::SingleQuotedString("[1,2]".to_string())),
+            json_expr: Expr::Value((Value::SingleQuotedString("[1,2]".to_string())).with_empty_span()),
             json_path: Value::SingleQuotedString("$[*]".to_string()),
             columns: vec![
                 JsonTableColumn::Named(JsonTableNamedColumn {
@@ -2929,33 +3622,33 @@ fn parse_logical_xor() {
     let select = mysql_and_generic().verified_only_select(sql);
     assert_eq!(
         SelectItem::UnnamedExpr(Expr::BinaryOp {
-            left: Box::new(Expr::Value(Value::Boolean(true))),
+            left: Box::new(Expr::Value((Value::Boolean(true)).with_empty_span())),
             op: BinaryOperator::Xor,
-            right: Box::new(Expr::Value(Value::Boolean(true))),
+            right: Box::new(Expr::Value((Value::Boolean(true)).with_empty_span())),
         }),
         select.projection[0]
     );
     assert_eq!(
         SelectItem::UnnamedExpr(Expr::BinaryOp {
-            left: Box::new(Expr::Value(Value::Boolean(false))),
+            left: Box::new(Expr::Value((Value::Boolean(false)).with_empty_span())),
             op: BinaryOperator::Xor,
-            right: Box::new(Expr::Value(Value::Boolean(false))),
+            right: Box::new(Expr::Value((Value::Boolean(false)).with_empty_span())),
         }),
         select.projection[1]
     );
     assert_eq!(
         SelectItem::UnnamedExpr(Expr::BinaryOp {
-            left: Box::new(Expr::Value(Value::Boolean(true))),
+            left: Box::new(Expr::Value((Value::Boolean(true)).with_empty_span())),
             op: BinaryOperator::Xor,
-            right: Box::new(Expr::Value(Value::Boolean(false))),
+            right: Box::new(Expr::Value((Value::Boolean(false)).with_empty_span())),
         }),
         select.projection[2]
     );
     assert_eq!(
         SelectItem::UnnamedExpr(Expr::BinaryOp {
-            left: Box::new(Expr::Value(Value::Boolean(false))),
+            left: Box::new(Expr::Value((Value::Boolean(false)).with_empty_span())),
             op: BinaryOperator::Xor,
-            right: Box::new(Expr::Value(Value::Boolean(true))),
+            right: Box::new(Expr::Value((Value::Boolean(true)).with_empty_span())),
         }),
         select.projection[3]
     );
@@ -2967,7 +3660,553 @@ fn parse_bitstring_literal() {
     assert_eq!(
         select.projection,
         vec![SelectItem::UnnamedExpr(Expr::Value(
-            Value::SingleQuotedByteStringLiteral("111".to_string())
+            (Value::SingleQuotedByteStringLiteral("111".to_string())).with_empty_span()
         ))]
     );
 }
+
+#[test]
+fn parse_grant() {
+    let sql = "GRANT ALL ON *.* TO 'jeffrey'@'%'";
+    let stmt = mysql().verified_stmt(sql);
+    if let Statement::Grant {
+        privileges,
+        objects,
+        grantees,
+        with_grant_option,
+        as_grantor: _,
+        granted_by,
+        current_grants: _,
+    } = stmt
+    {
+        assert_eq!(
+            privileges,
+            Privileges::All {
+                with_privileges_keyword: false
+            }
+        );
+        assert_eq!(
+            objects,
+            Some(GrantObjects::Tables(vec![ObjectName::from(vec![
+                "*".into(),
+                "*".into()
+            ])]))
+        );
+        assert!(!with_grant_option);
+        assert!(granted_by.is_none());
+        if let [Grantee {
+            grantee_type: GranteesType::None,
+            name: Some(GranteeName::UserHost { user, host }),
+        }] = grantees.as_slice()
+        {
+            assert_eq!(user.value, "jeffrey");
+            assert_eq!(user.quote_style, Some('\''));
+            assert_eq!(host.value, "%");
+            assert_eq!(host.quote_style, Some('\''));
+        } else {
+            unreachable!()
+        }
+    } else {
+        unreachable!()
+    }
+}
+
+#[test]
+fn parse_revoke() {
+    let sql = "REVOKE ALL ON db1.* FROM 'jeffrey'@'%'";
+    let stmt = mysql_and_generic().verified_stmt(sql);
+    if let Statement::Revoke {
+        privileges,
+        objects,
+        grantees,
+        granted_by,
+        cascade,
+    } = stmt
+    {
+        assert_eq!(
+            privileges,
+            Privileges::All {
+                with_privileges_keyword: false
+            }
+        );
+        assert_eq!(
+            objects,
+            Some(GrantObjects::Tables(vec![ObjectName::from(vec![
+                "db1".into(),
+                "*".into()
+            ])]))
+        );
+        if let [Grantee {
+            grantee_type: GranteesType::None,
+            name: Some(GranteeName::UserHost { user, host }),
+        }] = grantees.as_slice()
+        {
+            assert_eq!(user.value, "jeffrey");
+            assert_eq!(user.quote_style, Some('\''));
+            assert_eq!(host.value, "%");
+            assert_eq!(host.quote_style, Some('\''));
+        } else {
+            unreachable!()
+        }
+        assert!(granted_by.is_none());
+        assert!(cascade.is_none());
+    } else {
+        unreachable!()
+    }
+}
+
+#[test]
+fn parse_create_view_algorithm_param() {
+    let sql = "CREATE ALGORITHM = MERGE VIEW foo AS SELECT 1";
+    let stmt = mysql().verified_stmt(sql);
+    if let Statement::CreateView {
+        params:
+            Some(CreateViewParams {
+                algorithm,
+                definer,
+                security,
+            }),
+        ..
+    } = stmt
+    {
+        assert_eq!(algorithm, Some(CreateViewAlgorithm::Merge));
+        assert!(definer.is_none());
+        assert!(security.is_none());
+    } else {
+        unreachable!()
+    }
+    mysql().verified_stmt("CREATE ALGORITHM = UNDEFINED VIEW foo AS SELECT 1");
+    mysql().verified_stmt("CREATE ALGORITHM = TEMPTABLE VIEW foo AS SELECT 1");
+}
+
+#[test]
+fn parse_create_view_definer_param() {
+    let sql = "CREATE DEFINER = 'jeffrey'@'localhost' VIEW foo AS SELECT 1";
+    let stmt = mysql().verified_stmt(sql);
+    if let Statement::CreateView {
+        params:
+            Some(CreateViewParams {
+                algorithm,
+                definer,
+                security,
+            }),
+        ..
+    } = stmt
+    {
+        assert!(algorithm.is_none());
+        if let Some(GranteeName::UserHost { user, host }) = definer {
+            assert_eq!(user.value, "jeffrey");
+            assert_eq!(user.quote_style, Some('\''));
+            assert_eq!(host.value, "localhost");
+            assert_eq!(host.quote_style, Some('\''));
+        } else {
+            unreachable!()
+        }
+        assert!(security.is_none());
+    } else {
+        unreachable!()
+    }
+}
+
+#[test]
+fn parse_create_view_security_param() {
+    let sql = "CREATE SQL SECURITY DEFINER VIEW foo AS SELECT 1";
+    let stmt = mysql().verified_stmt(sql);
+    if let Statement::CreateView {
+        params:
+            Some(CreateViewParams {
+                algorithm,
+                definer,
+                security,
+            }),
+        ..
+    } = stmt
+    {
+        assert!(algorithm.is_none());
+        assert!(definer.is_none());
+        assert_eq!(security, Some(CreateViewSecurity::Definer));
+    } else {
+        unreachable!()
+    }
+    mysql().verified_stmt("CREATE SQL SECURITY INVOKER VIEW foo AS SELECT 1");
+}
+
+#[test]
+fn parse_create_view_multiple_params() {
+    let sql = "CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW foo AS SELECT 1";
+    let stmt = mysql().verified_stmt(sql);
+    if let Statement::CreateView {
+        params:
+            Some(CreateViewParams {
+                algorithm,
+                definer,
+                security,
+            }),
+        ..
+    } = stmt
+    {
+        assert_eq!(algorithm, Some(CreateViewAlgorithm::Undefined));
+        if let Some(GranteeName::UserHost { user, host }) = definer {
+            assert_eq!(user.value, "root");
+            assert_eq!(user.quote_style, Some('`'));
+            assert_eq!(host.value, "%");
+            assert_eq!(host.quote_style, Some('`'));
+        } else {
+            unreachable!()
+        }
+        assert_eq!(security, Some(CreateViewSecurity::Invoker));
+    } else {
+        unreachable!()
+    }
+}
+
+#[test]
+fn parse_longblob_type() {
+    let sql = "CREATE TABLE foo (bar LONGBLOB)";
+    let stmt = mysql_and_generic().verified_stmt(sql);
+    if let Statement::CreateTable(CreateTable { columns, .. }) = stmt {
+        assert_eq!(columns.len(), 1);
+        assert_eq!(columns[0].data_type, DataType::LongBlob);
+    } else {
+        unreachable!()
+    }
+    mysql_and_generic().verified_stmt("CREATE TABLE foo (bar TINYBLOB)");
+    mysql_and_generic().verified_stmt("CREATE TABLE foo (bar MEDIUMBLOB)");
+    mysql_and_generic().verified_stmt("CREATE TABLE foo (bar TINYTEXT)");
+    mysql_and_generic().verified_stmt("CREATE TABLE foo (bar MEDIUMTEXT)");
+    mysql_and_generic().verified_stmt("CREATE TABLE foo (bar LONGTEXT)");
+}
+
+#[test]
+fn parse_begin_without_transaction() {
+    mysql().verified_stmt("BEGIN");
+}
+
+#[test]
+fn parse_geometric_types_srid_option() {
+    mysql_and_generic().verified_stmt("CREATE TABLE t (a geometry SRID 4326)");
+}
+
+#[test]
+fn parse_double_precision() {
+    mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE)");
+    mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE(11,0))");
+    mysql().one_statement_parses_to(
+        "CREATE TABLE foo (bar DOUBLE(11, 0))",
+        "CREATE TABLE foo (bar DOUBLE(11,0))",
+    );
+}
+
+#[test]
+fn parse_looks_like_single_line_comment() {
+    mysql().one_statement_parses_to(
+        "UPDATE account SET balance=balance--1 WHERE account_id=5752",
+        "UPDATE account SET balance = balance - -1 WHERE account_id = 5752",
+    );
+    mysql().one_statement_parses_to(
+        r#"
+            UPDATE account SET balance=balance-- 1
+            WHERE account_id=5752
+        "#,
+        "UPDATE account SET balance = balance WHERE account_id = 5752",
+    );
+}
+
+#[test]
+fn parse_create_trigger() {
+    let sql_create_trigger = r#"
+        CREATE TRIGGER emp_stamp BEFORE INSERT ON emp
+            FOR EACH ROW EXECUTE FUNCTION emp_stamp();
+    "#;
+    let create_stmt = mysql().one_statement_parses_to(sql_create_trigger, "");
+    assert_eq!(
+        create_stmt,
+        Statement::CreateTrigger {
+            or_alter: false,
+            or_replace: false,
+            is_constraint: false,
+            name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+            period: TriggerPeriod::Before,
+            events: vec![TriggerEvent::Insert],
+            table_name: ObjectName::from(vec![Ident::new("emp")]),
+            referenced_table_name: None,
+            referencing: vec![],
+            trigger_object: TriggerObject::Row,
+            include_each: true,
+            condition: None,
+            exec_body: Some(TriggerExecBody {
+                exec_type: TriggerExecBodyType::Function,
+                func_desc: FunctionDesc {
+                    name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+                    args: None,
+                }
+            }),
+            statements: None,
+            characteristics: None,
+        }
+    );
+}
+
+#[test]
+fn parse_drop_trigger() {
+    let sql_drop_trigger = "DROP TRIGGER emp_stamp;";
+    let drop_stmt = mysql().one_statement_parses_to(sql_drop_trigger, "");
+    assert_eq!(
+        drop_stmt,
+        Statement::DropTrigger {
+            if_exists: false,
+            trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+            table_name: None,
+            option: None,
+        }
+    );
+}
+
+#[test]
+fn parse_cast_integers() {
+    mysql().verified_expr("CAST(foo AS UNSIGNED)");
+    mysql().verified_expr("CAST(foo AS SIGNED)");
+    mysql().verified_expr("CAST(foo AS UNSIGNED INTEGER)");
+    mysql().verified_expr("CAST(foo AS SIGNED INTEGER)");
+
+    mysql()
+        .run_parser_method("CAST(foo AS UNSIGNED(3))", |p| p.parse_expr())
+        .expect_err("CAST doesn't allow display width");
+    mysql()
+        .run_parser_method("CAST(foo AS UNSIGNED(3) INTEGER)", |p| p.parse_expr())
+        .expect_err("CAST doesn't allow display width");
+    mysql()
+        .run_parser_method("CAST(foo AS UNSIGNED INTEGER(3))", |p| p.parse_expr())
+        .expect_err("CAST doesn't allow display width");
+}
+
+#[test]
+fn parse_match_against_with_alias() {
+    let sql = "SELECT tbl.ProjectID FROM surveys.tbl1 AS tbl WHERE MATCH (tbl.ReferenceID) AGAINST ('AAA' IN BOOLEAN MODE)";
+    match mysql().verified_stmt(sql) {
+        Statement::Query(query) => match *query.body {
+            SetExpr::Select(select) => match select.selection {
+                Some(Expr::MatchAgainst {
+                    columns,
+                    match_value,
+                    opt_search_modifier,
+                }) => {
+                    assert_eq!(
+                        columns,
+                        vec![ObjectName::from(vec![
+                            Ident::new("tbl"),
+                            Ident::new("ReferenceID")
+                        ])]
+                    );
+                    assert_eq!(match_value, Value::SingleQuotedString("AAA".to_owned()));
+                    assert_eq!(opt_search_modifier, Some(SearchModifier::InBooleanMode));
+                }
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        },
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn test_variable_assignment_using_colon_equal() {
+    let sql_select = "SELECT @price := price, @tax := price * 0.1 FROM products WHERE id = 1";
+    let stmt = mysql().verified_stmt(sql_select);
+    match stmt {
+        Statement::Query(query) => {
+            let select = query.body.as_select().unwrap();
+
+            assert_eq!(
+                select.projection,
+                vec![
+                    SelectItem::UnnamedExpr(Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident {
+                            value: "@price".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })),
+                        op: BinaryOperator::Assignment,
+                        right: Box::new(Expr::Identifier(Ident {
+                            value: "price".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })),
+                    }),
+                    SelectItem::UnnamedExpr(Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident {
+                            value: "@tax".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })),
+                        op: BinaryOperator::Assignment,
+                        right: Box::new(Expr::BinaryOp {
+                            left: Box::new(Expr::Identifier(Ident {
+                                value: "price".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            })),
+                            op: BinaryOperator::Multiply,
+                            right: Box::new(Expr::Value(
+                                (test_utils::number("0.1")).with_empty_span()
+                            )),
+                        }),
+                    }),
+                ]
+            );
+
+            assert_eq!(
+                select.selection,
+                Some(Expr::BinaryOp {
+                    left: Box::new(Expr::Identifier(Ident {
+                        value: "id".to_string(),
+                        quote_style: None,
+                        span: Span::empty(),
+                    })),
+                    op: BinaryOperator::Eq,
+                    right: Box::new(Expr::Value((test_utils::number("1")).with_empty_span())),
+                })
+            );
+        }
+        _ => panic!("Unexpected statement {stmt}"),
+    }
+
+    let sql_update =
+        "UPDATE products SET price = @new_price := price * 1.1 WHERE category = 'Books'";
+    let stmt = mysql().verified_stmt(sql_update);
+
+    match stmt {
+        Statement::Update { assignments, .. } => {
+            assert_eq!(
+                assignments,
+                vec![Assignment {
+                    target: AssignmentTarget::ColumnName(ObjectName(vec![
+                        ObjectNamePart::Identifier(Ident {
+                            value: "price".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })
+                    ])),
+                    value: Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident {
+                            value: "@new_price".to_string(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })),
+                        op: BinaryOperator::Assignment,
+                        right: Box::new(Expr::BinaryOp {
+                            left: Box::new(Expr::Identifier(Ident {
+                                value: "price".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            })),
+                            op: BinaryOperator::Multiply,
+                            right: Box::new(Expr::Value(
+                                (test_utils::number("1.1")).with_empty_span()
+                            )),
+                        }),
+                    },
+                }]
+            )
+        }
+        _ => panic!("Unexpected statement {stmt}"),
+    }
+}
+
+#[test]
+fn parse_straight_join() {
+    mysql().verified_stmt(
+        "SELECT a.*, b.* FROM table_a AS a STRAIGHT_JOIN table_b AS b ON a.b_id = b.id",
+    );
+    // Without table alias
+    mysql()
+        .verified_stmt("SELECT a.*, b.* FROM table_a STRAIGHT_JOIN table_b AS b ON a.b_id = b.id");
+}
+
+#[test]
+fn mysql_foreign_key_with_index_name() {
+    mysql().verified_stmt(
+        "CREATE TABLE orders (customer_id INT, INDEX idx_customer (customer_id), CONSTRAINT fk_customer FOREIGN KEY idx_customer (customer_id) REFERENCES customers(id))",
+    );
+}
+
+#[test]
+fn parse_drop_index() {
+    let sql = "DROP INDEX idx_name ON table_name";
+    match mysql().verified_stmt(sql) {
+        Statement::Drop {
+            object_type,
+            if_exists,
+            names,
+            cascade,
+            restrict,
+            purge,
+            temporary,
+            table,
+        } => {
+            assert!(!if_exists);
+            assert_eq!(ObjectType::Index, object_type);
+            assert_eq!(
+                vec!["idx_name"],
+                names.iter().map(ToString::to_string).collect::<Vec<_>>()
+            );
+            assert!(!cascade);
+            assert!(!restrict);
+            assert!(!purge);
+            assert!(!temporary);
+            assert!(table.is_some());
+            assert_eq!("table_name", table.unwrap().to_string());
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_alter_table_drop_index() {
+    assert_matches!(
+        alter_table_op(
+            mysql_and_generic().verified_stmt("ALTER TABLE tab DROP INDEX idx_index")
+        ),
+        AlterTableOperation::DropIndex { name } if name.value == "idx_index"
+    );
+}
+
+#[test]
+fn parse_json_member_of() {
+    mysql().verified_stmt(r#"SELECT 17 MEMBER OF('[23, "abc", 17, "ab", 10]')"#);
+    let sql = r#"SELECT 'ab' MEMBER OF('[23, "abc", 17, "ab", 10]')"#;
+    let stmt = mysql().verified_stmt(sql);
+    match stmt {
+        Statement::Query(query) => {
+            let select = query.body.as_select().unwrap();
+            assert_eq!(
+                select.projection,
+                vec![SelectItem::UnnamedExpr(Expr::MemberOf(MemberOf {
+                    value: Box::new(Expr::Value(
+                        Value::SingleQuotedString("ab".to_string()).into()
+                    )),
+                    array: Box::new(Expr::Value(
+                        Value::SingleQuotedString(r#"[23, "abc", 17, "ab", 10]"#.to_string())
+                            .into()
+                    )),
+                }))]
+            );
+        }
+        _ => panic!("Unexpected statement {stmt}"),
+    }
+}
+
+#[test]
+fn parse_show_charset() {
+    let res = mysql().verified_stmt("SHOW CHARACTER SET");
+    assert_eq!(
+        res,
+        Statement::ShowCharset(ShowCharset {
+            is_shorthand: false,
+            filter: None
+        })
+    );
+    mysql().verified_stmt("SHOW CHARACTER SET LIKE 'utf8mb4%'");
+    mysql().verified_stmt("SHOW CHARSET WHERE charset = 'utf8mb4%'");
+    mysql().verified_stmt("SHOW CHARSET LIKE 'utf8mb4%'");
+}
diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs
index 2e2c4403c..6c00b1f11 100644
--- a/tests/sqlparser_postgres.rs
+++ b/tests/sqlparser_postgres.rs
@@ -21,6 +21,9 @@
 
 #[macro_use]
 mod test_utils;
+
+use helpers::attached_token::AttachedToken;
+use sqlparser::tokenizer::Span;
 use test_utils::*;
 
 use sqlparser::ast::*;
@@ -346,7 +349,7 @@ fn parse_create_table_with_defaults() {
             name,
             columns,
             constraints,
-            with_options,
+            table_options,
             if_not_exists: false,
             external: false,
             file_format: None,
@@ -361,7 +364,6 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "customer_id".into(),
                         data_type: DataType::Integer(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Default(
@@ -372,7 +374,6 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "store_id".into(),
                         data_type: DataType::SmallInt(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull,
@@ -386,7 +387,6 @@ fn parse_create_table_with_defaults() {
                                 unit: None
                             }
                         )),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull,
@@ -400,11 +400,18 @@ fn parse_create_table_with_defaults() {
                                 unit: None
                             }
                         )),
-                        collation: Some(ObjectName(vec![Ident::with_quote('"', "es_ES")])),
-                        options: vec![ColumnOptionDef {
-                            name: None,
-                            option: ColumnOption::NotNull,
-                        }],
+                        options: vec![
+                            ColumnOptionDef {
+                                name: None,
+                                option: ColumnOption::Collation(ObjectName::from(vec![
+                                    Ident::with_quote('"', "es_ES")
+                                ])),
+                            },
+                            ColumnOptionDef {
+                                name: None,
+                                option: ColumnOption::NotNull,
+                            }
+                        ],
                     },
                     ColumnDef {
                         name: "email".into(),
@@ -414,13 +421,11 @@ fn parse_create_table_with_defaults() {
                                 unit: None
                             }
                         )),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: "address_id".into(),
                         data_type: DataType::SmallInt(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull
@@ -429,11 +434,12 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "activebool".into(),
                         data_type: DataType::Boolean,
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
-                                option: ColumnOption::Default(Expr::Value(Value::Boolean(true))),
+                                option: ColumnOption::Default(Expr::Value(
+                                    (Value::Boolean(true)).with_empty_span()
+                                )),
                             },
                             ColumnOptionDef {
                                 name: None,
@@ -444,7 +450,6 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "create_date".into(),
                         data_type: DataType::Date,
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
@@ -459,7 +464,6 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "last_update".into(),
                         data_type: DataType::Timestamp(None, TimezoneInfo::WithoutTimeZone),
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
@@ -474,7 +478,6 @@ fn parse_create_table_with_defaults() {
                     ColumnDef {
                         name: "active".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::NotNull
@@ -483,20 +486,25 @@ fn parse_create_table_with_defaults() {
                 ]
             );
             assert!(constraints.is_empty());
+
+            let with_options = match table_options {
+                CreateTableOptions::With(options) => options,
+                _ => unreachable!(),
+            };
             assert_eq!(
                 with_options,
                 vec![
                     SqlOption::KeyValue {
                         key: "fillfactor".into(),
-                        value: Expr::Value(number("20"))
+                        value: Expr::value(number("20"))
                     },
                     SqlOption::KeyValue {
                         key: "user_catalog_table".into(),
-                        value: Expr::Value(Value::Boolean(true))
+                        value: Expr::Value((Value::Boolean(true)).with_empty_span())
                     },
                     SqlOption::KeyValue {
                         key: "autovacuum_vacuum_threshold".into(),
-                        value: Expr::Value(number("100"))
+                        value: Expr::value(number("100"))
                     },
                 ]
             );
@@ -592,6 +600,26 @@ fn parse_alter_table_constraints_rename() {
     }
 }
 
+#[test]
+fn parse_alter_table_constraints_unique_nulls_distinct() {
+    match pg_and_generic()
+        .verified_stmt("ALTER TABLE t ADD CONSTRAINT b UNIQUE NULLS NOT DISTINCT (c)")
+    {
+        Statement::AlterTable { operations, .. } => match &operations[0] {
+            AlterTableOperation::AddConstraint {
+                constraint: TableConstraint::Unique { nulls_distinct, .. },
+                ..
+            } => {
+                assert_eq!(nulls_distinct, &NullsDistinctOption::NotDistinct)
+            }
+            _ => unreachable!(),
+        },
+        _ => unreachable!(),
+    }
+    pg_and_generic().verified_stmt("ALTER TABLE t ADD CONSTRAINT b UNIQUE NULLS DISTINCT (c)");
+    pg_and_generic().verified_stmt("ALTER TABLE t ADD CONSTRAINT b UNIQUE (c)");
+}
+
 #[test]
 fn parse_alter_table_disable() {
     pg_and_generic().verified_stmt("ALTER TABLE tab DISABLE ROW LEVEL SECURITY");
@@ -642,11 +670,102 @@ fn parse_create_extension() {
 }
 
 #[test]
-fn parse_alter_table_alter_column() {
-    pg().one_statement_parses_to(
-        "ALTER TABLE tab ALTER COLUMN is_active TYPE TEXT USING 'text'",
-        "ALTER TABLE tab ALTER COLUMN is_active SET DATA TYPE TEXT USING 'text'",
+fn parse_drop_extension() {
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION extension_name"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: false,
+            cascade_or_restrict: None,
+        }
+    );
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION extension_name CASCADE"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: false,
+            cascade_or_restrict: Some(ReferentialAction::Cascade),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION extension_name RESTRICT"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: false,
+            cascade_or_restrict: Some(ReferentialAction::Restrict),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION extension_name, extension_name2 CASCADE"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into(), "extension_name2".into()],
+            if_exists: false,
+            cascade_or_restrict: Some(ReferentialAction::Cascade),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION extension_name, extension_name2 RESTRICT"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into(), "extension_name2".into()],
+            if_exists: false,
+            cascade_or_restrict: Some(ReferentialAction::Restrict),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION IF EXISTS extension_name"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: true,
+            cascade_or_restrict: None,
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION IF EXISTS extension_name CASCADE"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: true,
+            cascade_or_restrict: Some(ReferentialAction::Cascade),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic().verified_stmt("DROP EXTENSION IF EXISTS extension_name RESTRICT"),
+        Statement::DropExtension {
+            names: vec!["extension_name".into()],
+            if_exists: true,
+            cascade_or_restrict: Some(ReferentialAction::Restrict),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic()
+            .verified_stmt("DROP EXTENSION IF EXISTS extension_name1, extension_name2 CASCADE"),
+        Statement::DropExtension {
+            names: vec!["extension_name1".into(), "extension_name2".into()],
+            if_exists: true,
+            cascade_or_restrict: Some(ReferentialAction::Cascade),
+        }
+    );
+
+    assert_eq!(
+        pg_and_generic()
+            .verified_stmt("DROP EXTENSION IF EXISTS extension_name1, extension_name2 RESTRICT"),
+        Statement::DropExtension {
+            names: vec!["extension_name1".into(), "extension_name2".into()],
+            if_exists: true,
+            cascade_or_restrict: Some(ReferentialAction::Restrict),
+        }
     );
+}
+
+#[test]
+fn parse_alter_table_alter_column() {
+    pg().verified_stmt("ALTER TABLE tab ALTER COLUMN is_active TYPE TEXT USING 'text'");
 
     match alter_table_op(
         pg().verified_stmt(
@@ -655,12 +774,14 @@ fn parse_alter_table_alter_column() {
     ) {
         AlterTableOperation::AlterColumn { column_name, op } => {
             assert_eq!("is_active", column_name.to_string());
-            let using_expr = Expr::Value(Value::SingleQuotedString("text".to_string()));
+            let using_expr =
+                Expr::Value(Value::SingleQuotedString("text".to_string()).with_empty_span());
             assert_eq!(
                 op,
                 AlterColumnOperation::SetDataType {
                     data_type: DataType::Text,
                     using: Some(using_expr),
+                    had_set: true,
                 }
             );
         }
@@ -712,8 +833,7 @@ fn parse_alter_table_add_columns() {
             if_exists,
             only,
             operations,
-            location: _,
-            on_cluster: _,
+            ..
         } => {
             assert_eq!(name.to_string(), "tab");
             assert!(if_exists);
@@ -727,7 +847,6 @@ fn parse_alter_table_add_columns() {
                         column_def: ColumnDef {
                             name: "a".into(),
                             data_type: DataType::Text,
-                            collation: None,
                             options: vec![],
                         },
                         column_position: None,
@@ -738,7 +857,6 @@ fn parse_alter_table_add_columns() {
                         column_def: ColumnDef {
                             name: "b".into(),
                             data_type: DataType::Int(None),
-                            collation: None,
                             options: vec![],
                         },
                         column_position: None,
@@ -795,8 +913,7 @@ fn parse_alter_table_owner_to() {
                 if_exists: _,
                 only: _,
                 operations,
-                location: _,
-                on_cluster: _,
+                ..
             } => {
                 assert_eq!(name.to_string(), "tab");
                 assert_eq!(
@@ -874,6 +991,7 @@ fn parse_create_schema_if_not_exists() {
         Statement::CreateSchema {
             if_not_exists: true,
             schema_name,
+            ..
         } => assert_eq!("schema_name", schema_name.to_string()),
         _ => unreachable!(),
     }
@@ -925,7 +1043,7 @@ fn test_copy_from() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: false,
@@ -943,7 +1061,7 @@ fn test_copy_from() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: false,
@@ -961,7 +1079,7 @@ fn test_copy_from() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: false,
@@ -985,7 +1103,7 @@ fn test_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1003,7 +1121,7 @@ fn test_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1021,7 +1139,7 @@ fn test_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1062,7 +1180,7 @@ fn parse_copy_from() {
         pg_and_generic().one_statement_parses_to(sql, ""),
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["table".into()]),
+                table_name: ObjectName::from(vec!["table".into()]),
                 columns: vec!["a".into(), "b".into()],
             },
             to: false,
@@ -1108,7 +1226,7 @@ fn parse_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1126,7 +1244,7 @@ fn parse_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["country".into()]),
+                table_name: ObjectName::from(vec!["country".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1143,7 +1261,7 @@ fn parse_copy_to() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["country".into()]),
+                table_name: ObjectName::from(vec!["country".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1163,25 +1281,31 @@ fn parse_copy_to() {
             source: CopySource::Query(Box::new(Query {
                 with: None,
                 body: Box::new(SetExpr::Select(Box::new(Select {
+                    select_token: AttachedToken::empty(),
                     distinct: None,
                     top: None,
                     top_before_distinct: false,
                     projection: vec![
                         SelectItem::ExprWithAlias {
-                            expr: Expr::Value(number("42")),
+                            expr: Expr::value(number("42")),
                             alias: Ident {
                                 value: "a".into(),
                                 quote_style: None,
+                                span: Span::empty(),
                             },
                         },
                         SelectItem::ExprWithAlias {
-                            expr: Expr::Value(Value::SingleQuotedString("hello".into())),
+                            expr: Expr::Value(
+                                (Value::SingleQuotedString("hello".into())).with_empty_span()
+                            ),
                             alias: Ident {
                                 value: "b".into(),
                                 quote_style: None,
+                                span: Span::empty(),
                             },
                         }
                     ],
+                    exclude: None,
                     into: None,
                     from: vec![],
                     lateral_views: vec![],
@@ -1197,16 +1321,16 @@ fn parse_copy_to() {
                     qualify: None,
                     value_table_mode: None,
                     connect_by: None,
+                    flavor: SelectFlavor::Standard,
                 }))),
                 order_by: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             })),
             to: true,
             target: CopyTarget::File {
@@ -1226,7 +1350,7 @@ fn parse_copy_from_before_v9_0() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: false,
@@ -1255,7 +1379,7 @@ fn parse_copy_from_before_v9_0() {
         pg_and_generic().one_statement_parses_to(sql, ""),
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: false,
@@ -1283,7 +1407,7 @@ fn parse_copy_to_before_v9_0() {
         stmt,
         Statement::Copy {
             source: CopySource::Table {
-                table_name: ObjectName(vec!["users".into()]),
+                table_name: ObjectName::from(vec!["users".into()]),
                 columns: vec![],
             },
             to: true,
@@ -1312,80 +1436,77 @@ fn parse_set() {
     let stmt = pg_and_generic().verified_stmt("SET a = b");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("a")])),
-            value: vec![Expr::Identifier(Ident {
+            variable: ObjectName::from(vec![Ident::new("a")]),
+            values: vec![Expr::Identifier(Ident {
                 value: "b".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             })],
-        }
+        })
     );
 
     let stmt = pg_and_generic().verified_stmt("SET a = 'b'");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("a")])),
-            value: vec![Expr::Value(Value::SingleQuotedString("b".into()))],
-        }
+            variable: ObjectName::from(vec![Ident::new("a")]),
+            values: vec![Expr::Value(
+                (Value::SingleQuotedString("b".into())).with_empty_span()
+            )],
+        })
     );
 
     let stmt = pg_and_generic().verified_stmt("SET a = 0");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("a")])),
-            value: vec![Expr::Value(number("0"))],
-        }
+            variable: ObjectName::from(vec![Ident::new("a")]),
+            values: vec![Expr::value(number("0"))],
+        })
     );
 
     let stmt = pg_and_generic().verified_stmt("SET a = DEFAULT");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("a")])),
-            value: vec![Expr::Identifier(Ident {
-                value: "DEFAULT".into(),
-                quote_style: None
-            })],
-        }
+            variable: ObjectName::from(vec![Ident::new("a")]),
+            values: vec![Expr::Identifier(Ident::new("DEFAULT"))],
+        })
     );
 
     let stmt = pg_and_generic().verified_stmt("SET LOCAL a = b");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: true,
+        Statement::Set(Set::SingleAssignment {
+            scope: Some(ContextModifier::Local),
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![Ident::new("a")])),
-            value: vec![Expr::Identifier("b".into())],
-        }
+            variable: ObjectName::from(vec![Ident::new("a")]),
+            values: vec![Expr::Identifier("b".into())],
+        })
     );
 
     let stmt = pg_and_generic().verified_stmt("SET a.b.c = b");
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![
-                Ident::new("a"),
-                Ident::new("b"),
-                Ident::new("c")
-            ])),
-            value: vec![Expr::Identifier(Ident {
+            variable: ObjectName::from(vec![Ident::new("a"), Ident::new("b"), Ident::new("c")]),
+            values: vec![Expr::Identifier(Ident {
                 value: "b".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             })],
-        }
+        })
     );
 
     let stmt = pg_and_generic().one_statement_parses_to(
@@ -1394,22 +1515,21 @@ fn parse_set() {
     );
     assert_eq!(
         stmt,
-        Statement::SetVariable {
-            local: false,
+        Statement::Set(Set::SingleAssignment {
+            scope: None,
             hivevar: false,
-            variables: OneOrManyWithParens::One(ObjectName(vec![
+            variable: ObjectName::from(vec![
                 Ident::new("hive"),
                 Ident::new("tez"),
                 Ident::new("auto"),
                 Ident::new("reducer"),
                 Ident::new("parallelism")
-            ])),
-            value: vec![Expr::Value(Value::Boolean(false))],
-        }
+            ]),
+            values: vec![Expr::Value((Value::Boolean(false)).with_empty_span())],
+        })
     );
 
     pg_and_generic().one_statement_parses_to("SET a TO b", "SET a = b");
-    pg_and_generic().one_statement_parses_to("SET SESSION a = b", "SET a = b");
 
     assert_eq!(
         pg_and_generic().parse_sql_statements("SET"),
@@ -1439,10 +1559,10 @@ fn parse_set_role() {
     let stmt = pg_and_generic().verified_stmt(query);
     assert_eq!(
         stmt,
-        Statement::SetRole {
-            context_modifier: ContextModifier::Session,
+        Statement::Set(Set::SetRole {
+            context_modifier: Some(ContextModifier::Session),
             role_name: None,
-        }
+        })
     );
     assert_eq!(query, stmt.to_string());
 
@@ -1450,13 +1570,14 @@ fn parse_set_role() {
     let stmt = pg_and_generic().verified_stmt(query);
     assert_eq!(
         stmt,
-        Statement::SetRole {
-            context_modifier: ContextModifier::Local,
+        Statement::Set(Set::SetRole {
+            context_modifier: Some(ContextModifier::Local),
             role_name: Some(Ident {
                 value: "rolename".to_string(),
                 quote_style: Some('\"'),
+                span: Span::empty(),
             }),
-        }
+        })
     );
     assert_eq!(query, stmt.to_string());
 
@@ -1464,13 +1585,14 @@ fn parse_set_role() {
     let stmt = pg_and_generic().verified_stmt(query);
     assert_eq!(
         stmt,
-        Statement::SetRole {
-            context_modifier: ContextModifier::None,
+        Statement::Set(Set::SetRole {
+            context_modifier: None,
             role_name: Some(Ident {
                 value: "rolename".to_string(),
                 quote_style: Some('\''),
+                span: Span::empty(),
             }),
-        }
+        })
     );
     assert_eq!(query, stmt.to_string());
 }
@@ -1539,10 +1661,14 @@ fn parse_execute() {
     assert_eq!(
         stmt,
         Statement::Execute {
-            name: ObjectName(vec!["a".into()]),
+            name: Some(ObjectName::from(vec!["a".into()])),
             parameters: vec![],
             has_parentheses: false,
-            using: vec![]
+            using: vec![],
+            immediate: false,
+            into: vec![],
+            output: false,
+            default: false,
         }
     );
 
@@ -1550,13 +1676,17 @@ fn parse_execute() {
     assert_eq!(
         stmt,
         Statement::Execute {
-            name: ObjectName(vec!["a".into()]),
+            name: Some(ObjectName::from(vec!["a".into()])),
             parameters: vec![
-                Expr::Value(number("1")),
-                Expr::Value(Value::SingleQuotedString("t".to_string()))
+                Expr::value(number("1")),
+                Expr::Value((Value::SingleQuotedString("t".to_string())).with_empty_span())
             ],
             has_parentheses: true,
-            using: vec![]
+            using: vec![],
+            immediate: false,
+            into: vec![],
+            output: false,
+            default: false,
         }
     );
 
@@ -1565,23 +1695,37 @@ fn parse_execute() {
     assert_eq!(
         stmt,
         Statement::Execute {
-            name: ObjectName(vec!["a".into()]),
+            name: Some(ObjectName::from(vec!["a".into()])),
             parameters: vec![],
             has_parentheses: false,
             using: vec![
-                Expr::Cast {
-                    kind: CastKind::Cast,
-                    expr: Box::new(Expr::Value(Value::Number("1337".parse().unwrap(), false))),
-                    data_type: DataType::SmallInt(None),
-                    format: None
+                ExprWithAlias {
+                    expr: Expr::Cast {
+                        kind: CastKind::Cast,
+                        expr: Box::new(Expr::Value(
+                            (Value::Number("1337".parse().unwrap(), false)).with_empty_span()
+                        )),
+                        data_type: DataType::SmallInt(None),
+                        format: None
+                    },
+                    alias: None
                 },
-                Expr::Cast {
-                    kind: CastKind::Cast,
-                    expr: Box::new(Expr::Value(Value::Number("7331".parse().unwrap(), false))),
-                    data_type: DataType::SmallInt(None),
-                    format: None
+                ExprWithAlias {
+                    expr: Expr::Cast {
+                        kind: CastKind::Cast,
+                        expr: Box::new(Expr::Value(
+                            (Value::Number("7331".parse().unwrap(), false)).with_empty_span()
+                        )),
+                        data_type: DataType::SmallInt(None),
+                        format: None
+                    },
+                    alias: None
                 },
-            ]
+            ],
+            immediate: false,
+            into: vec![],
+            output: false,
+            default: false,
         }
     );
 }
@@ -1606,7 +1750,7 @@ fn parse_prepare() {
     };
     match sub_stmt.as_ref() {
         Statement::Insert(Insert {
-            table_name,
+            table: table_name,
             columns,
             source: Some(source),
             ..
@@ -1674,7 +1818,9 @@ fn parse_pg_on_conflict() {
             assert_eq!(
                 OnConflictAction::DoUpdate(DoUpdate {
                     assignments: vec![Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["dname".into()])),
+                        target: AssignmentTarget::ColumnName(ObjectName::from(
+                            vec!["dname".into()]
+                        )),
                         value: Expr::CompoundIdentifier(vec!["EXCLUDED".into(), "dname".into()])
                     },],
                     selection: None
@@ -1705,14 +1851,18 @@ fn parse_pg_on_conflict() {
                 OnConflictAction::DoUpdate(DoUpdate {
                     assignments: vec![
                         Assignment {
-                            target: AssignmentTarget::ColumnName(ObjectName(vec!["dname".into()])),
+                            target: AssignmentTarget::ColumnName(ObjectName::from(vec![
+                                "dname".into()
+                            ])),
                             value: Expr::CompoundIdentifier(vec![
                                 "EXCLUDED".into(),
                                 "dname".into()
                             ])
                         },
                         Assignment {
-                            target: AssignmentTarget::ColumnName(ObjectName(vec!["area".into()])),
+                            target: AssignmentTarget::ColumnName(ObjectName::from(vec![
+                                "area".into()
+                            ])),
                             value: Expr::CompoundIdentifier(vec!["EXCLUDED".into(), "area".into()])
                         },
                     ],
@@ -1762,16 +1912,23 @@ fn parse_pg_on_conflict() {
             assert_eq!(
                 OnConflictAction::DoUpdate(DoUpdate {
                     assignments: vec![Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["dname".into()])),
-                        value: Expr::Value(Value::Placeholder("$1".to_string()))
+                        target: AssignmentTarget::ColumnName(ObjectName::from(
+                            vec!["dname".into()]
+                        )),
+                        value: Expr::Value(
+                            (Value::Placeholder("$1".to_string())).with_empty_span()
+                        )
                     },],
                     selection: Some(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident {
                             value: "dsize".to_string(),
-                            quote_style: None
+                            quote_style: None,
+                            span: Span::empty(),
                         })),
                         op: BinaryOperator::Gt,
-                        right: Box::new(Expr::Value(Value::Placeholder("$2".to_string())))
+                        right: Box::new(Expr::Value(
+                            (Value::Placeholder("$2".to_string())).with_empty_span()
+                        ))
                     })
                 }),
                 action
@@ -1795,20 +1952,30 @@ fn parse_pg_on_conflict() {
                 })),
             ..
         }) => {
-            assert_eq!(vec![Ident::from("distributors_did_pkey")], cname.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::from("distributors_did_pkey")]),
+                cname
+            );
             assert_eq!(
                 OnConflictAction::DoUpdate(DoUpdate {
                     assignments: vec![Assignment {
-                        target: AssignmentTarget::ColumnName(ObjectName(vec!["dname".into()])),
-                        value: Expr::Value(Value::Placeholder("$1".to_string()))
+                        target: AssignmentTarget::ColumnName(ObjectName::from(
+                            vec!["dname".into()]
+                        )),
+                        value: Expr::Value(
+                            (Value::Placeholder("$1".to_string())).with_empty_span()
+                        )
                     },],
                     selection: Some(Expr::BinaryOp {
                         left: Box::new(Expr::Identifier(Ident {
                             value: "dsize".to_string(),
-                            quote_style: None
+                            quote_style: None,
+                            span: Span::empty(),
                         })),
                         op: BinaryOperator::Gt,
-                        right: Box::new(Expr::Value(Value::Placeholder("$2".to_string())))
+                        right: Box::new(Expr::Value(
+                            (Value::Placeholder("$2".to_string())).with_empty_span()
+                        ))
                     })
                 }),
                 action
@@ -1923,12 +2090,8 @@ fn parse_pg_custom_binary_ops() {
     let operators = [
         // PostGIS
         "&&&",   // n-D bounding boxes intersect
-        "&<",    // (is strictly to the left of)
-        "&>",    // (is strictly to the right of)
         "|=|",   //  distance between A and B trajectories at their closest point of approach
         "<<#>>", // n-D distance between A and B bounding boxes
-        "|>>",   // A's bounding box is strictly above B's.
-        "~=",    // bounding box is the same
         // PGroonga
         "&@",   // Full text search by a keyword
         "&@~",  // Full text search by easy to use query language
@@ -2024,17 +2187,39 @@ fn parse_pg_regex_match_ops() {
         ("!~*", BinaryOperator::PGRegexNotIMatch),
     ];
 
+    // Match against a single value
     for (str_op, op) in pg_regex_match_ops {
-        let select = pg().verified_only_select(&format!("SELECT 'abc' {} '^a'", &str_op));
+        let select = pg().verified_only_select(&format!("SELECT 'abc' {str_op} '^a'"));
         assert_eq!(
             SelectItem::UnnamedExpr(Expr::BinaryOp {
-                left: Box::new(Expr::Value(Value::SingleQuotedString("abc".into()))),
+                left: Box::new(Expr::Value(single_quoted_string("abc").with_empty_span(),)),
                 op: op.clone(),
-                right: Box::new(Expr::Value(Value::SingleQuotedString("^a".into()))),
+                right: Box::new(Expr::Value(single_quoted_string("^a").with_empty_span(),)),
             }),
             select.projection[0]
         );
     }
+
+    // Match against any value from an array
+    for (str_op, op) in pg_regex_match_ops {
+        let select =
+            pg().verified_only_select(&format!("SELECT 'abc' {str_op} ANY(ARRAY['^a', 'x'])"));
+        assert_eq!(
+            SelectItem::UnnamedExpr(Expr::AnyOp {
+                left: Box::new(Expr::Value(single_quoted_string("abc").with_empty_span(),)),
+                compare_op: op.clone(),
+                right: Box::new(Expr::Array(Array {
+                    elem: vec![
+                        Expr::Value(single_quoted_string("^a").with_empty_span()),
+                        Expr::Value(single_quoted_string("x").with_empty_span()),
+                    ],
+                    named: true,
+                })),
+                is_some: false,
+            }),
+            select.projection[0]
+        )
+    }
 }
 
 #[test]
@@ -2046,33 +2231,51 @@ fn parse_pg_like_match_ops() {
         ("!~~*", BinaryOperator::PGNotILikeMatch),
     ];
 
+    // Match against a single value
     for (str_op, op) in pg_like_match_ops {
-        let select = pg().verified_only_select(&format!("SELECT 'abc' {} 'a_c%'", &str_op));
+        let select = pg().verified_only_select(&format!("SELECT 'abc' {str_op} 'a_c%'"));
         assert_eq!(
             SelectItem::UnnamedExpr(Expr::BinaryOp {
-                left: Box::new(Expr::Value(Value::SingleQuotedString("abc".into()))),
+                left: Box::new(Expr::Value(single_quoted_string("abc").with_empty_span(),)),
                 op: op.clone(),
-                right: Box::new(Expr::Value(Value::SingleQuotedString("a_c%".into()))),
+                right: Box::new(Expr::Value(single_quoted_string("a_c%").with_empty_span(),)),
             }),
             select.projection[0]
         );
     }
+
+    // Match against all values from an array
+    for (str_op, op) in pg_like_match_ops {
+        let select =
+            pg().verified_only_select(&format!("SELECT 'abc' {str_op} ALL(ARRAY['a_c%'])"));
+        assert_eq!(
+            SelectItem::UnnamedExpr(Expr::AllOp {
+                left: Box::new(Expr::Value(single_quoted_string("abc").with_empty_span(),)),
+                compare_op: op.clone(),
+                right: Box::new(Expr::Array(Array {
+                    elem: vec![Expr::Value(single_quoted_string("a_c%").with_empty_span())],
+                    named: true,
+                })),
+            }),
+            select.projection[0]
+        )
+    }
 }
 
 #[test]
 fn parse_array_index_expr() {
     let num: Vec<Expr> = (0..=10)
-        .map(|s| Expr::Value(number(&s.to_string())))
+        .map(|s| Expr::Value(number(&s.to_string()).with_empty_span()))
         .collect();
 
     let sql = "SELECT foo[0] FROM foos";
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(
-        &Expr::Subscript {
-            expr: Box::new(Expr::Identifier(Ident::new("foo"))),
-            subscript: Box::new(Subscript::Index {
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Identifier(Ident::new("foo"))),
+            access_chain: vec![AccessExpr::Subscript(Subscript::Index {
                 index: num[0].clone()
-            }),
+            })],
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -2080,16 +2283,16 @@ fn parse_array_index_expr() {
     let sql = "SELECT foo[0][0] FROM foos";
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(
-        &Expr::Subscript {
-            expr: Box::new(Expr::Subscript {
-                expr: Box::new(Expr::Identifier(Ident::new("foo"))),
-                subscript: Box::new(Subscript::Index {
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Identifier(Ident::new("foo"))),
+            access_chain: vec![
+                AccessExpr::Subscript(Subscript::Index {
                     index: num[0].clone()
                 }),
-            }),
-            subscript: Box::new(Subscript::Index {
-                index: num[0].clone()
-            }),
+                AccessExpr::Subscript(Subscript::Index {
+                    index: num[0].clone()
+                })
+            ],
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -2097,27 +2300,27 @@ fn parse_array_index_expr() {
     let sql = r#"SELECT bar[0]["baz"]["fooz"] FROM foos"#;
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(
-        &Expr::Subscript {
-            expr: Box::new(Expr::Subscript {
-                expr: Box::new(Expr::Subscript {
-                    expr: Box::new(Expr::Identifier(Ident::new("bar"))),
-                    subscript: Box::new(Subscript::Index {
-                        index: num[0].clone()
-                    })
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Identifier(Ident::new("bar"))),
+            access_chain: vec![
+                AccessExpr::Subscript(Subscript::Index {
+                    index: num[0].clone()
                 }),
-                subscript: Box::new(Subscript::Index {
+                AccessExpr::Subscript(Subscript::Index {
                     index: Expr::Identifier(Ident {
                         value: "baz".to_string(),
-                        quote_style: Some('"')
+                        quote_style: Some('"'),
+                        span: Span::empty(),
                     })
-                })
-            }),
-            subscript: Box::new(Subscript::Index {
-                index: Expr::Identifier(Ident {
-                    value: "fooz".to_string(),
-                    quote_style: Some('"')
-                })
-            })
+                }),
+                AccessExpr::Subscript(Subscript::Index {
+                    index: Expr::Identifier(Ident {
+                        value: "fooz".to_string(),
+                        quote_style: Some('"'),
+                        span: Span::empty(),
+                    })
+                }),
+            ],
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -2125,33 +2328,33 @@ fn parse_array_index_expr() {
     let sql = "SELECT (CAST(ARRAY[ARRAY[2, 3]] AS INT[][]))[1][2]";
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(
-        &Expr::Subscript {
-            expr: Box::new(Expr::Subscript {
-                expr: Box::new(Expr::Nested(Box::new(Expr::Cast {
-                    kind: CastKind::Cast,
-                    expr: Box::new(Expr::Array(Array {
-                        elem: vec![Expr::Array(Array {
-                            elem: vec![num[2].clone(), num[3].clone(),],
-                            named: true,
-                        })],
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Nested(Box::new(Expr::Cast {
+                kind: CastKind::Cast,
+                expr: Box::new(Expr::Array(Array {
+                    elem: vec![Expr::Array(Array {
+                        elem: vec![num[2].clone(), num[3].clone(),],
                         named: true,
-                    })),
-                    data_type: DataType::Array(ArrayElemTypeDef::SquareBracket(
-                        Box::new(DataType::Array(ArrayElemTypeDef::SquareBracket(
-                            Box::new(DataType::Int(None)),
-                            None
-                        ))),
+                    })],
+                    named: true,
+                })),
+                data_type: DataType::Array(ArrayElemTypeDef::SquareBracket(
+                    Box::new(DataType::Array(ArrayElemTypeDef::SquareBracket(
+                        Box::new(DataType::Int(None)),
                         None
-                    )),
-                    format: None,
-                }))),
-                subscript: Box::new(Subscript::Index {
+                    ))),
+                    None
+                )),
+                format: None,
+            }))),
+            access_chain: vec![
+                AccessExpr::Subscript(Subscript::Index {
                     index: num[1].clone()
                 }),
-            }),
-            subscript: Box::new(Subscript::Index {
-                index: num[2].clone()
-            }),
+                AccessExpr::Subscript(Subscript::Index {
+                    index: num[2].clone()
+                }),
+            ],
         },
         expr_from_projection(only(&select.projection)),
     );
@@ -2173,7 +2376,7 @@ fn parse_array_subscript() {
         (
             "(ARRAY[1, 2, 3, 4, 5, 6])[2]",
             Subscript::Index {
-                index: Expr::Value(number("2")),
+                index: Expr::value(number("2")),
             },
         ),
         (
@@ -2185,17 +2388,17 @@ fn parse_array_subscript() {
         (
             "(ARRAY[1, 2, 3, 4, 5, 6])[2:5]",
             Subscript::Slice {
-                lower_bound: Some(Expr::Value(number("2"))),
-                upper_bound: Some(Expr::Value(number("5"))),
+                lower_bound: Some(Expr::value(number("2"))),
+                upper_bound: Some(Expr::value(number("5"))),
                 stride: None,
             },
         ),
         (
             "(ARRAY[1, 2, 3, 4, 5, 6])[2:5:3]",
             Subscript::Slice {
-                lower_bound: Some(Expr::Value(number("2"))),
-                upper_bound: Some(Expr::Value(number("5"))),
-                stride: Some(Expr::Value(number("3"))),
+                lower_bound: Some(Expr::value(number("2"))),
+                upper_bound: Some(Expr::value(number("5"))),
+                stride: Some(Expr::value(number("3"))),
             },
         ),
         (
@@ -2204,12 +2407,12 @@ fn parse_array_subscript() {
                 lower_bound: Some(Expr::BinaryOp {
                     left: Box::new(call("array_length", [Expr::Identifier(Ident::new("arr"))])),
                     op: BinaryOperator::Minus,
-                    right: Box::new(Expr::Value(number("3"))),
+                    right: Box::new(Expr::value(number("3"))),
                 }),
                 upper_bound: Some(Expr::BinaryOp {
                     left: Box::new(call("array_length", [Expr::Identifier(Ident::new("arr"))])),
                     op: BinaryOperator::Minus,
-                    right: Box::new(Expr::Value(number("1"))),
+                    right: Box::new(Expr::value(number("1"))),
                 }),
                 stride: None,
             },
@@ -2218,14 +2421,14 @@ fn parse_array_subscript() {
             "(ARRAY[1, 2, 3, 4, 5, 6])[:5]",
             Subscript::Slice {
                 lower_bound: None,
-                upper_bound: Some(Expr::Value(number("5"))),
+                upper_bound: Some(Expr::value(number("5"))),
                 stride: None,
             },
         ),
         (
             "(ARRAY[1, 2, 3, 4, 5, 6])[2:]",
             Subscript::Slice {
-                lower_bound: Some(Expr::Value(number("2"))),
+                lower_bound: Some(Expr::value(number("2"))),
                 upper_bound: None,
                 stride: None,
             },
@@ -2240,9 +2443,13 @@ fn parse_array_subscript() {
         ),
     ];
     for (sql, expect) in tests {
-        let Expr::Subscript { subscript, .. } = pg_and_generic().verified_expr(sql) else {
+        let Expr::CompoundFieldAccess { access_chain, .. } = pg_and_generic().verified_expr(sql)
+        else {
             panic!("expected subscript expr");
         };
+        let Some(AccessExpr::Subscript(subscript)) = access_chain.last() else {
+            panic!("expected subscript");
+        };
         assert_eq!(expect, *subscript);
     }
 
@@ -2253,25 +2460,25 @@ fn parse_array_subscript() {
 fn parse_array_multi_subscript() {
     let expr = pg_and_generic().verified_expr("make_array(1, 2, 3)[1:2][2]");
     assert_eq!(
-        Expr::Subscript {
-            expr: Box::new(Expr::Subscript {
-                expr: Box::new(call(
-                    "make_array",
-                    vec![
-                        Expr::Value(number("1")),
-                        Expr::Value(number("2")),
-                        Expr::Value(number("3"))
-                    ]
-                )),
-                subscript: Box::new(Subscript::Slice {
-                    lower_bound: Some(Expr::Value(number("1"))),
-                    upper_bound: Some(Expr::Value(number("2"))),
+        Expr::CompoundFieldAccess {
+            root: Box::new(call(
+                "make_array",
+                vec![
+                    Expr::value(number("1")),
+                    Expr::value(number("2")),
+                    Expr::value(number("3"))
+                ]
+            )),
+            access_chain: vec![
+                AccessExpr::Subscript(Subscript::Slice {
+                    lower_bound: Some(Expr::value(number("1"))),
+                    upper_bound: Some(Expr::value(number("2"))),
                     stride: None,
                 }),
-            }),
-            subscript: Box::new(Subscript::Index {
-                index: Expr::Value(number("2")),
-            }),
+                AccessExpr::Subscript(Subscript::Index {
+                    index: Expr::value(number("2")),
+                }),
+            ],
         },
         expr,
     );
@@ -2340,60 +2547,228 @@ fn parse_create_anonymous_index() {
 }
 
 #[test]
-fn parse_create_index_concurrently() {
-    let sql = "CREATE INDEX CONCURRENTLY IF NOT EXISTS my_index ON my_table(col1,col2)";
+/// Test to verify the correctness of parsing the `CREATE INDEX` statement with optional operator classes.
+///
+/// # Implementative details
+///
+/// At this time, since the parser library is not intended to take care of the semantics of the SQL statements,
+/// there is no way to verify the correctness of the operator classes, nor whether they are valid for the given
+/// index type. This test is only intended to verify that the parser can correctly parse the statement. For this
+/// reason, the test includes a `totally_not_valid` operator class.
+fn parse_create_indices_with_operator_classes() {
+    let indices = [
+        IndexType::GIN,
+        IndexType::GiST,
+        IndexType::SPGiST,
+        IndexType::Custom("CustomIndexType".into()),
+    ];
+    let operator_classes: [Option<Ident>; 4] = [
+        None,
+        Some("gin_trgm_ops".into()),
+        Some("gist_trgm_ops".into()),
+        Some("totally_not_valid".into()),
+    ];
+
+    for expected_index_type in indices {
+        for expected_operator_class in &operator_classes {
+            let single_column_sql_statement = format!(
+                "CREATE INDEX the_index_name ON users USING {expected_index_type} (concat_users_name(first_name, last_name){})",
+                expected_operator_class.as_ref().map(|oc| format!(" {oc}"))
+                    .unwrap_or_default()
+            );
+            let multi_column_sql_statement = format!(
+                "CREATE INDEX the_index_name ON users USING {expected_index_type} (column_name,concat_users_name(first_name, last_name){})",
+                expected_operator_class.as_ref().map(|oc| format!(" {oc}"))
+                    .unwrap_or_default()
+            );
+
+            let expected_function_column = IndexColumn {
+                column: OrderByExpr {
+                    expr: Expr::Function(Function {
+                        name: ObjectName(vec![ObjectNamePart::Identifier(Ident {
+                            value: "concat_users_name".to_owned(),
+                            quote_style: None,
+                            span: Span::empty(),
+                        })]),
+                        uses_odbc_syntax: false,
+                        parameters: FunctionArguments::None,
+                        args: FunctionArguments::List(FunctionArgumentList {
+                            duplicate_treatment: None,
+                            args: vec![
+                                FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Identifier(
+                                    Ident {
+                                        value: "first_name".to_owned(),
+                                        quote_style: None,
+                                        span: Span::empty(),
+                                    },
+                                ))),
+                                FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Identifier(
+                                    Ident {
+                                        value: "last_name".to_owned(),
+                                        quote_style: None,
+                                        span: Span::empty(),
+                                    },
+                                ))),
+                            ],
+                            clauses: vec![],
+                        }),
+                        filter: None,
+                        null_treatment: None,
+                        over: None,
+                        within_group: vec![],
+                    }),
+                    options: OrderByOptions {
+                        asc: None,
+                        nulls_first: None,
+                    },
+                    with_fill: None,
+                },
+                operator_class: expected_operator_class.clone(),
+            };
+
+            match pg().verified_stmt(&single_column_sql_statement) {
+                Statement::CreateIndex(CreateIndex {
+                    name: Some(ObjectName(name)),
+                    table_name: ObjectName(table_name),
+                    using: Some(using),
+                    columns,
+                    unique: false,
+                    concurrently: false,
+                    if_not_exists: false,
+                    include,
+                    nulls_distinct: None,
+                    with,
+                    predicate: None,
+                }) => {
+                    assert_eq_vec(&["the_index_name"], &name);
+                    assert_eq_vec(&["users"], &table_name);
+                    assert_eq!(expected_index_type, using);
+                    assert_eq!(expected_function_column, columns[0],);
+                    assert!(include.is_empty());
+                    assert!(with.is_empty());
+                }
+                _ => unreachable!(),
+            }
+
+            match pg().verified_stmt(&multi_column_sql_statement) {
+                Statement::CreateIndex(CreateIndex {
+                    name: Some(ObjectName(name)),
+                    table_name: ObjectName(table_name),
+                    using: Some(using),
+                    columns,
+                    unique: false,
+                    concurrently: false,
+                    if_not_exists: false,
+                    include,
+                    nulls_distinct: None,
+                    with,
+                    predicate: None,
+                }) => {
+                    assert_eq_vec(&["the_index_name"], &name);
+                    assert_eq_vec(&["users"], &table_name);
+                    assert_eq!(expected_index_type, using);
+                    assert_eq!(
+                        IndexColumn {
+                            column: OrderByExpr {
+                                expr: Expr::Identifier(Ident {
+                                    value: "column_name".to_owned(),
+                                    quote_style: None,
+                                    span: Span::empty()
+                                }),
+                                options: OrderByOptions {
+                                    asc: None,
+                                    nulls_first: None,
+                                },
+                                with_fill: None,
+                            },
+                            operator_class: None
+                        },
+                        columns[0],
+                    );
+                    assert_eq!(expected_function_column, columns[1],);
+                    assert!(include.is_empty());
+                    assert!(with.is_empty());
+                }
+                _ => unreachable!(),
+            }
+        }
+    }
+}
+
+#[test]
+fn parse_create_bloom() {
+    let sql =
+        "CREATE INDEX bloomidx ON tbloom USING BLOOM (i1,i2,i3) WITH (length = 80, col1 = 2, col2 = 2, col3 = 4)";
     match pg().verified_stmt(sql) {
         Statement::CreateIndex(CreateIndex {
             name: Some(ObjectName(name)),
             table_name: ObjectName(table_name),
-            using,
+            using: Some(using),
             columns,
-            unique,
-            concurrently,
-            if_not_exists,
+            unique: false,
+            concurrently: false,
+            if_not_exists: false,
             include,
             nulls_distinct: None,
             with,
             predicate: None,
         }) => {
-            assert_eq_vec(&["my_index"], &name);
-            assert_eq_vec(&["my_table"], &table_name);
-            assert_eq!(None, using);
-            assert!(!unique);
-            assert!(concurrently);
-            assert!(if_not_exists);
-            assert_eq_vec(&["col1", "col2"], &columns);
+            assert_eq_vec(&["bloomidx"], &name);
+            assert_eq_vec(&["tbloom"], &table_name);
+            assert_eq!(IndexType::Bloom, using);
+            assert_eq_vec(&["i1", "i2", "i3"], &columns);
             assert!(include.is_empty());
-            assert!(with.is_empty());
+            assert_eq!(
+                vec![
+                    Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident::new("length"))),
+                        op: BinaryOperator::Eq,
+                        right: Box::new(Expr::Value(number("80").into())),
+                    },
+                    Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident::new("col1"))),
+                        op: BinaryOperator::Eq,
+                        right: Box::new(Expr::Value(number("2").into())),
+                    },
+                    Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident::new("col2"))),
+                        op: BinaryOperator::Eq,
+                        right: Box::new(Expr::Value(number("2").into())),
+                    },
+                    Expr::BinaryOp {
+                        left: Box::new(Expr::Identifier(Ident::new("col3"))),
+                        op: BinaryOperator::Eq,
+                        right: Box::new(Expr::Value(number("4").into())),
+                    },
+                ],
+                with
+            );
         }
         _ => unreachable!(),
     }
 }
 
 #[test]
-fn parse_create_index_with_predicate() {
-    let sql = "CREATE INDEX IF NOT EXISTS my_index ON my_table(col1,col2) WHERE col3 IS NULL";
+fn parse_create_brin() {
+    let sql = "CREATE INDEX brin_sensor_data_recorded_at ON sensor_data USING BRIN (recorded_at)";
     match pg().verified_stmt(sql) {
         Statement::CreateIndex(CreateIndex {
             name: Some(ObjectName(name)),
             table_name: ObjectName(table_name),
-            using,
+            using: Some(using),
             columns,
-            unique,
-            concurrently,
-            if_not_exists,
+            unique: false,
+            concurrently: false,
+            if_not_exists: false,
             include,
             nulls_distinct: None,
             with,
-            predicate: Some(_),
+            predicate: None,
         }) => {
-            assert_eq_vec(&["my_index"], &name);
-            assert_eq_vec(&["my_table"], &table_name);
-            assert_eq!(None, using);
-            assert!(!unique);
-            assert!(!concurrently);
-            assert!(if_not_exists);
-            assert_eq_vec(&["col1", "col2"], &columns);
+            assert_eq_vec(&["brin_sensor_data_recorded_at"], &name);
+            assert_eq_vec(&["sensor_data"], &table_name);
+            assert_eq!(IndexType::BRIN, using);
+            assert_eq_vec(&["recorded_at"], &columns);
             assert!(include.is_empty());
             assert!(with.is_empty());
         }
@@ -2402,18 +2777,115 @@ fn parse_create_index_with_predicate() {
 }
 
 #[test]
-fn parse_create_index_with_include() {
-    let sql = "CREATE INDEX IF NOT EXISTS my_index ON my_table(col1,col2) INCLUDE (col3)";
-    match pg().verified_stmt(sql) {
-        Statement::CreateIndex(CreateIndex {
-            name: Some(ObjectName(name)),
-            table_name: ObjectName(table_name),
-            using,
-            columns,
-            unique,
-            concurrently,
-            if_not_exists,
-            include,
+fn parse_create_table_with_inherits() {
+    let single_inheritance_sql =
+        "CREATE TABLE child_table (child_column INT) INHERITS (public.parent_table)";
+    match pg().verified_stmt(single_inheritance_sql) {
+        Statement::CreateTable(CreateTable {
+            inherits: Some(inherits),
+            ..
+        }) => {
+            assert_eq_vec(&["public", "parent_table"], &inherits[0].0);
+        }
+        _ => unreachable!(),
+    }
+
+    let double_inheritance_sql = "CREATE TABLE child_table (child_column INT) INHERITS (public.parent_table, pg_catalog.pg_settings)";
+    match pg().verified_stmt(double_inheritance_sql) {
+        Statement::CreateTable(CreateTable {
+            inherits: Some(inherits),
+            ..
+        }) => {
+            assert_eq_vec(&["public", "parent_table"], &inherits[0].0);
+            assert_eq_vec(&["pg_catalog", "pg_settings"], &inherits[1].0);
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_table_with_empty_inherits_fails() {
+    assert!(matches!(
+        pg().parse_sql_statements("CREATE TABLE child_table (child_column INT) INHERITS ()"),
+        Err(ParserError::ParserError(_))
+    ));
+}
+
+#[test]
+fn parse_create_index_concurrently() {
+    let sql = "CREATE INDEX CONCURRENTLY IF NOT EXISTS my_index ON my_table(col1,col2)";
+    match pg().verified_stmt(sql) {
+        Statement::CreateIndex(CreateIndex {
+            name: Some(ObjectName(name)),
+            table_name: ObjectName(table_name),
+            using,
+            columns,
+            unique,
+            concurrently,
+            if_not_exists,
+            include,
+            nulls_distinct: None,
+            with,
+            predicate: None,
+        }) => {
+            assert_eq_vec(&["my_index"], &name);
+            assert_eq_vec(&["my_table"], &table_name);
+            assert_eq!(None, using);
+            assert!(!unique);
+            assert!(concurrently);
+            assert!(if_not_exists);
+            assert_eq_vec(&["col1", "col2"], &columns);
+            assert!(include.is_empty());
+            assert!(with.is_empty());
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_index_with_predicate() {
+    let sql = "CREATE INDEX IF NOT EXISTS my_index ON my_table(col1,col2) WHERE col3 IS NULL";
+    match pg().verified_stmt(sql) {
+        Statement::CreateIndex(CreateIndex {
+            name: Some(ObjectName(name)),
+            table_name: ObjectName(table_name),
+            using,
+            columns,
+            unique,
+            concurrently,
+            if_not_exists,
+            include,
+            nulls_distinct: None,
+            with,
+            predicate: Some(_),
+        }) => {
+            assert_eq_vec(&["my_index"], &name);
+            assert_eq_vec(&["my_table"], &table_name);
+            assert_eq!(None, using);
+            assert!(!unique);
+            assert!(!concurrently);
+            assert!(if_not_exists);
+            assert_eq_vec(&["col1", "col2"], &columns);
+            assert!(include.is_empty());
+            assert!(with.is_empty());
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_index_with_include() {
+    let sql = "CREATE INDEX IF NOT EXISTS my_index ON my_table(col1,col2) INCLUDE (col3)";
+    match pg().verified_stmt(sql) {
+        Statement::CreateIndex(CreateIndex {
+            name: Some(ObjectName(name)),
+            table_name: ObjectName(table_name),
+            using,
+            columns,
+            unique,
+            concurrently,
+            if_not_exists,
+            include,
             nulls_distinct: None,
             with,
             predicate: None,
@@ -2499,7 +2971,8 @@ fn parse_array_subquery_expr() {
     let select = pg().verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("ARRAY")]),
+            name: ObjectName::from(vec![Ident::new("ARRAY")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::Subquery(Box::new(Query {
                 with: None,
@@ -2507,10 +2980,14 @@ fn parse_array_subquery_expr() {
                     op: SetOperator::Union,
                     set_quantifier: SetQuantifier::None,
                     left: Box::new(SetExpr::Select(Box::new(Select {
+                        select_token: AttachedToken::empty(),
                         distinct: None,
                         top: None,
                         top_before_distinct: false,
-                        projection: vec![SelectItem::UnnamedExpr(Expr::Value(number("1")))],
+                        projection: vec![SelectItem::UnnamedExpr(Expr::Value(
+                            (number("1")).with_empty_span()
+                        ))],
+                        exclude: None,
                         into: None,
                         from: vec![],
                         lateral_views: vec![],
@@ -2526,12 +3003,17 @@ fn parse_array_subquery_expr() {
                         window_before_qualify: false,
                         value_table_mode: None,
                         connect_by: None,
+                        flavor: SelectFlavor::Standard,
                     }))),
                     right: Box::new(SetExpr::Select(Box::new(Select {
+                        select_token: AttachedToken::empty(),
                         distinct: None,
                         top: None,
                         top_before_distinct: false,
-                        projection: vec![SelectItem::UnnamedExpr(Expr::Value(number("2")))],
+                        projection: vec![SelectItem::UnnamedExpr(Expr::Value(
+                            (number("2")).with_empty_span()
+                        ))],
+                        exclude: None,
                         into: None,
                         from: vec![],
                         lateral_views: vec![],
@@ -2547,17 +3029,17 @@ fn parse_array_subquery_expr() {
                         window_before_qualify: false,
                         value_table_mode: None,
                         connect_by: None,
+                        flavor: SelectFlavor::Standard,
                     }))),
                 }),
                 order_by: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             })),
             filter: None,
             null_treatment: None,
@@ -2573,16 +3055,16 @@ fn test_transaction_statement() {
     let statement = pg().verified_stmt("SET TRANSACTION SNAPSHOT '000003A1-1'");
     assert_eq!(
         statement,
-        Statement::SetTransaction {
+        Statement::Set(Set::SetTransaction {
             modes: vec![],
             snapshot: Some(Value::SingleQuotedString(String::from("000003A1-1"))),
             session: false
-        }
+        })
     );
     let statement = pg().verified_stmt("SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ WRITE, ISOLATION LEVEL SERIALIZABLE");
     assert_eq!(
         statement,
-        Statement::SetTransaction {
+        Statement::Set(Set::SetTransaction {
             modes: vec![
                 TransactionMode::AccessMode(TransactionAccessMode::ReadOnly),
                 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite),
@@ -2590,7 +3072,7 @@ fn test_transaction_statement() {
             ],
             snapshot: None,
             session: true
-        }
+        })
     );
 }
 
@@ -2602,7 +3084,9 @@ fn test_json() {
         SelectItem::UnnamedExpr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("params"))),
             op: BinaryOperator::LongArrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("name".to_string()))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("name".to_string())).with_empty_span()
+            )),
         }),
         select.projection[0]
     );
@@ -2613,7 +3097,9 @@ fn test_json() {
         SelectItem::UnnamedExpr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("params"))),
             op: BinaryOperator::Arrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("name".to_string()))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("name".to_string())).with_empty_span()
+            )),
         }),
         select.projection[0]
     );
@@ -2625,12 +3111,14 @@ fn test_json() {
             left: Box::new(Expr::BinaryOp {
                 left: Box::new(Expr::Identifier(Ident::new("info"))),
                 op: BinaryOperator::Arrow,
-                right: Box::new(Expr::Value(Value::SingleQuotedString("items".to_string())))
+                right: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("items".to_string())).with_empty_span()
+                ))
             }),
             op: BinaryOperator::LongArrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "product".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("product".to_string())).with_empty_span()
+            )),
         }),
         select.projection[0]
     );
@@ -2642,7 +3130,7 @@ fn test_json() {
         SelectItem::UnnamedExpr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("obj"))),
             op: BinaryOperator::Arrow,
-            right: Box::new(Expr::Value(number("42"))),
+            right: Box::new(Expr::value(number("42"))),
         }),
         select.projection[0]
     );
@@ -2667,9 +3155,9 @@ fn test_json() {
             left: Box::new(Expr::Identifier(Ident::new("obj"))),
             op: BinaryOperator::Arrow,
             right: Box::new(Expr::BinaryOp {
-                left: Box::new(Expr::Value(number("3"))),
+                left: Box::new(Expr::value(number("3"))),
                 op: BinaryOperator::Multiply,
-                right: Box::new(Expr::Value(number("2"))),
+                right: Box::new(Expr::value(number("2"))),
             }),
         }),
         select.projection[0]
@@ -2681,9 +3169,9 @@ fn test_json() {
         SelectItem::UnnamedExpr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("info"))),
             op: BinaryOperator::HashArrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "{a,b,c}".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("{a,b,c}".to_string())).with_empty_span()
+            )),
         }),
         select.projection[0]
     );
@@ -2694,9 +3182,9 @@ fn test_json() {
         SelectItem::UnnamedExpr(Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("info"))),
             op: BinaryOperator::HashLongArrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "{a,b,c}".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("{a,b,c}".to_string())).with_empty_span()
+            )),
         }),
         select.projection[0]
     );
@@ -2707,9 +3195,9 @@ fn test_json() {
         Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("info"))),
             op: BinaryOperator::AtArrow,
-            right: Box::new(Expr::Value(Value::SingleQuotedString(
-                "{\"a\": 1}".to_string()
-            ))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("{\"a\": 1}".to_string())).with_empty_span()
+            )),
         },
         select.selection.unwrap(),
     );
@@ -2718,9 +3206,9 @@ fn test_json() {
     let select = pg().verified_only_select(sql);
     assert_eq!(
         Expr::BinaryOp {
-            left: Box::new(Expr::Value(Value::SingleQuotedString(
-                "{\"a\": 1}".to_string()
-            ))),
+            left: Box::new(Expr::Value(
+                (Value::SingleQuotedString("{\"a\": 1}".to_string())).with_empty_span()
+            )),
             op: BinaryOperator::ArrowAt,
             right: Box::new(Expr::Identifier(Ident::new("info"))),
         },
@@ -2735,8 +3223,8 @@ fn test_json() {
             op: BinaryOperator::HashMinus,
             right: Box::new(Expr::Array(Array {
                 elem: vec![
-                    Expr::Value(Value::SingleQuotedString("a".to_string())),
-                    Expr::Value(Value::SingleQuotedString("b".to_string())),
+                    Expr::Value((Value::SingleQuotedString("a".to_string())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("b".to_string())).with_empty_span()),
                 ],
                 named: true,
             })),
@@ -2750,7 +3238,9 @@ fn test_json() {
         Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::from("info"))),
             op: BinaryOperator::AtQuestion,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("$.a".to_string())),),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("$.a".to_string())).with_empty_span()
+            ),),
         },
         select.selection.unwrap(),
     );
@@ -2761,7 +3251,9 @@ fn test_json() {
         Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::from("info"))),
             op: BinaryOperator::AtAt,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("$.a".to_string())),),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("$.a".to_string())).with_empty_span()
+            ),),
         },
         select.selection.unwrap(),
     );
@@ -2772,7 +3264,9 @@ fn test_json() {
         Expr::BinaryOp {
             left: Box::new(Expr::Identifier(Ident::new("info"))),
             op: BinaryOperator::Question,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("b".to_string()))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("b".to_string())).with_empty_span()
+            )),
         },
         select.selection.unwrap(),
     );
@@ -2785,8 +3279,8 @@ fn test_json() {
             op: BinaryOperator::QuestionAnd,
             right: Box::new(Expr::Array(Array {
                 elem: vec![
-                    Expr::Value(Value::SingleQuotedString("b".to_string())),
-                    Expr::Value(Value::SingleQuotedString("c".to_string()))
+                    Expr::Value((Value::SingleQuotedString("b".to_string())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("c".to_string())).with_empty_span())
                 ],
                 named: true
             }))
@@ -2802,8 +3296,8 @@ fn test_json() {
             op: BinaryOperator::QuestionPipe,
             right: Box::new(Expr::Array(Array {
                 elem: vec![
-                    Expr::Value(Value::SingleQuotedString("b".to_string())),
-                    Expr::Value(Value::SingleQuotedString("c".to_string()))
+                    Expr::Value((Value::SingleQuotedString("b".to_string())).with_empty_span()),
+                    Expr::Value((Value::SingleQuotedString("c".to_string())).with_empty_span())
                 ],
                 named: true
             }))
@@ -2812,6 +3306,19 @@ fn test_json() {
     );
 }
 
+#[test]
+fn test_fn_arg_with_value_operator() {
+    match pg().verified_expr("JSON_OBJECT('name' VALUE 'value')") {
+        Expr::Function(Function { args: FunctionArguments::List(FunctionArgumentList { args, .. }), .. }) => {
+            assert!(matches!(
+                &args[..],
+                &[FunctionArg::ExprNamed { operator: FunctionArgOperator::Value, .. }]
+            ), "Invalid function argument: {args:?}");
+        }
+        other => panic!("Expected: JSON_OBJECT('name' VALUE 'value') to be parsed as a function, but got {other:?}"),
+    }
+}
+
 #[test]
 fn parse_json_table_is_not_reserved() {
     // JSON_TABLE is not a reserved keyword in PostgreSQL, even though it is in SQL:2023
@@ -2822,7 +3329,10 @@ fn parse_json_table_is_not_reserved() {
         TableFactor::Table {
             name: ObjectName(name),
             ..
-        } => assert_eq!("JSON_TABLE", name[0].value),
+        } => assert_eq!(
+            ObjectNamePart::Identifier(Ident::new("JSON_TABLE")),
+            name[0]
+        ),
         other => panic!("Expected: JSON_TABLE to be parsed as a table name, but got {other:?}"),
     }
 }
@@ -2831,50 +3341,62 @@ fn parse_json_table_is_not_reserved() {
 fn test_composite_value() {
     let sql = "SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9";
     let select = pg().verified_only_select(sql);
+
+    let Expr::CompoundFieldAccess { root, access_chain } =
+        expr_from_projection(&select.projection[0])
+    else {
+        unreachable!("expected projection: got {:?}", &select.projection[0]);
+    };
     assert_eq!(
-        SelectItem::UnnamedExpr(Expr::CompositeAccess {
-            key: Ident::new("name"),
-            expr: Box::new(Expr::Nested(Box::new(Expr::CompoundIdentifier(vec![
-                Ident::new("on_hand"),
-                Ident::new("item")
-            ]))))
-        }),
-        select.projection[0]
+        root.as_ref(),
+        &Expr::Nested(Box::new(Expr::CompoundIdentifier(vec![
+            Ident::new("on_hand"),
+            Ident::new("item")
+        ])))
+    );
+    assert_eq!(
+        access_chain.as_slice(),
+        &[AccessExpr::Dot(Expr::Identifier(Ident::new("name")))]
     );
 
     assert_eq!(
-        select.selection,
-        Some(Expr::BinaryOp {
-            left: Box::new(Expr::CompositeAccess {
-                key: Ident::new("price"),
-                expr: Box::new(Expr::Nested(Box::new(Expr::CompoundIdentifier(vec![
+        select.selection.as_ref().unwrap(),
+        &Expr::BinaryOp {
+            left: Box::new(Expr::CompoundFieldAccess {
+                root: Expr::Nested(Box::new(Expr::CompoundIdentifier(vec![
                     Ident::new("on_hand"),
                     Ident::new("item")
-                ]))))
+                ])))
+                .into(),
+                access_chain: vec![AccessExpr::Dot(Expr::Identifier(Ident::new("price")))]
             }),
             op: BinaryOperator::Gt,
-            right: Box::new(Expr::Value(number("9")))
-        })
+            right: Box::new(Expr::value(number("9")))
+        }
     );
 
     let sql = "SELECT (information_schema._pg_expandarray(ARRAY['i', 'i'])).n";
     let select = pg().verified_only_select(sql);
     assert_eq!(
-        SelectItem::UnnamedExpr(Expr::CompositeAccess {
-            key: Ident::new("n"),
-            expr: Box::new(Expr::Nested(Box::new(Expr::Function(Function {
-                name: ObjectName(vec![
+        &Expr::CompoundFieldAccess {
+            root: Box::new(Expr::Nested(Box::new(Expr::Function(Function {
+                name: ObjectName::from(vec![
                     Ident::new("information_schema"),
                     Ident::new("_pg_expandarray")
                 ]),
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::List(FunctionArgumentList {
                     duplicate_treatment: None,
                     args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Array(
                         Array {
                             elem: vec![
-                                Expr::Value(Value::SingleQuotedString("i".to_string())),
-                                Expr::Value(Value::SingleQuotedString("i".to_string())),
+                                Expr::Value(
+                                    (Value::SingleQuotedString("i".to_string())).with_empty_span()
+                                ),
+                                Expr::Value(
+                                    (Value::SingleQuotedString("i".to_string())).with_empty_span()
+                                ),
                             ],
                             named: true
                         }
@@ -2885,9 +3407,10 @@ fn test_composite_value() {
                 filter: None,
                 over: None,
                 within_group: vec![],
-            }))))
-        }),
-        select.projection[0]
+            })))),
+            access_chain: vec![AccessExpr::Dot(Expr::Identifier(Ident::new("n")))],
+        },
+        expr_from_projection(&select.projection[0])
     );
 }
 
@@ -2933,27 +3456,27 @@ fn parse_escaped_literal_string() {
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(6, select.projection.len());
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("s1 \n s1".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("s1 \n s1".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("s2 \\n s2".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("s2 \\n s2".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("s3 \\\n s3".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("s3 \\\n s3".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[2])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("s4 \\\\n s4".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("s4 \\\\n s4".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[3])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("'".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("'".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[4])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("foo \\".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("foo \\".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[5])
     );
 
@@ -2971,31 +3494,31 @@ fn parse_escaped_literal_string() {
     let select = pg_and_generic().verified_only_select_with_canonical(sql, canonical);
     assert_eq!(7, select.projection.len());
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("\u{0001}".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("\u{0001}".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[0])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("\u{10ffff}".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("\u{10ffff}".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[1])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("\u{000c}".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("\u{000c}".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[2])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("%".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("%".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[3])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("\u{0002}".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("\u{0002}".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[4])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("%".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("%".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[5])
     );
     assert_eq!(
-        &Expr::Value(Value::EscapedStringLiteral("%".to_string())),
+        &Expr::Value((Value::EscapedStringLiteral("%".to_string())).with_empty_span()),
         expr_from_projection(&select.projection[6])
     );
 
@@ -3043,7 +3566,8 @@ fn parse_current_functions() {
     let select = pg_and_generic().verified_only_select(sql);
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("CURRENT_CATALOG")]),
+            name: ObjectName::from(vec![Ident::new("CURRENT_CATALOG")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::None,
             null_treatment: None,
@@ -3055,7 +3579,8 @@ fn parse_current_functions() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("CURRENT_USER")]),
+            name: ObjectName::from(vec![Ident::new("CURRENT_USER")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::None,
             null_treatment: None,
@@ -3067,7 +3592,8 @@ fn parse_current_functions() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("SESSION_USER")]),
+            name: ObjectName::from(vec![Ident::new("SESSION_USER")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::None,
             null_treatment: None,
@@ -3079,7 +3605,8 @@ fn parse_current_functions() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::new("USER")]),
+            name: ObjectName::from(vec![Ident::new("USER")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::None,
             null_treatment: None,
@@ -3126,13 +3653,16 @@ fn parse_custom_operator() {
             left: Box::new(Expr::Identifier(Ident {
                 value: "relname".into(),
                 quote_style: None,
+                span: Span::empty(),
             })),
             op: BinaryOperator::PGCustomBinaryOperator(vec![
                 "database".into(),
                 "pg_catalog".into(),
                 "~".into()
             ]),
-            right: Box::new(Expr::Value(Value::SingleQuotedString("^(table)$".into())))
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("^(table)$".into())).with_empty_span()
+            ))
         })
     );
 
@@ -3145,9 +3675,12 @@ fn parse_custom_operator() {
             left: Box::new(Expr::Identifier(Ident {
                 value: "relname".into(),
                 quote_style: None,
+                span: Span::empty(),
             })),
             op: BinaryOperator::PGCustomBinaryOperator(vec!["pg_catalog".into(), "~".into()]),
-            right: Box::new(Expr::Value(Value::SingleQuotedString("^(table)$".into())))
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("^(table)$".into())).with_empty_span()
+            ))
         })
     );
 
@@ -3160,9 +3693,12 @@ fn parse_custom_operator() {
             left: Box::new(Expr::Identifier(Ident {
                 value: "relname".into(),
                 quote_style: None,
+                span: Span::empty(),
             })),
             op: BinaryOperator::PGCustomBinaryOperator(vec!["~".into()]),
-            right: Box::new(Expr::Value(Value::SingleQuotedString("^(table)$".into())))
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("^(table)$".into())).with_empty_span()
+            ))
         })
     );
 }
@@ -3248,9 +3784,9 @@ fn parse_create_role() {
             assert_eq!(*bypassrls, Some(true));
             assert_eq!(
                 *password,
-                Some(Password::Password(Expr::Value(Value::SingleQuotedString(
-                    "abcdef".into()
-                ))))
+                Some(Password::Password(Expr::Value(
+                    (Value::SingleQuotedString("abcdef".into())).with_empty_span()
+                )))
             );
             assert_eq!(*superuser, Some(true));
             assert_eq!(*create_db, Some(false));
@@ -3259,7 +3795,9 @@ fn parse_create_role() {
             assert_eq!(*connection_limit, None);
             assert_eq!(
                 *valid_until,
-                Some(Expr::Value(Value::SingleQuotedString("2025-01-01".into())))
+                Some(Expr::Value(
+                    (Value::SingleQuotedString("2025-01-01".into())).with_empty_span()
+                ))
             );
             assert_eq_vec(&["role1", "role2"], in_role);
             assert!(in_group.is_empty());
@@ -3310,12 +3848,14 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "old_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::RenameRole {
                 role_name: Ident {
                     value: "new_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             },
         }
@@ -3327,7 +3867,8 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::WithOptions {
                 options: vec![
@@ -3338,13 +3879,15 @@ fn parse_alter_role() {
                     RoleOption::Login(true),
                     RoleOption::Replication(true),
                     RoleOption::BypassRLS(true),
-                    RoleOption::ConnectionLimit(Expr::Value(number("100"))),
+                    RoleOption::ConnectionLimit(Expr::value(number("100"))),
                     RoleOption::Password({
-                        Password::Password(Expr::Value(Value::SingleQuotedString("abcdef".into())))
+                        Password::Password(Expr::Value(
+                            (Value::SingleQuotedString("abcdef".into())).with_empty_span(),
+                        ))
                     }),
-                    RoleOption::ValidUntil(Expr::Value(Value::SingleQuotedString(
-                        "2025-01-01".into(),
-                    )))
+                    RoleOption::ValidUntil(Expr::Value(
+                        (Value::SingleQuotedString("2025-01-01".into(),)).with_empty_span()
+                    ))
                 ]
             },
         }
@@ -3356,7 +3899,8 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::WithOptions {
                 options: vec![
@@ -3379,12 +3923,14 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Set {
-                config_name: ObjectName(vec![Ident {
+                config_name: ObjectName::from(vec![Ident {
                     value: "maintenance_work_mem".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 config_value: SetConfigValue::FromCurrent,
                 in_database: None
@@ -3398,17 +3944,22 @@ fn parse_alter_role() {
         [Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Set {
-                config_name: ObjectName(vec![Ident {
+                config_name: ObjectName::from(vec![Ident {
                     value: "maintenance_work_mem".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
-                config_value: SetConfigValue::Value(Expr::Value(number("100000"))),
-                in_database: Some(ObjectName(vec![Ident {
+                config_value: SetConfigValue::Value(Expr::Value(
+                    (number("100000")).with_empty_span()
+                )),
+                in_database: Some(ObjectName::from(vec![Ident {
                     value: "database_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]))
             },
         }]
@@ -3420,17 +3971,22 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Set {
-                config_name: ObjectName(vec![Ident {
+                config_name: ObjectName::from(vec![Ident {
                     value: "maintenance_work_mem".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
-                config_value: SetConfigValue::Value(Expr::Value(number("100000"))),
-                in_database: Some(ObjectName(vec![Ident {
+                config_value: SetConfigValue::Value(Expr::Value(
+                    (number("100000")).with_empty_span()
+                )),
+                in_database: Some(ObjectName::from(vec![Ident {
                     value: "database_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]))
             },
         }
@@ -3442,17 +3998,20 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Set {
-                config_name: ObjectName(vec![Ident {
+                config_name: ObjectName::from(vec![Ident {
                     value: "maintenance_work_mem".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 config_value: SetConfigValue::Default,
-                in_database: Some(ObjectName(vec![Ident {
+                in_database: Some(ObjectName::from(vec![Ident {
                     value: "database_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]))
             },
         }
@@ -3464,7 +4023,8 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Reset {
                 config_name: ResetConfig::ALL,
@@ -3479,16 +4039,19 @@ fn parse_alter_role() {
         Statement::AlterRole {
             name: Ident {
                 value: "role_name".into(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             },
             operation: AlterRoleOperation::Reset {
-                config_name: ResetConfig::ConfigName(ObjectName(vec![Ident {
+                config_name: ResetConfig::ConfigName(ObjectName::from(vec![Ident {
                     value: "maintenance_work_mem".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }])),
-                in_database: Some(ObjectName(vec![Ident {
+                in_database: Some(ObjectName::from(vec![Ident {
                     value: "database_name".into(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]))
             },
         }
@@ -3509,10 +4072,12 @@ fn parse_delimited_identifiers() {
             args,
             with_hints,
             version,
-            with_ordinality: _,
-            partitions: _,
+            ..
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -3531,7 +4096,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -3578,15 +4144,226 @@ fn parse_update_in_with_subquery() {
     pg_and_generic().verified_stmt(r#"WITH "result" AS (UPDATE "Hero" SET "name" = 'Captain America', "number_of_movies" = "number_of_movies" + 1 WHERE "secret_identity" = 'Sam Wilson' RETURNING "id", "name", "secret_identity", "number_of_movies") SELECT * FROM "result""#);
 }
 
+#[test]
+fn parser_create_function_with_args() {
+    let sql1 = r#"CREATE OR REPLACE FUNCTION check_strings_different(str1 VARCHAR, str2 VARCHAR) RETURNS BOOLEAN LANGUAGE plpgsql AS $$
+BEGIN
+    IF str1 <> str2 THEN
+        RETURN TRUE;
+    ELSE
+        RETURN FALSE;
+    END IF;
+END;
+$$"#;
+
+    assert_eq!(
+        pg_and_generic().verified_stmt(sql1),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: true,
+            temporary: false,
+            name: ObjectName::from(vec![Ident::new("check_strings_different")]),
+            args: Some(vec![
+                OperateFunctionArg::with_name(
+                    "str1",
+                    DataType::Varchar(None),
+                ),
+                OperateFunctionArg::with_name(
+                    "str2",
+                    DataType::Varchar(None),
+                ),
+            ]),
+            return_type: Some(DataType::Boolean),
+            language: Some("plpgsql".into()),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {value: "\nBEGIN\n    IF str1 <> str2 THEN\n        RETURN TRUE;\n    ELSE\n        RETURN FALSE;\n    END IF;\nEND;\n".to_owned(), tag: None})).with_empty_span()
+            ))),
+            if_not_exists: false,
+            using: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        })
+    );
+
+    let sql2 = r#"CREATE OR REPLACE FUNCTION check_not_zero(int1 INT) RETURNS BOOLEAN LANGUAGE plpgsql AS $$
+BEGIN
+    IF int1 <> 0 THEN
+        RETURN TRUE;
+    ELSE
+        RETURN FALSE;
+    END IF;
+END;
+$$"#;
+    assert_eq!(
+        pg_and_generic().verified_stmt(sql2),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: true,
+            temporary: false,
+            name: ObjectName::from(vec![Ident::new("check_not_zero")]),
+            args: Some(vec![
+                OperateFunctionArg::with_name(
+                    "int1",
+                    DataType::Int(None)
+                )
+            ]),
+            return_type: Some(DataType::Boolean),
+            language: Some("plpgsql".into()),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {value: "\nBEGIN\n    IF int1 <> 0 THEN\n        RETURN TRUE;\n    ELSE\n        RETURN FALSE;\n    END IF;\nEND;\n".to_owned(), tag: None})).with_empty_span()
+            ))),
+            if_not_exists: false,
+            using: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        })
+    );
+
+    let sql3 = r#"CREATE OR REPLACE FUNCTION check_values_different(a INT, b INT) RETURNS BOOLEAN LANGUAGE plpgsql AS $$
+BEGIN
+    IF a <> b THEN
+        RETURN TRUE;
+    ELSE
+        RETURN FALSE;
+    END IF;
+END;
+$$"#;
+    assert_eq!(
+        pg_and_generic().verified_stmt(sql3),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: true,
+            temporary: false,
+            name: ObjectName::from(vec![Ident::new("check_values_different")]),
+            args: Some(vec![
+                OperateFunctionArg::with_name(
+                    "a",
+                    DataType::Int(None)
+                ),
+                OperateFunctionArg::with_name(
+                    "b",
+                    DataType::Int(None)
+                ),
+            ]),
+            return_type: Some(DataType::Boolean),
+            language: Some("plpgsql".into()),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {value: "\nBEGIN\n    IF a <> b THEN\n        RETURN TRUE;\n    ELSE\n        RETURN FALSE;\n    END IF;\nEND;\n".to_owned(), tag: None})).with_empty_span()
+            ))),
+            if_not_exists: false,
+            using: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        })
+    );
+
+    let sql4 = r#"CREATE OR REPLACE FUNCTION check_values_different(int1 INT, int2 INT) RETURNS BOOLEAN LANGUAGE plpgsql AS $$
+BEGIN
+    IF int1 <> int2 THEN
+        RETURN TRUE;
+    ELSE
+        RETURN FALSE;
+    END IF;
+END;
+$$"#;
+    assert_eq!(
+        pg_and_generic().verified_stmt(sql4),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: true,
+            temporary: false,
+            name: ObjectName::from(vec![Ident::new("check_values_different")]),
+            args: Some(vec![
+                OperateFunctionArg::with_name(
+                    "int1",
+                    DataType::Int(None)
+                ),
+                OperateFunctionArg::with_name(
+                    "int2",
+                    DataType::Int(None)
+                ),
+            ]),
+            return_type: Some(DataType::Boolean),
+            language: Some("plpgsql".into()),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {value: "\nBEGIN\n    IF int1 <> int2 THEN\n        RETURN TRUE;\n    ELSE\n        RETURN FALSE;\n    END IF;\nEND;\n".to_owned(), tag: None})).with_empty_span()
+            ))),
+            if_not_exists: false,
+            using: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        })
+    );
+
+    let sql5 = r#"CREATE OR REPLACE FUNCTION foo(a TIMESTAMP WITH TIME ZONE, b VARCHAR) RETURNS BOOLEAN LANGUAGE plpgsql AS $$
+    BEGIN
+        RETURN TRUE;
+    END;
+    $$"#;
+    assert_eq!(
+        pg_and_generic().verified_stmt(sql5),
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
+            or_replace: true,
+            temporary: false,
+            name: ObjectName::from(vec![Ident::new("foo")]),
+            args: Some(vec![
+                OperateFunctionArg::with_name(
+                    "a",
+                    DataType::Timestamp(None, TimezoneInfo::WithTimeZone)
+                ),
+                OperateFunctionArg::with_name("b", DataType::Varchar(None)),
+            ]),
+            return_type: Some(DataType::Boolean),
+            language: Some("plpgsql".into()),
+            behavior: None,
+            called_on_null: None,
+            parallel: None,
+            function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {
+                    value: "\n    BEGIN\n        RETURN TRUE;\n    END;\n    ".to_owned(),
+                    tag: None
+                }))
+                .with_empty_span()
+            ))),
+            if_not_exists: false,
+            using: None,
+            determinism_specifier: None,
+            options: None,
+            remote_connection: None,
+        })
+    );
+
+    let incorrect_sql = "CREATE FUNCTION add(function(struct<a,b> int64), b INTEGER) RETURNS INTEGER LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS 'select $1 + $2;'";
+    assert!(pg().parse_sql_statements(incorrect_sql).is_err(),);
+}
+
 #[test]
 fn parse_create_function() {
     let sql = "CREATE FUNCTION add(INTEGER, INTEGER) RETURNS INTEGER LANGUAGE SQL IMMUTABLE STRICT PARALLEL SAFE AS 'select $1 + $2;'";
     assert_eq!(
         pg_and_generic().verified_stmt(sql),
-        Statement::CreateFunction {
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace: false,
             temporary: false,
-            name: ObjectName(vec![Ident::new("add")]),
+            name: ObjectName::from(vec![Ident::new("add")]),
             args: Some(vec![
                 OperateFunctionArg::unnamed(DataType::Integer(None)),
                 OperateFunctionArg::unnamed(DataType::Integer(None)),
@@ -3597,14 +4374,14 @@ fn parse_create_function() {
             called_on_null: Some(FunctionCalledOnNull::Strict),
             parallel: Some(FunctionParallel::Safe),
             function_body: Some(CreateFunctionBody::AsBeforeOptions(Expr::Value(
-                Value::SingleQuotedString("select $1 + $2;".into())
+                (Value::SingleQuotedString("select $1 + $2;".into())).with_empty_span()
             ))),
             if_not_exists: false,
             using: None,
             determinism_specifier: None,
             options: None,
             remote_connection: None,
-        }
+        })
     );
 }
 
@@ -3615,6 +4392,8 @@ fn parse_create_function_detailed() {
     pg_and_generic().verified_stmt("CREATE OR REPLACE FUNCTION add(a INTEGER, IN b INTEGER = 1) RETURNS INTEGER LANGUAGE SQL STABLE PARALLEL UNSAFE RETURN a + b");
     pg_and_generic().verified_stmt("CREATE OR REPLACE FUNCTION add(a INTEGER, IN b INTEGER = 1) RETURNS INTEGER LANGUAGE SQL STABLE CALLED ON NULL INPUT PARALLEL UNSAFE RETURN a + b");
     pg_and_generic().verified_stmt(r#"CREATE OR REPLACE FUNCTION increment(i INTEGER) RETURNS INTEGER LANGUAGE plpgsql AS $$ BEGIN RETURN i + 1; END; $$"#);
+    pg_and_generic().verified_stmt(r#"CREATE OR REPLACE FUNCTION no_arg() RETURNS VOID LANGUAGE plpgsql AS $$ BEGIN DELETE FROM my_table; END; $$"#);
+    pg_and_generic().verified_stmt(r#"CREATE OR REPLACE FUNCTION return_table(i INTEGER) RETURNS TABLE(id UUID, is_active BOOLEAN) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT NULL::UUID, NULL::BOOLEAN; END; $$"#);
 }
 #[test]
 fn parse_incorrect_create_function_parallel() {
@@ -3630,13 +4409,14 @@ fn parse_drop_function() {
         Statement::DropFunction {
             if_exists: true,
             func_desc: vec![FunctionDesc {
-                name: ObjectName(vec![Ident {
+                name: ObjectName::from(vec![Ident {
                     value: "test_func".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 args: None
             }],
-            option: None
+            drop_behavior: None
         }
     );
 
@@ -3646,9 +4426,10 @@ fn parse_drop_function() {
         Statement::DropFunction {
             if_exists: true,
             func_desc: vec![FunctionDesc {
-                name: ObjectName(vec![Ident {
+                name: ObjectName::from(vec![Ident {
                     value: "test_func".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 args: Some(vec![
                     OperateFunctionArg::with_name("a", DataType::Integer(None)),
@@ -3656,11 +4437,13 @@ fn parse_drop_function() {
                         mode: Some(ArgMode::In),
                         name: Some("b".into()),
                         data_type: DataType::Integer(None),
-                        default_expr: Some(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                        default_expr: Some(Expr::Value(
+                            (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }
                 ]),
             }],
-            option: None
+            drop_behavior: None
         }
     );
 
@@ -3671,9 +4454,10 @@ fn parse_drop_function() {
             if_exists: true,
             func_desc: vec![
                 FunctionDesc {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "test_func1".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }]),
                     args: Some(vec![
                         OperateFunctionArg::with_name("a", DataType::Integer(None)),
@@ -3681,17 +4465,17 @@ fn parse_drop_function() {
                             mode: Some(ArgMode::In),
                             name: Some("b".into()),
                             data_type: DataType::Integer(None),
-                            default_expr: Some(Expr::Value(Value::Number(
-                                "1".parse().unwrap(),
-                                false
-                            ))),
+                            default_expr: Some(Expr::Value(
+                                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                            )),
                         }
                     ]),
                 },
                 FunctionDesc {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "test_func2".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }]),
                     args: Some(vec![
                         OperateFunctionArg::with_name("a", DataType::Varchar(None)),
@@ -3699,19 +4483,78 @@ fn parse_drop_function() {
                             mode: Some(ArgMode::In),
                             name: Some("b".into()),
                             data_type: DataType::Integer(None),
-                            default_expr: Some(Expr::Value(Value::Number(
-                                "1".parse().unwrap(),
-                                false
-                            ))),
+                            default_expr: Some(Expr::Value(
+                                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                            )),
                         }
                     ]),
                 }
             ],
-            option: None
+            drop_behavior: None
         }
     );
 }
 
+#[test]
+fn parse_drop_domain() {
+    let sql = "DROP DOMAIN IF EXISTS jpeg_domain";
+    assert_eq!(
+        pg().verified_stmt(sql),
+        Statement::DropDomain(DropDomain {
+            if_exists: true,
+            name: ObjectName::from(vec![Ident {
+                value: "jpeg_domain".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }]),
+            drop_behavior: None
+        })
+    );
+
+    let sql = "DROP DOMAIN jpeg_domain";
+    assert_eq!(
+        pg().verified_stmt(sql),
+        Statement::DropDomain(DropDomain {
+            if_exists: false,
+            name: ObjectName::from(vec![Ident {
+                value: "jpeg_domain".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }]),
+            drop_behavior: None
+        })
+    );
+
+    let sql = "DROP DOMAIN IF EXISTS jpeg_domain CASCADE";
+    assert_eq!(
+        pg().verified_stmt(sql),
+        Statement::DropDomain(DropDomain {
+            if_exists: true,
+            name: ObjectName::from(vec![Ident {
+                value: "jpeg_domain".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }]),
+            drop_behavior: Some(DropBehavior::Cascade)
+        })
+    );
+
+    let sql = "DROP DOMAIN IF EXISTS jpeg_domain RESTRICT";
+
+    assert_eq!(
+        pg().verified_stmt(sql),
+        Statement::DropDomain(DropDomain {
+            if_exists: true,
+            name: ObjectName::from(vec![Ident {
+                value: "jpeg_domain".to_string(),
+                quote_style: None,
+                span: Span::empty(),
+            }]),
+            drop_behavior: Some(DropBehavior::Restrict)
+        })
+    );
+}
+
 #[test]
 fn parse_drop_procedure() {
     let sql = "DROP PROCEDURE IF EXISTS test_proc";
@@ -3720,13 +4563,14 @@ fn parse_drop_procedure() {
         Statement::DropProcedure {
             if_exists: true,
             proc_desc: vec![FunctionDesc {
-                name: ObjectName(vec![Ident {
+                name: ObjectName::from(vec![Ident {
                     value: "test_proc".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 args: None
             }],
-            option: None
+            drop_behavior: None
         }
     );
 
@@ -3736,9 +4580,10 @@ fn parse_drop_procedure() {
         Statement::DropProcedure {
             if_exists: true,
             proc_desc: vec![FunctionDesc {
-                name: ObjectName(vec![Ident {
+                name: ObjectName::from(vec![Ident {
                     value: "test_proc".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }]),
                 args: Some(vec![
                     OperateFunctionArg::with_name("a", DataType::Integer(None)),
@@ -3746,11 +4591,13 @@ fn parse_drop_procedure() {
                         mode: Some(ArgMode::In),
                         name: Some("b".into()),
                         data_type: DataType::Integer(None),
-                        default_expr: Some(Expr::Value(Value::Number("1".parse().unwrap(), false))),
+                        default_expr: Some(Expr::Value(
+                            (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                        )),
                     }
                 ]),
             }],
-            option: None
+            drop_behavior: None
         }
     );
 
@@ -3761,9 +4608,10 @@ fn parse_drop_procedure() {
             if_exists: true,
             proc_desc: vec![
                 FunctionDesc {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "test_proc1".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }]),
                     args: Some(vec![
                         OperateFunctionArg::with_name("a", DataType::Integer(None)),
@@ -3771,17 +4619,17 @@ fn parse_drop_procedure() {
                             mode: Some(ArgMode::In),
                             name: Some("b".into()),
                             data_type: DataType::Integer(None),
-                            default_expr: Some(Expr::Value(Value::Number(
-                                "1".parse().unwrap(),
-                                false
-                            ))),
+                            default_expr: Some(Expr::Value(
+                                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                            )),
                         }
                     ]),
                 },
                 FunctionDesc {
-                    name: ObjectName(vec![Ident {
+                    name: ObjectName::from(vec![Ident {
                         value: "test_proc2".to_string(),
-                        quote_style: None
+                        quote_style: None,
+                        span: Span::empty(),
                     }]),
                     args: Some(vec![
                         OperateFunctionArg::with_name("a", DataType::Varchar(None)),
@@ -3789,15 +4637,14 @@ fn parse_drop_procedure() {
                             mode: Some(ArgMode::In),
                             name: Some("b".into()),
                             data_type: DataType::Integer(None),
-                            default_expr: Some(Expr::Value(Value::Number(
-                                "1".parse().unwrap(),
-                                false
-                            ))),
+                            default_expr: Some(Expr::Value(
+                                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                            )),
                         }
                     ]),
                 }
             ],
-            option: None
+            drop_behavior: None
         }
     );
 
@@ -3829,57 +4676,76 @@ fn parse_dollar_quoted_string() {
     };
 
     assert_eq!(
-        &Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-            tag: None,
-            value: "hello".into()
-        })),
+        &Expr::Value(
+            (Value::DollarQuotedString(DollarQuotedString {
+                tag: None,
+                value: "hello".into()
+            }))
+            .with_empty_span()
+        ),
         expr_from_projection(&projection[0])
     );
 
     assert_eq!(
-        &Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-            tag: Some("tag_name".into()),
-            value: "world".into()
-        })),
+        &Expr::Value(
+            (Value::DollarQuotedString(DollarQuotedString {
+                tag: Some("tag_name".into()),
+                value: "world".into()
+            }))
+            .with_empty_span()
+        ),
         expr_from_projection(&projection[1])
     );
 
     assert_eq!(
-        &Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-            tag: None,
-            value: "Foo$Bar".into()
-        })),
+        &Expr::Value(
+            (Value::DollarQuotedString(DollarQuotedString {
+                tag: None,
+                value: "Foo$Bar".into()
+            }))
+            .with_empty_span()
+        ),
         expr_from_projection(&projection[2])
     );
 
     assert_eq!(
         projection[3],
         SelectItem::ExprWithAlias {
-            expr: Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-                tag: None,
-                value: "Foo$Bar".into(),
-            })),
+            expr: Expr::Value(
+                (Value::DollarQuotedString(DollarQuotedString {
+                    tag: None,
+                    value: "Foo$Bar".into(),
+                }))
+                .with_empty_span()
+            ),
             alias: Ident {
                 value: "col_name".into(),
                 quote_style: None,
+                span: Span::empty(),
             },
-        }
+        },
     );
 
     assert_eq!(
         expr_from_projection(&projection[4]),
-        &Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-            tag: None,
-            value: "".into()
-        })),
+        &Expr::Value(
+            (Value::DollarQuotedString(DollarQuotedString {
+                tag: None,
+                value: "".into()
+            }))
+            .with_empty_span()
+        ),
     );
 
     assert_eq!(
         expr_from_projection(&projection[5]),
-        &Expr::Value(Value::DollarQuotedString(DollarQuotedString {
-            tag: Some("tag_name".into()),
-            value: "".into()
-        })),
+        &Expr::Value(
+            (Value::DollarQuotedString(DollarQuotedString {
+                tag: Some("tag_name".into()),
+                value: "".into()
+            }))
+            .with_empty_span()
+        ),
     );
 }
 
@@ -3959,16 +4825,16 @@ fn parse_select_group_by_cube() {
 #[test]
 fn parse_truncate() {
     let truncate = pg_and_generic().verified_stmt("TRUNCATE db.table_name");
-    let table_name = ObjectName(vec![Ident::new("db"), Ident::new("table_name")]);
+    let table_name = ObjectName::from(vec![Ident::new("db"), Ident::new("table_name")]);
     let table_names = vec![TruncateTableTarget {
         name: table_name.clone(),
+        only: false,
     }];
     assert_eq!(
         Statement::Truncate {
             table_names,
             partitions: None,
             table: false,
-            only: false,
             identity: None,
             cascade: None,
             on_cluster: None,
@@ -3982,9 +4848,10 @@ fn parse_truncate_with_options() {
     let truncate = pg_and_generic()
         .verified_stmt("TRUNCATE TABLE ONLY db.table_name RESTART IDENTITY CASCADE");
 
-    let table_name = ObjectName(vec![Ident::new("db"), Ident::new("table_name")]);
+    let table_name = ObjectName::from(vec![Ident::new("db"), Ident::new("table_name")]);
     let table_names = vec![TruncateTableTarget {
         name: table_name.clone(),
+        only: true,
     }];
 
     assert_eq!(
@@ -3992,9 +4859,8 @@ fn parse_truncate_with_options() {
             table_names,
             partitions: None,
             table: true,
-            only: true,
             identity: Some(TruncateIdentityOption::Restart),
-            cascade: Some(TruncateCascadeOption::Cascade),
+            cascade: Some(CascadeOption::Cascade),
             on_cluster: None,
         },
         truncate
@@ -4007,15 +4873,17 @@ fn parse_truncate_with_table_list() {
         "TRUNCATE TABLE db.table_name, db.other_table_name RESTART IDENTITY CASCADE",
     );
 
-    let table_name_a = ObjectName(vec![Ident::new("db"), Ident::new("table_name")]);
-    let table_name_b = ObjectName(vec![Ident::new("db"), Ident::new("other_table_name")]);
+    let table_name_a = ObjectName::from(vec![Ident::new("db"), Ident::new("table_name")]);
+    let table_name_b = ObjectName::from(vec![Ident::new("db"), Ident::new("other_table_name")]);
 
     let table_names = vec![
         TruncateTableTarget {
             name: table_name_a.clone(),
+            only: false,
         },
         TruncateTableTarget {
             name: table_name_b.clone(),
+            only: false,
         },
     ];
 
@@ -4024,9 +4892,8 @@ fn parse_truncate_with_table_list() {
             table_names,
             partitions: None,
             table: true,
-            only: false,
             identity: Some(TruncateIdentityOption::Restart),
-            cascade: Some(TruncateCascadeOption::Cascade),
+            cascade: Some(CascadeOption::Cascade),
             on_cluster: None,
         },
         truncate
@@ -4056,7 +4923,6 @@ fn parse_create_table_with_alias() {
             name,
             columns,
             constraints,
-            with_options: _with_options,
             if_not_exists: false,
             external: false,
             file_format: None,
@@ -4070,37 +4936,31 @@ fn parse_create_table_with_alias() {
                     ColumnDef {
                         name: "int8_col".into(),
                         data_type: DataType::Int8(None),
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "int4_col".into(),
                         data_type: DataType::Int4(None),
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "int2_col".into(),
                         data_type: DataType::Int2(None),
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "float8_col".into(),
                         data_type: DataType::Float8,
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "float4_col".into(),
                         data_type: DataType::Float4,
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "bool_col".into(),
                         data_type: DataType::Bool,
-                        collation: None,
                         options: vec![]
                     },
                 ]
@@ -4122,13 +4982,11 @@ fn parse_create_table_with_partition_by() {
                     ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![]
                     },
                     ColumnDef {
                         name: "b".into(),
                         data_type: DataType::Text,
-                        collation: None,
                         options: vec![]
                     }
                 ],
@@ -4175,7 +5033,7 @@ fn parse_join_constraint_unnest_alias() {
                 with_ordinality: false,
             },
             global: false,
-            join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+            join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
                 left: Box::new(Expr::Identifier("c1".into())),
                 op: BinaryOperator::Eq,
                 right: Box::new(Expr::Identifier("c2".into())),
@@ -4204,22 +5062,26 @@ fn test_simple_postgres_insert_with_alias() {
             or: None,
             ignore: false,
             into: true,
-            table_name: ObjectName(vec![Ident {
+            table: TableObject::TableName(ObjectName::from(vec![Ident {
                 value: "test_tables".to_string(),
-                quote_style: None
-            }]),
+                quote_style: None,
+                span: Span::empty(),
+            }])),
             table_alias: Some(Ident {
                 value: "test_table".to_string(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             }),
             columns: vec![
                 Ident {
                     value: "id".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 },
                 Ident {
                     value: "a".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             ],
             overwrite: false,
@@ -4228,31 +5090,30 @@ fn test_simple_postgres_insert_with_alias() {
                 body: Box::new(SetExpr::Values(Values {
                     explicit_row: false,
                     rows: vec![vec![
-                        Expr::Identifier(Ident {
-                            value: "DEFAULT".to_string(),
-                            quote_style: None
-                        }),
-                        Expr::Value(Value::Number("123".to_string(), false))
+                        Expr::Identifier(Ident::new("DEFAULT")),
+                        Expr::Value((Value::Number("123".to_string(), false)).with_empty_span())
                     ]]
                 })),
                 order_by: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             })),
+            assignments: vec![],
             partitioned: None,
             after_columns: vec![],
-            table: false,
+            has_table_keyword: false,
             on: None,
             returning: None,
             replace_into: false,
             priority: None,
-            insert_alias: None
+            insert_alias: None,
+            settings: None,
+            format_clause: None,
         })
     )
 }
@@ -4270,22 +5131,26 @@ fn test_simple_postgres_insert_with_alias() {
             or: None,
             ignore: false,
             into: true,
-            table_name: ObjectName(vec![Ident {
+            table: TableObject::TableName(ObjectName::from(vec![Ident {
                 value: "test_tables".to_string(),
-                quote_style: None
-            }]),
+                quote_style: None,
+                span: Span::empty(),
+            }])),
             table_alias: Some(Ident {
                 value: "test_table".to_string(),
-                quote_style: None
+                quote_style: None,
+                span: Span::empty(),
             }),
             columns: vec![
                 Ident {
                     value: "id".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 },
                 Ident {
                     value: "a".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             ],
             overwrite: false,
@@ -4294,34 +5159,33 @@ fn test_simple_postgres_insert_with_alias() {
                 body: Box::new(SetExpr::Values(Values {
                     explicit_row: false,
                     rows: vec![vec![
-                        Expr::Identifier(Ident {
-                            value: "DEFAULT".to_string(),
-                            quote_style: None
-                        }),
-                        Expr::Value(Value::Number(
-                            bigdecimal::BigDecimal::new(123.into(), 0),
-                            false
-                        ))
+                        Expr::Identifier(Ident::new("DEFAULT")),
+                        Expr::Value(
+                            (Value::Number(bigdecimal::BigDecimal::new(123.into(), 0), false))
+                                .with_empty_span()
+                        )
                     ]]
                 })),
                 order_by: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             })),
+            assignments: vec![],
             partitioned: None,
             after_columns: vec![],
-            table: false,
+            has_table_keyword: false,
             on: None,
             returning: None,
             replace_into: false,
             priority: None,
-            insert_alias: None
+            insert_alias: None,
+            settings: None,
+            format_clause: None,
         })
     )
 }
@@ -4338,22 +5202,26 @@ fn test_simple_insert_with_quoted_alias() {
             or: None,
             ignore: false,
             into: true,
-            table_name: ObjectName(vec![Ident {
+            table: TableObject::TableName(ObjectName::from(vec![Ident {
                 value: "test_tables".to_string(),
-                quote_style: None
-            }]),
+                quote_style: None,
+                span: Span::empty(),
+            }])),
             table_alias: Some(Ident {
                 value: "Test_Table".to_string(),
-                quote_style: Some('"')
+                quote_style: Some('"'),
+                span: Span::empty(),
             }),
             columns: vec![
                 Ident {
                     value: "id".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 },
                 Ident {
                     value: "a".to_string(),
-                    quote_style: None
+                    quote_style: None,
+                    span: Span::empty(),
                 }
             ],
             overwrite: false,
@@ -4362,31 +5230,32 @@ fn test_simple_insert_with_quoted_alias() {
                 body: Box::new(SetExpr::Values(Values {
                     explicit_row: false,
                     rows: vec![vec![
-                        Expr::Identifier(Ident {
-                            value: "DEFAULT".to_string(),
-                            quote_style: None
-                        }),
-                        Expr::Value(Value::SingleQuotedString("0123".to_string()))
+                        Expr::Identifier(Ident::new("DEFAULT")),
+                        Expr::Value(
+                            (Value::SingleQuotedString("0123".to_string())).with_empty_span()
+                        )
                     ]]
                 })),
                 order_by: None,
-                limit: None,
-                limit_by: vec![],
-                offset: None,
+                limit_clause: None,
                 fetch: None,
                 locks: vec![],
                 for_clause: None,
                 settings: None,
                 format_clause: None,
+                pipe_operators: vec![],
             })),
+            assignments: vec![],
             partitioned: None,
             after_columns: vec![],
-            table: false,
+            has_table_keyword: false,
             on: None,
             returning: None,
             replace_into: false,
             priority: None,
             insert_alias: None,
+            settings: None,
+            format_clause: None,
         })
     )
 }
@@ -4427,24 +5296,28 @@ fn parse_at_time_zone() {
     // check precedence
     let expr = Expr::BinaryOp {
         left: Box::new(Expr::AtTimeZone {
-            timestamp: Box::new(Expr::TypedString {
+            timestamp: Box::new(Expr::TypedString(TypedString {
                 data_type: DataType::Timestamp(None, TimezoneInfo::None),
-                value: "2001-09-28 01:00".to_owned(),
-            }),
+                value: ValueWithSpan {
+                    value: Value::SingleQuotedString("2001-09-28 01:00".to_string()),
+                    span: Span::empty(),
+                },
+                uses_odbc_syntax: false,
+            })),
             time_zone: Box::new(Expr::Cast {
                 kind: CastKind::DoubleColon,
-                expr: Box::new(Expr::Value(Value::SingleQuotedString(
-                    "America/Los_Angeles".to_owned(),
-                ))),
+                expr: Box::new(Expr::Value(
+                    Value::SingleQuotedString("America/Los_Angeles".to_owned()).with_empty_span(),
+                )),
                 data_type: DataType::Text,
                 format: None,
             }),
         }),
         op: BinaryOperator::Plus,
         right: Box::new(Expr::Interval(Interval {
-            value: Box::new(Expr::Value(Value::SingleQuotedString(
-                "23 hours".to_owned(),
-            ))),
+            value: Box::new(Expr::Value(
+                Value::SingleQuotedString("23 hours".to_owned()).with_empty_span(),
+            )),
             leading_field: None,
             leading_precision: None,
             last_field: None,
@@ -4459,20 +5332,64 @@ fn parse_at_time_zone() {
     );
 }
 
+#[test]
+fn parse_interval_data_type() {
+    pg_and_generic().verified_stmt("CREATE TABLE t (i INTERVAL)");
+    for p in 0..=6 {
+        pg_and_generic().verified_stmt(&format!("CREATE TABLE t (i INTERVAL({p}))"));
+        pg_and_generic().verified_stmt(&format!("SELECT '1 second'::INTERVAL({p})"));
+        pg_and_generic().verified_stmt(&format!("SELECT CAST('1 second' AS INTERVAL({p}))"));
+    }
+    let fields = [
+        "YEAR",
+        "MONTH",
+        "DAY",
+        "HOUR",
+        "MINUTE",
+        "SECOND",
+        "YEAR TO MONTH",
+        "DAY TO HOUR",
+        "DAY TO MINUTE",
+        "DAY TO SECOND",
+        "HOUR TO MINUTE",
+        "HOUR TO SECOND",
+        "MINUTE TO SECOND",
+    ];
+    for field in fields {
+        pg_and_generic().verified_stmt(&format!("CREATE TABLE t (i INTERVAL {field})"));
+        pg_and_generic().verified_stmt(&format!("SELECT '1 second'::INTERVAL {field}"));
+        pg_and_generic().verified_stmt(&format!("SELECT CAST('1 second' AS INTERVAL {field})"));
+    }
+    for p in 0..=6 {
+        for field in fields {
+            pg_and_generic().verified_stmt(&format!("CREATE TABLE t (i INTERVAL {field}({p}))"));
+            pg_and_generic().verified_stmt(&format!("SELECT '1 second'::INTERVAL {field}({p})"));
+            pg_and_generic()
+                .verified_stmt(&format!("SELECT CAST('1 second' AS INTERVAL {field}({p}))"));
+        }
+    }
+}
+
 #[test]
 fn parse_create_table_with_options() {
     let sql = "CREATE TABLE t (c INT) WITH (foo = 'bar', a = 123)";
     match pg().verified_stmt(sql) {
-        Statement::CreateTable(CreateTable { with_options, .. }) => {
+        Statement::CreateTable(CreateTable { table_options, .. }) => {
+            let with_options = match table_options {
+                CreateTableOptions::With(options) => options,
+                _ => unreachable!(),
+            };
             assert_eq!(
                 vec![
                     SqlOption::KeyValue {
                         key: "foo".into(),
-                        value: Expr::Value(Value::SingleQuotedString("bar".into())),
+                        value: Expr::Value(
+                            (Value::SingleQuotedString("bar".into())).with_empty_span()
+                        ),
                     },
                     SqlOption::KeyValue {
                         key: "a".into(),
-                        value: Expr::Value(number("123")),
+                        value: Expr::value(number("123")),
                     },
                 ],
                 with_options
@@ -4518,35 +5435,138 @@ fn test_table_unnest_with_ordinality() {
 #[test]
 fn test_escaped_string_literal() {
     match pg().verified_expr(r#"E'\n'"#) {
-        Expr::Value(Value::EscapedStringLiteral(s)) => {
+        Expr::Value(ValueWithSpan {
+            value: Value::EscapedStringLiteral(s),
+            span: _,
+        }) => {
             assert_eq!("\n", s);
         }
         _ => unreachable!(),
     }
 }
 
+#[test]
+fn parse_create_domain() {
+    let sql1 = "CREATE DOMAIN my_domain AS INTEGER CHECK (VALUE > 0)";
+    let expected = Statement::CreateDomain(CreateDomain {
+        name: ObjectName::from(vec![Ident::new("my_domain")]),
+        data_type: DataType::Integer(None),
+        collation: None,
+        default: None,
+        constraints: vec![TableConstraint::Check {
+            name: None,
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("VALUE"))),
+                op: BinaryOperator::Gt,
+                right: Box::new(Expr::Value(test_utils::number("0").into())),
+            }),
+            enforced: None,
+        }],
+    });
+
+    assert_eq!(pg().verified_stmt(sql1), expected);
+
+    let sql2 = "CREATE DOMAIN my_domain AS INTEGER COLLATE \"en_US\" CHECK (VALUE > 0)";
+    let expected = Statement::CreateDomain(CreateDomain {
+        name: ObjectName::from(vec![Ident::new("my_domain")]),
+        data_type: DataType::Integer(None),
+        collation: Some(Ident::with_quote('"', "en_US")),
+        default: None,
+        constraints: vec![TableConstraint::Check {
+            name: None,
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("VALUE"))),
+                op: BinaryOperator::Gt,
+                right: Box::new(Expr::Value(test_utils::number("0").into())),
+            }),
+            enforced: None,
+        }],
+    });
+
+    assert_eq!(pg().verified_stmt(sql2), expected);
+
+    let sql3 = "CREATE DOMAIN my_domain AS INTEGER DEFAULT 1 CHECK (VALUE > 0)";
+    let expected = Statement::CreateDomain(CreateDomain {
+        name: ObjectName::from(vec![Ident::new("my_domain")]),
+        data_type: DataType::Integer(None),
+        collation: None,
+        default: Some(Expr::Value(test_utils::number("1").into())),
+        constraints: vec![TableConstraint::Check {
+            name: None,
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("VALUE"))),
+                op: BinaryOperator::Gt,
+                right: Box::new(Expr::Value(test_utils::number("0").into())),
+            }),
+            enforced: None,
+        }],
+    });
+
+    assert_eq!(pg().verified_stmt(sql3), expected);
+
+    let sql4 = "CREATE DOMAIN my_domain AS INTEGER COLLATE \"en_US\" DEFAULT 1 CHECK (VALUE > 0)";
+    let expected = Statement::CreateDomain(CreateDomain {
+        name: ObjectName::from(vec![Ident::new("my_domain")]),
+        data_type: DataType::Integer(None),
+        collation: Some(Ident::with_quote('"', "en_US")),
+        default: Some(Expr::Value(test_utils::number("1").into())),
+        constraints: vec![TableConstraint::Check {
+            name: None,
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("VALUE"))),
+                op: BinaryOperator::Gt,
+                right: Box::new(Expr::Value(test_utils::number("0").into())),
+            }),
+            enforced: None,
+        }],
+    });
+
+    assert_eq!(pg().verified_stmt(sql4), expected);
+
+    let sql5 = "CREATE DOMAIN my_domain AS INTEGER CONSTRAINT my_constraint CHECK (VALUE > 0)";
+    let expected = Statement::CreateDomain(CreateDomain {
+        name: ObjectName::from(vec![Ident::new("my_domain")]),
+        data_type: DataType::Integer(None),
+        collation: None,
+        default: None,
+        constraints: vec![TableConstraint::Check {
+            name: Some(Ident::new("my_constraint")),
+            expr: Box::new(Expr::BinaryOp {
+                left: Box::new(Expr::Identifier(Ident::new("VALUE"))),
+                op: BinaryOperator::Gt,
+                right: Box::new(Expr::Value(test_utils::number("0").into())),
+            }),
+            enforced: None,
+        }],
+    });
+
+    assert_eq!(pg().verified_stmt(sql5), expected);
+}
+
 #[test]
 fn parse_create_simple_before_insert_trigger() {
     let sql = "CREATE TRIGGER check_insert BEFORE INSERT ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_insert";
     let expected = Statement::CreateTrigger {
+        or_alter: false,
         or_replace: false,
         is_constraint: false,
-        name: ObjectName(vec![Ident::new("check_insert")]),
+        name: ObjectName::from(vec![Ident::new("check_insert")]),
         period: TriggerPeriod::Before,
         events: vec![TriggerEvent::Insert],
-        table_name: ObjectName(vec![Ident::new("accounts")]),
+        table_name: ObjectName::from(vec![Ident::new("accounts")]),
         referenced_table_name: None,
         referencing: vec![],
         trigger_object: TriggerObject::Row,
         include_each: true,
         condition: None,
-        exec_body: TriggerExecBody {
+        exec_body: Some(TriggerExecBody {
             exec_type: TriggerExecBodyType::Function,
             func_desc: FunctionDesc {
-                name: ObjectName(vec![Ident::new("check_account_insert")]),
+                name: ObjectName::from(vec![Ident::new("check_account_insert")]),
                 args: None,
             },
-        },
+        }),
+        statements: None,
         characteristics: None,
     };
 
@@ -4557,12 +5577,13 @@ fn parse_create_simple_before_insert_trigger() {
 fn parse_create_after_update_trigger_with_condition() {
     let sql = "CREATE TRIGGER check_update AFTER UPDATE ON accounts FOR EACH ROW WHEN (NEW.balance > 10000) EXECUTE FUNCTION check_account_update";
     let expected = Statement::CreateTrigger {
+        or_alter: false,
         or_replace: false,
         is_constraint: false,
-        name: ObjectName(vec![Ident::new("check_update")]),
+        name: ObjectName::from(vec![Ident::new("check_update")]),
         period: TriggerPeriod::After,
         events: vec![TriggerEvent::Update(vec![])],
-        table_name: ObjectName(vec![Ident::new("accounts")]),
+        table_name: ObjectName::from(vec![Ident::new("accounts")]),
         referenced_table_name: None,
         referencing: vec![],
         trigger_object: TriggerObject::Row,
@@ -4573,15 +5594,16 @@ fn parse_create_after_update_trigger_with_condition() {
                 Ident::new("balance"),
             ])),
             op: BinaryOperator::Gt,
-            right: Box::new(Expr::Value(number("10000"))),
+            right: Box::new(Expr::value(number("10000"))),
         }))),
-        exec_body: TriggerExecBody {
+        exec_body: Some(TriggerExecBody {
             exec_type: TriggerExecBodyType::Function,
             func_desc: FunctionDesc {
-                name: ObjectName(vec![Ident::new("check_account_update")]),
+                name: ObjectName::from(vec![Ident::new("check_account_update")]),
                 args: None,
             },
-        },
+        }),
+        statements: None,
         characteristics: None,
     };
 
@@ -4592,24 +5614,26 @@ fn parse_create_after_update_trigger_with_condition() {
 fn parse_create_instead_of_delete_trigger() {
     let sql = "CREATE TRIGGER check_delete INSTEAD OF DELETE ON accounts FOR EACH ROW EXECUTE FUNCTION check_account_deletes";
     let expected = Statement::CreateTrigger {
+        or_alter: false,
         or_replace: false,
         is_constraint: false,
-        name: ObjectName(vec![Ident::new("check_delete")]),
+        name: ObjectName::from(vec![Ident::new("check_delete")]),
         period: TriggerPeriod::InsteadOf,
         events: vec![TriggerEvent::Delete],
-        table_name: ObjectName(vec![Ident::new("accounts")]),
+        table_name: ObjectName::from(vec![Ident::new("accounts")]),
         referenced_table_name: None,
         referencing: vec![],
         trigger_object: TriggerObject::Row,
         include_each: true,
         condition: None,
-        exec_body: TriggerExecBody {
+        exec_body: Some(TriggerExecBody {
             exec_type: TriggerExecBodyType::Function,
             func_desc: FunctionDesc {
-                name: ObjectName(vec![Ident::new("check_account_deletes")]),
+                name: ObjectName::from(vec![Ident::new("check_account_deletes")]),
                 args: None,
             },
-        },
+        }),
+        statements: None,
         characteristics: None,
     };
 
@@ -4620,28 +5644,30 @@ fn parse_create_instead_of_delete_trigger() {
 fn parse_create_trigger_with_multiple_events_and_deferrable() {
     let sql = "CREATE CONSTRAINT TRIGGER check_multiple_events BEFORE INSERT OR UPDATE OR DELETE ON accounts DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_account_changes";
     let expected = Statement::CreateTrigger {
+        or_alter: false,
         or_replace: false,
         is_constraint: true,
-        name: ObjectName(vec![Ident::new("check_multiple_events")]),
+        name: ObjectName::from(vec![Ident::new("check_multiple_events")]),
         period: TriggerPeriod::Before,
         events: vec![
             TriggerEvent::Insert,
             TriggerEvent::Update(vec![]),
             TriggerEvent::Delete,
         ],
-        table_name: ObjectName(vec![Ident::new("accounts")]),
+        table_name: ObjectName::from(vec![Ident::new("accounts")]),
         referenced_table_name: None,
         referencing: vec![],
         trigger_object: TriggerObject::Row,
         include_each: true,
         condition: None,
-        exec_body: TriggerExecBody {
+        exec_body: Some(TriggerExecBody {
             exec_type: TriggerExecBodyType::Function,
             func_desc: FunctionDesc {
-                name: ObjectName(vec![Ident::new("check_account_changes")]),
+                name: ObjectName::from(vec![Ident::new("check_account_changes")]),
                 args: None,
             },
-        },
+        }),
+        statements: None,
         characteristics: Some(ConstraintCharacteristics {
             deferrable: Some(true),
             initially: Some(DeferrableInitial::Deferred),
@@ -4656,35 +5682,37 @@ fn parse_create_trigger_with_multiple_events_and_deferrable() {
 fn parse_create_trigger_with_referencing() {
     let sql = "CREATE TRIGGER check_referencing BEFORE INSERT ON accounts REFERENCING NEW TABLE AS new_accounts OLD TABLE AS old_accounts FOR EACH ROW EXECUTE FUNCTION check_account_referencing";
     let expected = Statement::CreateTrigger {
+        or_alter: false,
         or_replace: false,
         is_constraint: false,
-        name: ObjectName(vec![Ident::new("check_referencing")]),
+        name: ObjectName::from(vec![Ident::new("check_referencing")]),
         period: TriggerPeriod::Before,
         events: vec![TriggerEvent::Insert],
-        table_name: ObjectName(vec![Ident::new("accounts")]),
+        table_name: ObjectName::from(vec![Ident::new("accounts")]),
         referenced_table_name: None,
         referencing: vec![
             TriggerReferencing {
                 refer_type: TriggerReferencingType::NewTable,
                 is_as: true,
-                transition_relation_name: ObjectName(vec![Ident::new("new_accounts")]),
+                transition_relation_name: ObjectName::from(vec![Ident::new("new_accounts")]),
             },
             TriggerReferencing {
                 refer_type: TriggerReferencingType::OldTable,
                 is_as: true,
-                transition_relation_name: ObjectName(vec![Ident::new("old_accounts")]),
+                transition_relation_name: ObjectName::from(vec![Ident::new("old_accounts")]),
             },
         ],
         trigger_object: TriggerObject::Row,
         include_each: true,
         condition: None,
-        exec_body: TriggerExecBody {
+        exec_body: Some(TriggerExecBody {
             exec_type: TriggerExecBodyType::Function,
             func_desc: FunctionDesc {
-                name: ObjectName(vec![Ident::new("check_account_referencing")]),
+                name: ObjectName::from(vec![Ident::new("check_account_referencing")]),
                 args: None,
             },
-        },
+        }),
+        statements: None,
         characteristics: None,
     };
 
@@ -4704,7 +5732,7 @@ fn parse_create_trigger_invalid_cases() {
         ),
         (
             "CREATE TRIGGER check_update TOMORROW UPDATE ON accounts EXECUTE FUNCTION check_account_update",
-            "Expected: one of BEFORE or AFTER or INSTEAD, found: TOMORROW"
+            "Expected: one of FOR or BEFORE or AFTER or INSTEAD, found: TOMORROW"
         ),
         (
             "CREATE TRIGGER check_update BEFORE SAVE ON accounts EXECUTE FUNCTION check_account_update",
@@ -4733,15 +5761,15 @@ fn parse_drop_trigger() {
                 "DROP TRIGGER{} check_update ON table_name{}",
                 if if_exists { " IF EXISTS" } else { "" },
                 option
-                    .map(|o| format!(" {}", o))
+                    .map(|o| format!(" {o}"))
                     .unwrap_or_else(|| "".to_string())
             );
             assert_eq!(
                 pg().verified_stmt(sql),
                 Statement::DropTrigger {
                     if_exists,
-                    trigger_name: ObjectName(vec![Ident::new("check_update")]),
-                    table_name: ObjectName(vec![Ident::new("table_name")]),
+                    trigger_name: ObjectName::from(vec![Ident::new("check_update")]),
+                    table_name: Some(ObjectName::from(vec![Ident::new("table_name")])),
                     option
                 }
             );
@@ -4827,8 +5855,7 @@ fn parse_trigger_related_functions() {
     // Now we parse the statements and check if they are parsed correctly.
     let mut statements = pg()
         .parse_sql_statements(&format!(
-            "{}{}{}{}",
-            sql_table_creation, sql_create_function, sql_create_trigger, sql_drop_trigger
+            "{sql_table_creation}{sql_create_function}{sql_create_trigger}{sql_drop_trigger}"
         ))
         .unwrap();
 
@@ -4854,30 +5881,27 @@ fn parse_trigger_related_functions() {
             if_not_exists: false,
             transient: false,
             volatile: false,
-            name: ObjectName(vec![Ident::new("emp")]),
+            iceberg: false,
+            name: ObjectName::from(vec![Ident::new("emp")]),
             columns: vec![
                 ColumnDef {
                     name: "empname".into(),
                     data_type: DataType::Text,
-                    collation: None,
                     options: vec![],
                 },
                 ColumnDef {
                     name: "salary".into(),
                     data_type: DataType::Integer(None),
-                    collation: None,
                     options: vec![],
                 },
                 ColumnDef {
                     name: "last_date".into(),
                     data_type: DataType::Timestamp(None, TimezoneInfo::None),
-                    collation: None,
                     options: vec![],
                 },
                 ColumnDef {
                     name: "last_user".into(),
                     data_type: DataType::Text,
-                    collation: None,
                     options: vec![],
                 },
             ],
@@ -4889,19 +5913,13 @@ fn parse_trigger_related_functions() {
                 storage: None,
                 location: None
             }),
-            table_properties: vec![],
-            with_options: vec![],
             file_format: None,
             location: None,
             query: None,
             without_rowid: false,
             like: None,
             clone: None,
-            engine: None,
             comment: None,
-            auto_increment_offset: None,
-            default_charset: None,
-            collation: None,
             on_commit: None,
             on_cluster: None,
             primary_key: None,
@@ -4909,7 +5927,7 @@ fn parse_trigger_related_functions() {
             partition_by: None,
             cluster_by: None,
             clustered_by: None,
-            options: None,
+            inherits: None,
             strict: false,
             copy_grants: false,
             enable_schema_evolution: None,
@@ -4920,6 +5938,12 @@ fn parse_trigger_related_functions() {
             with_aggregation_policy: None,
             with_row_access_policy: None,
             with_tags: None,
+            base_location: None,
+            external_volume: None,
+            catalog: None,
+            catalog_sync: None,
+            storage_serialization_policy: None,
+            table_options: CreateTableOptions::None
         }
     );
 
@@ -4927,16 +5951,17 @@ fn parse_trigger_related_functions() {
 
     assert_eq!(
         create_function,
-        Statement::CreateFunction {
+        Statement::CreateFunction(CreateFunction {
+            or_alter: false,
             or_replace: false,
             temporary: false,
             if_not_exists: false,
-            name: ObjectName(vec![Ident::new("emp_stamp")]),
-            args: None,
+            name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+            args: Some(vec![]),
             return_type: Some(DataType::Trigger),
             function_body: Some(
                 CreateFunctionBody::AsBeforeOptions(
-                    Expr::Value(
+                    Expr::Value((
                         Value::DollarQuotedString(
                             DollarQuotedString {
                                 value: "\n        BEGIN\n            -- Check that empname and salary are given\n            IF NEW.empname IS NULL THEN\n                RAISE EXCEPTION 'empname cannot be null';\n            END IF;\n            IF NEW.salary IS NULL THEN\n                RAISE EXCEPTION '% cannot have null salary', NEW.empname;\n            END IF;\n\n            -- Who works for us when they must pay for it?\n            IF NEW.salary < 0 THEN\n                RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;\n            END IF;\n\n            -- Remember who changed the payroll when\n            NEW.last_date := current_timestamp;\n            NEW.last_user := current_user;\n            RETURN NEW;\n        END;\n    ".to_owned(),
@@ -4944,8 +5969,8 @@ fn parse_trigger_related_functions() {
                                     "emp_stamp".to_owned(),
                                 ),
                             },
-                        ),
-                    ),
+                        )
+                    ).with_empty_span()),
                 ),
             ),
             behavior: None,
@@ -4957,31 +5982,33 @@ fn parse_trigger_related_functions() {
             options: None,
             remote_connection: None
         }
-    );
+    ));
 
     // Check the third statement
 
     assert_eq!(
         create_trigger,
         Statement::CreateTrigger {
+            or_alter: false,
             or_replace: false,
             is_constraint: false,
-            name: ObjectName(vec![Ident::new("emp_stamp")]),
+            name: ObjectName::from(vec![Ident::new("emp_stamp")]),
             period: TriggerPeriod::Before,
             events: vec![TriggerEvent::Insert, TriggerEvent::Update(vec![])],
-            table_name: ObjectName(vec![Ident::new("emp")]),
+            table_name: ObjectName::from(vec![Ident::new("emp")]),
             referenced_table_name: None,
             referencing: vec![],
             trigger_object: TriggerObject::Row,
             include_each: true,
             condition: None,
-            exec_body: TriggerExecBody {
+            exec_body: Some(TriggerExecBody {
                 exec_type: TriggerExecBodyType::Function,
                 func_desc: FunctionDesc {
-                    name: ObjectName(vec![Ident::new("emp_stamp")]),
+                    name: ObjectName::from(vec![Ident::new("emp_stamp")]),
                     args: None,
                 }
-            },
+            }),
+            statements: None,
             characteristics: None
         }
     );
@@ -4991,8 +6018,8 @@ fn parse_trigger_related_functions() {
         drop_trigger,
         Statement::DropTrigger {
             if_exists: false,
-            trigger_name: ObjectName(vec![Ident::new("emp_stamp")]),
-            table_name: ObjectName(vec![Ident::new("emp")]),
+            trigger_name: ObjectName::from(vec![Ident::new("emp_stamp")]),
+            table_name: Some(ObjectName::from(vec![Ident::new("emp")])),
             option: None
         }
     );
@@ -5012,7 +6039,10 @@ fn test_unicode_string_literal() {
     ];
     for (input, expected) in pairs {
         match pg_and_generic().verified_expr(input) {
-            Expr::Value(Value::UnicodeStringLiteral(s)) => {
+            Expr::Value(ValueWithSpan {
+                value: Value::UnicodeStringLiteral(s),
+                span: _,
+            }) => {
                 assert_eq!(expected, s);
             }
             _ => unreachable!(),
@@ -5028,12 +6058,17 @@ fn check_arrow_precedence(sql: &str, arrow_operator: BinaryOperator) {
                 left: Box::new(Expr::Identifier(Ident {
                     value: "foo".to_string(),
                     quote_style: None,
+                    span: Span::empty(),
                 })),
                 op: arrow_operator,
-                right: Box::new(Expr::Value(Value::SingleQuotedString("bar".to_string()))),
+                right: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("bar".to_string())).with_empty_span()
+                )),
             }),
             op: BinaryOperator::Eq,
-            right: Box::new(Expr::Value(Value::SingleQuotedString("spam".to_string()))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("spam".to_string())).with_empty_span()
+            )),
         }
     )
 }
@@ -5058,11 +6093,14 @@ fn arrow_cast_precedence() {
             left: Box::new(Expr::Identifier(Ident {
                 value: "foo".to_string(),
                 quote_style: None,
+                span: Span::empty(),
             })),
             op: BinaryOperator::Arrow,
             right: Box::new(Expr::Cast {
                 kind: CastKind::DoubleColon,
-                expr: Box::new(Expr::Value(Value::SingleQuotedString("bar".to_string()))),
+                expr: Box::new(Expr::Value(
+                    (Value::SingleQuotedString("bar".to_string())).with_empty_span()
+                )),
                 data_type: DataType::Text,
                 format: None,
             }),
@@ -5072,15 +6110,8 @@ fn arrow_cast_precedence() {
 
 #[test]
 fn parse_create_type_as_enum() {
-    let statement = pg().one_statement_parses_to(
-        r#"CREATE TYPE public.my_type AS ENUM (
-            'label1',
-            'label2',
-            'label3',
-            'label4'
-        );"#,
-        "CREATE TYPE public.my_type AS ENUM ('label1', 'label2', 'label3', 'label4')",
-    );
+    let sql = "CREATE TYPE public.my_type AS ENUM ('label1', 'label2', 'label3', 'label4')";
+    let statement = pg_and_generic().verified_stmt(sql);
     match statement {
         Statement::CreateType {
             name,
@@ -5095,8 +6126,99 @@ fn parse_create_type_as_enum() {
                 labels
             );
         }
-        _ => unreachable!(),
+        _ => unreachable!("{:?} should parse to Statement::CreateType", sql),
+    }
+}
+
+#[test]
+fn parse_alter_type() {
+    struct TestCase {
+        sql: &'static str,
+        name: &'static str,
+        operation: AlterTypeOperation,
     }
+    vec![
+        TestCase {
+            sql: "ALTER TYPE public.my_type RENAME TO my_new_type",
+            name: "public.my_type",
+            operation: AlterTypeOperation::Rename(AlterTypeRename {
+                new_name: Ident::new("my_new_type"),
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE IF NOT EXISTS 'label3.5' BEFORE 'label4'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: true,
+                value: Ident::with_quote('\'', "label3.5"),
+                position: Some(AlterTypeAddValuePosition::Before(Ident::with_quote(
+                    '\'', "label4",
+                ))),
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE 'label3.5' BEFORE 'label4'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: false,
+                value: Ident::with_quote('\'', "label3.5"),
+                position: Some(AlterTypeAddValuePosition::Before(Ident::with_quote(
+                    '\'', "label4",
+                ))),
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE IF NOT EXISTS 'label3.5' AFTER 'label3'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: true,
+                value: Ident::with_quote('\'', "label3.5"),
+                position: Some(AlterTypeAddValuePosition::After(Ident::with_quote(
+                    '\'', "label3",
+                ))),
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE 'label3.5' AFTER 'label3'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: false,
+                value: Ident::with_quote('\'', "label3.5"),
+                position: Some(AlterTypeAddValuePosition::After(Ident::with_quote(
+                    '\'', "label3",
+                ))),
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE IF NOT EXISTS 'label5'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: true,
+                value: Ident::with_quote('\'', "label5"),
+                position: None,
+            }),
+        },
+        TestCase {
+            sql: "ALTER TYPE public.my_type ADD VALUE 'label5'",
+            name: "public.my_type",
+            operation: AlterTypeOperation::AddValue(AlterTypeAddValue {
+                if_not_exists: false,
+                value: Ident::with_quote('\'', "label5"),
+                position: None,
+            }),
+        },
+    ]
+    .into_iter()
+    .enumerate()
+    .for_each(|(index, tc)| {
+        let statement = pg_and_generic().verified_stmt(tc.sql);
+        if let Statement::AlterType(AlterType { name, operation }) = statement {
+            assert_eq!(tc.name, name.to_string(), "TestCase[{index}].name");
+            assert_eq!(tc.operation, operation, "TestCase[{index}].operation");
+        } else {
+            unreachable!("{:?} should parse to Statement::AlterType", tc.sql);
+        }
+    });
 }
 
 #[test]
@@ -5105,7 +6227,208 @@ fn parse_bitstring_literal() {
     assert_eq!(
         select.projection,
         vec![SelectItem::UnnamedExpr(Expr::Value(
-            Value::SingleQuotedByteStringLiteral("111".to_string())
+            (Value::SingleQuotedByteStringLiteral("111".to_string())).with_empty_span()
         ))]
     );
 }
+
+#[test]
+fn parse_varbit_datatype() {
+    match pg_and_generic().verified_stmt("CREATE TABLE foo (x VARBIT, y VARBIT(42))") {
+        Statement::CreateTable(CreateTable { columns, .. }) => {
+            assert_eq!(
+                columns,
+                vec![
+                    ColumnDef {
+                        name: "x".into(),
+                        data_type: DataType::VarBit(None),
+                        options: vec![],
+                    },
+                    ColumnDef {
+                        name: "y".into(),
+                        data_type: DataType::VarBit(Some(42)),
+                        options: vec![],
+                    }
+                ]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_alter_table_replica_identity() {
+    match pg_and_generic().verified_stmt("ALTER TABLE foo REPLICA IDENTITY FULL") {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![AlterTableOperation::ReplicaIdentity {
+                    identity: ReplicaIdentity::Full
+                }]
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    match pg_and_generic().verified_stmt("ALTER TABLE foo REPLICA IDENTITY USING INDEX foo_idx") {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![AlterTableOperation::ReplicaIdentity {
+                    identity: ReplicaIdentity::Index("foo_idx".into())
+                }]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_ts_datatypes() {
+    match pg_and_generic().verified_stmt("CREATE TABLE foo (x TSVECTOR)") {
+        Statement::CreateTable(CreateTable { columns, .. }) => {
+            assert_eq!(
+                columns,
+                vec![ColumnDef {
+                    name: "x".into(),
+                    data_type: DataType::TsVector,
+                    options: vec![],
+                }]
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    match pg_and_generic().verified_stmt("CREATE TABLE foo (x TSQUERY)") {
+        Statement::CreateTable(CreateTable { columns, .. }) => {
+            assert_eq!(
+                columns,
+                vec![ColumnDef {
+                    name: "x".into(),
+                    data_type: DataType::TsQuery,
+                    options: vec![],
+                }]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_alter_table_constraint_not_valid() {
+    match pg_and_generic().verified_stmt(
+        "ALTER TABLE foo ADD CONSTRAINT bar FOREIGN KEY (baz) REFERENCES other(ref) NOT VALID",
+    ) {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![AlterTableOperation::AddConstraint {
+                    constraint: TableConstraint::ForeignKey {
+                        name: Some("bar".into()),
+                        index_name: None,
+                        columns: vec!["baz".into()],
+                        foreign_table: ObjectName::from(vec!["other".into()]),
+                        referred_columns: vec!["ref".into()],
+                        on_delete: None,
+                        on_update: None,
+                        characteristics: None,
+                    },
+                    not_valid: true,
+                }]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_alter_table_validate_constraint() {
+    match pg_and_generic().verified_stmt("ALTER TABLE foo VALIDATE CONSTRAINT bar") {
+        Statement::AlterTable { operations, .. } => {
+            assert_eq!(
+                operations,
+                vec![AlterTableOperation::ValidateConstraint { name: "bar".into() }]
+            );
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn parse_create_server() {
+    let test_cases = vec![
+        (
+            "CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw",
+            CreateServerStatement {
+                name: ObjectName::from(vec!["myserver".into()]),
+                if_not_exists: false,
+                server_type: None,
+                version: None,
+                foreign_data_wrapper: ObjectName::from(vec!["postgres_fdw".into()]),
+                options: None,
+            },
+        ),
+        (
+            "CREATE SERVER IF NOT EXISTS myserver TYPE 'server_type' VERSION 'server_version' FOREIGN DATA WRAPPER postgres_fdw",
+            CreateServerStatement {
+            name: ObjectName::from(vec!["myserver".into()]),
+            if_not_exists: true,
+            server_type: Some(Ident {
+                value: "server_type".to_string(),
+                quote_style: Some('\''),
+                span: Span::empty(),
+            }),
+            version: Some(Ident {
+                value: "server_version".to_string(),
+                quote_style: Some('\''),
+                span: Span::empty(),
+            }),
+            foreign_data_wrapper: ObjectName::from(vec!["postgres_fdw".into()]),
+            options: None,
+        }
+        ),
+        (
+            "CREATE SERVER myserver2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432')",
+            CreateServerStatement {
+                name: ObjectName::from(vec!["myserver2".into()]),
+                if_not_exists: false,
+                server_type: None,
+                version: None,
+                foreign_data_wrapper: ObjectName::from(vec!["postgres_fdw".into()]),
+                options: Some(vec![
+                    CreateServerOption {
+                        key: "host".into(),
+                        value: Ident {
+                            value: "foo".to_string(),
+                            quote_style: Some('\''),
+                            span: Span::empty(),
+                        },
+                    },
+                    CreateServerOption {
+                        key: "dbname".into(),
+                        value: Ident {
+                            value: "foodb".to_string(),
+                            quote_style: Some('\''),
+                            span: Span::empty(),
+                        },
+                    },
+                    CreateServerOption {
+                        key: "port".into(),
+                        value: Ident {
+                            value: "5432".to_string(),
+                            quote_style: Some('\''),
+                            span: Span::empty(),
+                        },
+                    },
+                ]),
+            }
+        )
+    ];
+
+    for (sql, expected) in test_cases {
+        let Statement::CreateServer(stmt) = pg_and_generic().verified_stmt(sql) else {
+            unreachable!()
+        };
+        assert_eq!(stmt, expected);
+    }
+}
diff --git a/tests/sqlparser_redshift.rs b/tests/sqlparser_redshift.rs
index a25d50605..d539adf66 100644
--- a/tests/sqlparser_redshift.rs
+++ b/tests/sqlparser_redshift.rs
@@ -18,6 +18,7 @@
 #[macro_use]
 mod test_utils;
 
+use sqlparser::tokenizer::Span;
 use test_utils::*;
 
 use sqlparser::ast::*;
@@ -31,30 +32,25 @@ fn test_square_brackets_over_db_schema_table_name() {
         select.projection[0],
         SelectItem::UnnamedExpr(Expr::Identifier(Ident {
             value: "col1".to_string(),
-            quote_style: Some('[')
+            quote_style: Some('['),
+            span: Span::empty(),
         })),
     );
     assert_eq!(
         select.from[0],
         TableWithJoins {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![
-                    Ident {
-                        value: "test_schema".to_string(),
-                        quote_style: Some('[')
-                    },
-                    Ident {
-                        value: "test_table".to_string(),
-                        quote_style: Some('[')
-                    }
-                ]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![
+                Ident {
+                    value: "test_schema".to_string(),
+                    quote_style: Some('['),
+                    span: Span::empty(),
+                },
+                Ident {
+                    value: "test_table".to_string(),
+                    quote_style: Some('['),
+                    span: Span::empty(),
+                }
+            ])),
             joins: vec![],
         }
     );
@@ -78,30 +74,25 @@ fn test_double_quotes_over_db_schema_table_name() {
         select.projection[0],
         SelectItem::UnnamedExpr(Expr::Identifier(Ident {
             value: "col1".to_string(),
-            quote_style: Some('"')
+            quote_style: Some('"'),
+            span: Span::empty(),
         })),
     );
     assert_eq!(
         select.from[0],
         TableWithJoins {
-            relation: TableFactor::Table {
-                name: ObjectName(vec![
-                    Ident {
-                        value: "test_schema".to_string(),
-                        quote_style: Some('"')
-                    },
-                    Ident {
-                        value: "test_table".to_string(),
-                        quote_style: Some('"')
-                    }
-                ]),
-                alias: None,
-                args: None,
-                with_hints: vec![],
-                version: None,
-                partitions: vec![],
-                with_ordinality: false,
-            },
+            relation: table_from_name(ObjectName::from(vec![
+                Ident {
+                    value: "test_schema".to_string(),
+                    quote_style: Some('"'),
+                    span: Span::empty(),
+                },
+                Ident {
+                    value: "test_table".to_string(),
+                    quote_style: Some('"'),
+                    span: Span::empty(),
+                }
+            ])),
             joins: vec![],
         }
     );
@@ -121,10 +112,12 @@ fn parse_delimited_identifiers() {
             args,
             with_hints,
             version,
-            with_ordinality: _,
-            partitions: _,
+            ..
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -143,7 +136,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -166,6 +160,8 @@ fn parse_delimited_identifiers() {
     }
 
     redshift().verified_stmt(r#"CREATE TABLE "foo" ("bar" "int")"#);
+    // An alias starting with a number
+    redshift().verified_stmt(r#"CREATE TABLE "foo" ("1" INT)"#);
     redshift().verified_stmt(r#"ALTER TABLE foo ADD CONSTRAINT "bar" PRIMARY KEY (baz)"#);
     //TODO verified_stmt(r#"UPDATE foo SET "bar" = 5"#);
 }
@@ -196,3 +192,218 @@ fn test_create_view_with_no_schema_binding() {
     redshift_and_generic()
         .verified_stmt("CREATE VIEW myevent AS SELECT eventname FROM event WITH NO SCHEMA BINDING");
 }
+
+#[test]
+fn test_redshift_json_path() {
+    let dialects = all_dialects_where(|d| d.supports_partiql());
+    let sql = "SELECT cust.c_orders[0].o_orderkey FROM customer_orders_lineitem";
+    let select = dialects.verified_only_select(sql);
+
+    assert_eq!(
+        &Expr::JsonAccess {
+            value: Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("cust"),
+                Ident::new("c_orders")
+            ])),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Bracket {
+                        key: Expr::value(number("0"))
+                    },
+                    JsonPathElem::Dot {
+                        key: "o_orderkey".to_string(),
+                        quoted: false
+                    }
+                ]
+            }
+        },
+        expr_from_projection(only(&select.projection))
+    );
+
+    let sql = "SELECT cust.c_orders[0]['id'] FROM customer_orders_lineitem";
+    let select = dialects.verified_only_select(sql);
+    assert_eq!(
+        &Expr::JsonAccess {
+            value: Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("cust"),
+                Ident::new("c_orders")
+            ])),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Bracket {
+                        key: Expr::value(number("0"))
+                    },
+                    JsonPathElem::Bracket {
+                        key: Expr::Value(
+                            (Value::SingleQuotedString("id".to_owned())).with_empty_span()
+                        )
+                    }
+                ]
+            }
+        },
+        expr_from_projection(only(&select.projection))
+    );
+
+    let sql = "SELECT db1.sc1.tbl1.col1[0]['id'] FROM customer_orders_lineitem";
+    let select = dialects.verified_only_select(sql);
+    assert_eq!(
+        &Expr::JsonAccess {
+            value: Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("db1"),
+                Ident::new("sc1"),
+                Ident::new("tbl1"),
+                Ident::new("col1")
+            ])),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Bracket {
+                        key: Expr::value(number("0"))
+                    },
+                    JsonPathElem::Bracket {
+                        key: Expr::Value(
+                            (Value::SingleQuotedString("id".to_owned())).with_empty_span()
+                        )
+                    }
+                ]
+            }
+        },
+        expr_from_projection(only(&select.projection))
+    );
+
+    let sql = r#"SELECT db1.sc1.tbl1.col1[0]."id" FROM customer_orders_lineitem"#;
+    let select = dialects.verified_only_select(sql);
+    assert_eq!(
+        &Expr::JsonAccess {
+            value: Box::new(Expr::CompoundIdentifier(vec![
+                Ident::new("db1"),
+                Ident::new("sc1"),
+                Ident::new("tbl1"),
+                Ident::new("col1")
+            ])),
+            path: JsonPath {
+                path: vec![
+                    JsonPathElem::Bracket {
+                        key: Expr::value(number("0"))
+                    },
+                    JsonPathElem::Dot {
+                        key: "id".to_string(),
+                        quoted: true,
+                    }
+                ]
+            }
+        },
+        expr_from_projection(only(&select.projection))
+    );
+}
+
+#[test]
+fn test_parse_json_path_from() {
+    let dialects = all_dialects_where(|d| d.supports_partiql());
+    let select = dialects.verified_only_select("SELECT * FROM src[0].a AS a");
+    match &select.from[0].relation {
+        TableFactor::Table {
+            name, json_path, ..
+        } => {
+            assert_eq!(name, &ObjectName::from(vec![Ident::new("src")]));
+            assert_eq!(
+                json_path,
+                &Some(JsonPath {
+                    path: vec![
+                        JsonPathElem::Bracket {
+                            key: Expr::value(number("0"))
+                        },
+                        JsonPathElem::Dot {
+                            key: "a".to_string(),
+                            quoted: false
+                        }
+                    ]
+                })
+            );
+        }
+        _ => panic!(),
+    }
+
+    let select = dialects.verified_only_select("SELECT * FROM src[0].a[1].b AS a");
+    match &select.from[0].relation {
+        TableFactor::Table {
+            name, json_path, ..
+        } => {
+            assert_eq!(name, &ObjectName::from(vec![Ident::new("src")]));
+            assert_eq!(
+                json_path,
+                &Some(JsonPath {
+                    path: vec![
+                        JsonPathElem::Bracket {
+                            key: Expr::value(number("0"))
+                        },
+                        JsonPathElem::Dot {
+                            key: "a".to_string(),
+                            quoted: false
+                        },
+                        JsonPathElem::Bracket {
+                            key: Expr::Value(
+                                (Value::Number("1".parse().unwrap(), false)).with_empty_span()
+                            )
+                        },
+                        JsonPathElem::Dot {
+                            key: "b".to_string(),
+                            quoted: false
+                        },
+                    ]
+                })
+            );
+        }
+        _ => panic!(),
+    }
+
+    let select = dialects.verified_only_select("SELECT * FROM src.a.b");
+    match &select.from[0].relation {
+        TableFactor::Table {
+            name, json_path, ..
+        } => {
+            assert_eq!(
+                name,
+                &ObjectName::from(vec![Ident::new("src"), Ident::new("a"), Ident::new("b")])
+            );
+            assert_eq!(json_path, &None);
+        }
+        _ => panic!(),
+    }
+}
+
+#[test]
+fn test_parse_select_numbered_columns() {
+    // An alias starting with a number
+    redshift_and_generic().verified_stmt(r#"SELECT 1 AS "1" FROM a"#);
+    redshift_and_generic().verified_stmt(r#"SELECT 1 AS "1abc" FROM a"#);
+}
+
+#[test]
+fn test_parse_nested_quoted_identifier() {
+    redshift().verified_stmt(r#"SELECT 1 AS ["1"] FROM a"#);
+    redshift().verified_stmt(r#"SELECT 1 AS ["[="] FROM a"#);
+    redshift().verified_stmt(r#"SELECT 1 AS ["=]"] FROM a"#);
+    redshift().verified_stmt(r#"SELECT 1 AS ["a[b]"] FROM a"#);
+    // trim spaces
+    redshift().one_statement_parses_to(r#"SELECT 1 AS [ " 1 " ]"#, r#"SELECT 1 AS [" 1 "]"#);
+    // invalid query
+    assert!(redshift()
+        .parse_sql_statements(r#"SELECT 1 AS ["1]"#)
+        .is_err());
+}
+
+#[test]
+fn parse_extract_single_quotes() {
+    let sql = "SELECT EXTRACT('month' FROM my_timestamp) FROM my_table";
+    redshift().verified_stmt(sql);
+}
+
+#[test]
+fn parse_string_literal_backslash_escape() {
+    redshift().one_statement_parses_to(r#"SELECT 'l\'auto'"#, "SELECT 'l''auto'");
+}
+
+#[test]
+fn parse_utf8_multibyte_idents() {
+    redshift().verified_stmt("SELECT 🚀.city AS 🎸 FROM customers AS 🚀");
+}
diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs
index 1f1c00e7a..eb4bda7bd 100644
--- a/tests/sqlparser_snowflake.rs
+++ b/tests/sqlparser_snowflake.rs
@@ -19,9 +19,8 @@
 //! Test SQL syntax specific to Snowflake. The parser based on the
 //! generic dialect is also tested (on the inputs it can handle).
 
-use sqlparser::ast::helpers::stmt_data_loading::{
-    DataLoadingOption, DataLoadingOptionType, StageLoadSelectItem,
-};
+use sqlparser::ast::helpers::key_value_options::{KeyValueOption, KeyValueOptionType};
+use sqlparser::ast::helpers::stmt_data_loading::{StageLoadSelectItem, StageLoadSelectItemKind};
 use sqlparser::ast::*;
 use sqlparser::dialect::{Dialect, GenericDialect, SnowflakeDialect};
 use sqlparser::parser::{ParserError, ParserOptions};
@@ -271,8 +270,8 @@ fn test_snowflake_create_table_with_tag() {
             assert_eq!("my_table", name.to_string());
             assert_eq!(
                 Some(vec![
-                    Tag::new("A".into(), "TAG A".to_string()),
-                    Tag::new("B".into(), "TAG B".to_string())
+                    Tag::new(ObjectName::from(vec![Ident::new("A")]), "TAG A".to_string()),
+                    Tag::new(ObjectName::from(vec![Ident::new("B")]), "TAG B".to_string())
                 ]),
                 with_tags
             );
@@ -292,8 +291,8 @@ fn test_snowflake_create_table_with_tag() {
             assert_eq!("my_table", name.to_string());
             assert_eq!(
                 Some(vec![
-                    Tag::new("A".into(), "TAG A".to_string()),
-                    Tag::new("B".into(), "TAG B".to_string())
+                    Tag::new(ObjectName::from(vec![Ident::new("A")]), "TAG A".to_string()),
+                    Tag::new(ObjectName::from(vec![Ident::new("B")]), "TAG B".to_string())
                 ]),
                 with_tags
             );
@@ -346,7 +345,6 @@ fn test_snowflake_create_table_column_comment() {
                         name: None,
                         option: ColumnOption::Comment("some comment".to_string())
                     }],
-                    collation: None
                 }],
                 columns
             )
@@ -355,6 +353,15 @@ fn test_snowflake_create_table_column_comment() {
     }
 }
 
+#[test]
+fn test_snowflake_create_table_on_commit() {
+    snowflake().verified_stmt(
+        r#"CREATE LOCAL TEMPORARY TABLE "AAA"."foo" ("bar" INTEGER) ON COMMIT PRESERVE ROWS"#,
+    );
+    snowflake().verified_stmt(r#"CREATE TABLE "AAA"."foo" ("bar" INTEGER) ON COMMIT DELETE ROWS"#);
+    snowflake().verified_stmt(r#"CREATE TABLE "AAA"."foo" ("bar" INTEGER) ON COMMIT DROP"#);
+}
+
 #[test]
 fn test_snowflake_create_local_table() {
     match snowflake().verified_stmt("CREATE TABLE my_table (a INT)") {
@@ -439,19 +446,56 @@ fn test_snowflake_create_table_if_not_exists() {
         }
         _ => unreachable!(),
     }
+
+    for (sql, parse_to) in [
+        (
+            r#"CREATE TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+            r#"CREATE TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+        ),
+        (
+            r#"CREATE TABLE "A"."B"."C" IF NOT EXISTS (v VARIANT)"#,
+            r#"CREATE TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+        ),
+        (
+            r#"CREATE TRANSIENT TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+            r#"CREATE TRANSIENT TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+        ),
+        (
+            r#"CREATE TRANSIENT TABLE "A"."B"."C" IF NOT EXISTS (v VARIANT)"#,
+            r#"CREATE TRANSIENT TABLE IF NOT EXISTS "A"."B"."C" (v VARIANT)"#,
+        ),
+    ] {
+        snowflake().one_statement_parses_to(sql, parse_to);
+    }
 }
 
 #[test]
 fn test_snowflake_create_table_cluster_by() {
-    match snowflake().verified_stmt("CREATE TABLE my_table (a INT) CLUSTER BY (a, b)") {
+    match snowflake().verified_stmt("CREATE TABLE my_table (a INT) CLUSTER BY (a, b, my_func(c))") {
         Statement::CreateTable(CreateTable {
             name, cluster_by, ..
         }) => {
             assert_eq!("my_table", name.to_string());
             assert_eq!(
                 Some(WrappedCollection::Parentheses(vec![
-                    Ident::new("a"),
-                    Ident::new("b"),
+                    Expr::Identifier(Ident::new("a")),
+                    Expr::Identifier(Ident::new("b")),
+                    Expr::Function(Function {
+                        name: ObjectName::from(vec![Ident::new("my_func")]),
+                        uses_odbc_syntax: false,
+                        parameters: FunctionArguments::None,
+                        args: FunctionArguments::List(FunctionArgumentList {
+                            args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
+                                Expr::Identifier(Ident::new("c"))
+                            ))],
+                            duplicate_treatment: None,
+                            clauses: vec![],
+                        }),
+                        filter: None,
+                        null_treatment: None,
+                        over: None,
+                        within_group: vec![],
+                    }),
                 ])),
                 cluster_by
             )
@@ -463,9 +507,22 @@ fn test_snowflake_create_table_cluster_by() {
 #[test]
 fn test_snowflake_create_table_comment() {
     match snowflake().verified_stmt("CREATE TABLE my_table (a INT) COMMENT = 'some comment'") {
-        Statement::CreateTable(CreateTable { name, comment, .. }) => {
+        Statement::CreateTable(CreateTable {
+            name,
+            table_options,
+            ..
+        }) => {
             assert_eq!("my_table", name.to_string());
-            assert_eq!("some comment", comment.unwrap().to_string());
+            let plain_options = match table_options {
+                CreateTableOptions::Plain(options) => options,
+                _ => unreachable!(),
+            };
+            let comment = match plain_options.first().unwrap() {
+                SqlOption::Comment(CommentDef::WithEq(c))
+                | SqlOption::Comment(CommentDef::WithoutEq(c)) => c,
+                _ => unreachable!(),
+            };
+            assert_eq!("some comment", comment);
         }
         _ => unreachable!(),
     }
@@ -544,7 +601,6 @@ fn test_snowflake_create_table_with_autoincrement_columns() {
                     ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Identity(IdentityPropertyKind::Autoincrement(
@@ -558,15 +614,14 @@ fn test_snowflake_create_table_with_autoincrement_columns() {
                     ColumnDef {
                         name: "b".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Identity(IdentityPropertyKind::Autoincrement(
                                 IdentityProperty {
                                     parameters: Some(IdentityPropertyFormatKind::FunctionCall(
                                         IdentityParameters {
-                                            seed: Expr::Value(number("100")),
-                                            increment: Expr::Value(number("1")),
+                                            seed: Expr::value(number("100")),
+                                            increment: Expr::value(number("1")),
                                         }
                                     )),
                                     order: Some(IdentityPropertyOrder::NoOrder),
@@ -577,7 +632,6 @@ fn test_snowflake_create_table_with_autoincrement_columns() {
                     ColumnDef {
                         name: "c".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Identity(IdentityPropertyKind::Identity(
@@ -591,7 +645,6 @@ fn test_snowflake_create_table_with_autoincrement_columns() {
                     ColumnDef {
                         name: "d".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Identity(IdentityPropertyKind::Identity(
@@ -599,8 +652,12 @@ fn test_snowflake_create_table_with_autoincrement_columns() {
                                     parameters: Some(
                                         IdentityPropertyFormatKind::StartAndIncrement(
                                             IdentityParameters {
-                                                seed: Expr::Value(number("100")),
-                                                increment: Expr::Value(number("1")),
+                                                seed: Expr::Value(
+                                                    (number("100")).with_empty_span()
+                                                ),
+                                                increment: Expr::Value(
+                                                    (number("1")).with_empty_span()
+                                                ),
                                             }
                                         )
                                     ),
@@ -625,8 +682,12 @@ fn test_snowflake_create_table_with_collated_column() {
                 vec![ColumnDef {
                     name: "a".into(),
                     data_type: DataType::Text,
-                    collation: Some(ObjectName(vec![Ident::with_quote('\'', "de_DE")])),
-                    options: vec![]
+                    options: vec![ColumnOptionDef {
+                        name: None,
+                        option: ColumnOption::Collation(ObjectName::from(vec![Ident::with_quote(
+                            '\'', "de_DE"
+                        )])),
+                    }]
                 },]
             );
         }
@@ -665,13 +726,12 @@ fn test_snowflake_create_table_with_columns_masking_policy() {
                     vec![ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Policy(ColumnPolicy::MaskingPolicy(
                                 ColumnPolicyProperty {
                                     with,
-                                    policy_name: "p".into(),
+                                    policy_name: ObjectName::from(vec![Ident::new("p")]),
                                     using_columns,
                                 }
                             ))
@@ -700,13 +760,12 @@ fn test_snowflake_create_table_with_columns_projection_policy() {
                     vec![ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Policy(ColumnPolicy::ProjectionPolicy(
                                 ColumnPolicyProperty {
                                     with,
-                                    policy_name: "p".into(),
+                                    policy_name: ObjectName::from(vec![Ident::new("p")]),
                                     using_columns: None,
                                 }
                             ))
@@ -738,14 +797,19 @@ fn test_snowflake_create_table_with_columns_tags() {
                     vec![ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![ColumnOptionDef {
                             name: None,
                             option: ColumnOption::Tags(TagsColumnOption {
                                 with,
                                 tags: vec![
-                                    Tag::new("A".into(), "TAG A".into()),
-                                    Tag::new("B".into(), "TAG B".into()),
+                                    Tag::new(
+                                        ObjectName::from(vec![Ident::new("A")]),
+                                        "TAG A".into()
+                                    ),
+                                    Tag::new(
+                                        ObjectName::from(vec![Ident::new("B")]),
+                                        "TAG B".into()
+                                    ),
                                 ]
                             }),
                         }],
@@ -773,7 +837,6 @@ fn test_snowflake_create_table_with_several_column_options() {
                     ColumnDef {
                         name: "a".into(),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![
                             ColumnOptionDef {
                                 name: None,
@@ -789,7 +852,7 @@ fn test_snowflake_create_table_with_several_column_options() {
                                 option: ColumnOption::Policy(ColumnPolicy::MaskingPolicy(
                                     ColumnPolicyProperty {
                                         with: true,
-                                        policy_name: "p1".into(),
+                                        policy_name: ObjectName::from(vec![Ident::new("p1")]),
                                         using_columns: Some(vec!["a".into(), "b".into()]),
                                     }
                                 )),
@@ -799,8 +862,14 @@ fn test_snowflake_create_table_with_several_column_options() {
                                 option: ColumnOption::Tags(TagsColumnOption {
                                     with: true,
                                     tags: vec![
-                                        Tag::new("A".into(), "TAG A".into()),
-                                        Tag::new("B".into(), "TAG B".into()),
+                                        Tag::new(
+                                            ObjectName::from(vec![Ident::new("A")]),
+                                            "TAG A".into()
+                                        ),
+                                        Tag::new(
+                                            ObjectName::from(vec![Ident::new("B")]),
+                                            "TAG B".into()
+                                        ),
                                     ]
                                 }),
                             }
@@ -809,14 +878,19 @@ fn test_snowflake_create_table_with_several_column_options() {
                     ColumnDef {
                         name: "b".into(),
                         data_type: DataType::Text,
-                        collation: Some(ObjectName(vec![Ident::with_quote('\'', "de_DE")])),
                         options: vec![
+                            ColumnOptionDef {
+                                name: None,
+                                option: ColumnOption::Collation(ObjectName::from(vec![
+                                    Ident::with_quote('\'', "de_DE")
+                                ])),
+                            },
                             ColumnOptionDef {
                                 name: None,
                                 option: ColumnOption::Policy(ColumnPolicy::ProjectionPolicy(
                                     ColumnPolicyProperty {
                                         with: false,
-                                        policy_name: "p2".into(),
+                                        policy_name: ObjectName::from(vec![Ident::new("p2")]),
                                         using_columns: None,
                                     }
                                 )),
@@ -826,8 +900,14 @@ fn test_snowflake_create_table_with_several_column_options() {
                                 option: ColumnOption::Tags(TagsColumnOption {
                                     with: false,
                                     tags: vec![
-                                        Tag::new("C".into(), "TAG C".into()),
-                                        Tag::new("D".into(), "TAG D".into()),
+                                        Tag::new(
+                                            ObjectName::from(vec![Ident::new("C")]),
+                                            "TAG C".into()
+                                        ),
+                                        Tag::new(
+                                            ObjectName::from(vec![Ident::new("D")]),
+                                            "TAG D".into()
+                                        ),
                                     ]
                                 }),
                             }
@@ -840,6 +920,126 @@ fn test_snowflake_create_table_with_several_column_options() {
     }
 }
 
+#[test]
+fn test_snowflake_create_iceberg_table_all_options() {
+    match snowflake().verified_stmt("CREATE ICEBERG TABLE my_table (a INT, b INT) \
+    CLUSTER BY (a, b) EXTERNAL_VOLUME = 'volume' CATALOG = 'SNOWFLAKE' BASE_LOCATION = 'relative/path' CATALOG_SYNC = 'OPEN_CATALOG' \
+    STORAGE_SERIALIZATION_POLICY = COMPATIBLE COPY GRANTS CHANGE_TRACKING=TRUE DATA_RETENTION_TIME_IN_DAYS=5 MAX_DATA_EXTENSION_TIME_IN_DAYS=10 \
+    WITH AGGREGATION POLICY policy_name WITH ROW ACCESS POLICY policy_name ON (a) WITH TAG (A='TAG A', B='TAG B')") {
+        Statement::CreateTable(CreateTable {
+            name, cluster_by, base_location,
+            external_volume, catalog, catalog_sync,
+            storage_serialization_policy, change_tracking,
+            copy_grants, data_retention_time_in_days,
+            max_data_extension_time_in_days, with_aggregation_policy,
+            with_row_access_policy, with_tags, ..
+        }) => {
+            assert_eq!("my_table", name.to_string());
+            assert_eq!(
+                Some(WrappedCollection::Parentheses(vec![
+                    Expr::Identifier(Ident::new("a")),
+                    Expr::Identifier(Ident::new("b")),
+                ])),
+                cluster_by
+            );
+            assert_eq!("relative/path", base_location.unwrap());
+            assert_eq!("volume", external_volume.unwrap());
+            assert_eq!("SNOWFLAKE", catalog.unwrap());
+            assert_eq!("OPEN_CATALOG", catalog_sync.unwrap());
+            assert_eq!(StorageSerializationPolicy::Compatible, storage_serialization_policy.unwrap());
+            assert!(change_tracking.unwrap());
+            assert!(copy_grants);
+            assert_eq!(Some(5), data_retention_time_in_days);
+            assert_eq!(Some(10), max_data_extension_time_in_days);
+            assert_eq!(
+                Some("WITH ROW ACCESS POLICY policy_name ON (a)".to_string()),
+                with_row_access_policy.map(|policy| policy.to_string())
+            );
+            assert_eq!(
+                Some("policy_name".to_string()),
+                with_aggregation_policy.map(|name| name.to_string())
+            );
+            assert_eq!(Some(vec![
+                                        Tag::new(ObjectName::from(vec![Ident::new("A")]), "TAG A".into()),
+                                        Tag::new(ObjectName::from(vec![Ident::new("B")]), "TAG B".into()),
+                                    ]), with_tags);
+
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn test_snowflake_create_iceberg_table() {
+    match snowflake()
+        .verified_stmt("CREATE ICEBERG TABLE my_table (a INT) BASE_LOCATION = 'relative_path'")
+    {
+        Statement::CreateTable(CreateTable {
+            name,
+            base_location,
+            ..
+        }) => {
+            assert_eq!("my_table", name.to_string());
+            assert_eq!("relative_path", base_location.unwrap());
+        }
+        _ => unreachable!(),
+    }
+}
+
+#[test]
+fn test_snowflake_create_iceberg_table_without_location() {
+    let res = snowflake().parse_sql_statements("CREATE ICEBERG TABLE my_table (a INT)");
+    assert_eq!(
+        ParserError::ParserError("BASE_LOCATION is required for ICEBERG tables".to_string()),
+        res.unwrap_err()
+    );
+}
+
+#[test]
+fn test_snowflake_create_table_trailing_options() {
+    // Serialization to SQL assume that in `CREATE TABLE AS` the options come before the `AS (<query>)`
+    // but Snowflake supports also the other way around
+    snowflake()
+        .verified_stmt("CREATE TEMPORARY TABLE dst ON COMMIT PRESERVE ROWS AS (SELECT * FROM src)");
+    snowflake()
+        .parse_sql_statements(
+            "CREATE TEMPORARY TABLE dst AS (SELECT * FROM src) ON COMMIT PRESERVE ROWS",
+        )
+        .unwrap();
+
+    // Same for `CREATE TABLE LIKE|CLONE`:
+    snowflake().verified_stmt("CREATE TEMPORARY TABLE dst LIKE src ON COMMIT PRESERVE ROWS");
+    snowflake()
+        .parse_sql_statements("CREATE TEMPORARY TABLE dst ON COMMIT PRESERVE ROWS LIKE src")
+        .unwrap();
+
+    snowflake().verified_stmt("CREATE TEMPORARY TABLE dst CLONE src ON COMMIT PRESERVE ROWS");
+    snowflake()
+        .parse_sql_statements("CREATE TEMPORARY TABLE dst ON COMMIT PRESERVE ROWS CLONE src")
+        .unwrap();
+}
+
+#[test]
+fn test_snowflake_create_table_valid_schema_info() {
+    // Validate there's exactly one source of information on the schema of the new table
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("CREATE TABLE dst")
+            .is_err(),
+        true
+    );
+    assert_eq!(
+        snowflake().parse_sql_statements("CREATE OR REPLACE TEMP TABLE dst LIKE src AS (SELECT * FROM CUSTOMERS) ON COMMIT PRESERVE ROWS").is_err(),
+        true
+    );
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("CREATE OR REPLACE TEMP TABLE dst CLONE customers LIKE customer2")
+            .is_err(),
+        true
+    );
+}
+
 #[test]
 fn parse_sf_create_or_replace_view_with_comment_missing_equal() {
     assert!(snowflake_and_generic()
@@ -889,6 +1089,21 @@ fn parse_sf_create_or_replace_with_comment_for_snowflake() {
     }
 }
 
+#[test]
+fn parse_sf_create_table_or_view_with_dollar_quoted_comment() {
+    // Snowflake transforms dollar quoted comments into a common comment in DDL representation of creation
+    snowflake()
+        .one_statement_parses_to(
+            r#"CREATE OR REPLACE TEMPORARY VIEW foo.bar.baz ("COL_1" COMMENT $$comment 1$$) COMMENT = $$view comment$$ AS (SELECT 1)"#,
+            r#"CREATE OR REPLACE TEMPORARY VIEW foo.bar.baz ("COL_1" COMMENT 'comment 1') COMMENT = 'view comment' AS (SELECT 1)"#
+        );
+
+    snowflake().one_statement_parses_to(
+        r#"CREATE TABLE my_table (a STRING COMMENT $$comment 1$$) COMMENT = $$table comment$$"#,
+        r#"CREATE TABLE my_table (a STRING COMMENT 'comment 1') COMMENT = 'table comment'"#,
+    );
+}
+
 #[test]
 fn test_sf_derived_table_in_parenthesis() {
     // Nesting a subquery in an extra set of parentheses is non-standard,
@@ -1025,9 +1240,9 @@ fn parse_semi_structured_data_traversal() {
             path: JsonPath {
                 path: vec![JsonPathElem::Bracket {
                     key: Expr::BinaryOp {
-                        left: Box::new(Expr::Value(number("2"))),
+                        left: Box::new(Expr::value(number("2"))),
                         op: BinaryOperator::Plus,
-                        right: Box::new(Expr::Value(number("2")))
+                        right: Box::new(Expr::value(number("2")))
                     },
                 }]
             },
@@ -1105,7 +1320,7 @@ fn parse_semi_structured_data_traversal() {
                         quoted: false,
                     },
                     JsonPathElem::Bracket {
-                        key: Expr::Value(number("0")),
+                        key: Expr::value(number("0")),
                     },
                     JsonPathElem::Dot {
                         key: "bar".to_owned(),
@@ -1127,7 +1342,7 @@ fn parse_semi_structured_data_traversal() {
             path: JsonPath {
                 path: vec![
                     JsonPathElem::Bracket {
-                        key: Expr::Value(number("0")),
+                        key: Expr::value(number("0")),
                     },
                     JsonPathElem::Dot {
                         key: "foo".to_owned(),
@@ -1172,6 +1387,32 @@ fn parse_semi_structured_data_traversal() {
             .to_string(),
         "sql parser error: Expected: variant object key name, found: 42"
     );
+
+    // casting a json access and accessing an array element
+    assert_eq!(
+        snowflake().verified_expr("a:b::ARRAY[1]"),
+        Expr::JsonAccess {
+            value: Box::new(Expr::Cast {
+                kind: CastKind::DoubleColon,
+                data_type: DataType::Array(ArrayElemTypeDef::None),
+                format: None,
+                expr: Box::new(Expr::JsonAccess {
+                    value: Box::new(Expr::Identifier(Ident::new("a"))),
+                    path: JsonPath {
+                        path: vec![JsonPathElem::Dot {
+                            key: "b".to_string(),
+                            quoted: false
+                        }]
+                    }
+                })
+            }),
+            path: JsonPath {
+                path: vec![JsonPathElem::Bracket {
+                    key: Expr::value(number("1"))
+                }]
+            }
+        }
+    );
 }
 
 #[test]
@@ -1188,10 +1429,12 @@ fn parse_delimited_identifiers() {
             args,
             with_hints,
             version,
-            with_ordinality: _,
-            partitions: _,
+            ..
         } => {
-            assert_eq!(vec![Ident::with_quote('"', "a table")], name.0);
+            assert_eq!(
+                ObjectName::from(vec![Ident::with_quote('"', "a table")]),
+                name
+            );
             assert_eq!(Ident::with_quote('"', "alias"), alias.unwrap().name);
             assert!(args.is_none());
             assert!(with_hints.is_empty());
@@ -1210,7 +1453,8 @@ fn parse_delimited_identifiers() {
     );
     assert_eq!(
         &Expr::Function(Function {
-            name: ObjectName(vec![Ident::with_quote('"', "myfun")]),
+            name: ObjectName::from(vec![Ident::with_quote('"', "myfun")]),
+            uses_odbc_syntax: false,
             parameters: FunctionArguments::None,
             args: FunctionArguments::List(FunctionArgumentList {
                 duplicate_treatment: None,
@@ -1281,7 +1525,7 @@ fn test_select_wildcard_with_exclude() {
     let select = snowflake_and_generic()
         .verified_only_select("SELECT name.* EXCLUDE department_id FROM employee_table");
     let expected = SelectItem::QualifiedWildcard(
-        ObjectName(vec![Ident::new("name")]),
+        SelectItemQualifiedWildcardKind::ObjectName(ObjectName::from(vec![Ident::new("name")])),
         WildcardAdditionalOptions {
             opt_exclude: Some(ExcludeSelectItem::Single(Ident::new("department_id"))),
             ..Default::default()
@@ -1318,7 +1562,7 @@ fn test_select_wildcard_with_rename() {
         "SELECT name.* RENAME (department_id AS new_dep, employee_id AS new_emp) FROM employee_table",
     );
     let expected = SelectItem::QualifiedWildcard(
-        ObjectName(vec![Ident::new("name")]),
+        SelectItemQualifiedWildcardKind::ObjectName(ObjectName::from(vec![Ident::new("name")])),
         WildcardAdditionalOptions {
             opt_rename: Some(RenameSelectItem::Multiple(vec![
                 IdentWithAlias {
@@ -1410,6 +1654,50 @@ fn test_alter_table_swap_with() {
     };
 }
 
+#[test]
+fn test_alter_table_clustering() {
+    let sql = r#"ALTER TABLE tab CLUSTER BY (c1, "c2", TO_DATE(c3))"#;
+    match alter_table_op(snowflake_and_generic().verified_stmt(sql)) {
+        AlterTableOperation::ClusterBy { exprs } => {
+            assert_eq!(
+                exprs,
+                [
+                    Expr::Identifier(Ident::new("c1")),
+                    Expr::Identifier(Ident::with_quote('"', "c2")),
+                    Expr::Function(Function {
+                        name: ObjectName::from(vec![Ident::new("TO_DATE")]),
+                        uses_odbc_syntax: false,
+                        parameters: FunctionArguments::None,
+                        args: FunctionArguments::List(FunctionArgumentList {
+                            args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
+                                Expr::Identifier(Ident::new("c3"))
+                            ))],
+                            duplicate_treatment: None,
+                            clauses: vec![],
+                        }),
+                        filter: None,
+                        null_treatment: None,
+                        over: None,
+                        within_group: vec![]
+                    })
+                ],
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    snowflake_and_generic().verified_stmt("ALTER TABLE tbl DROP CLUSTERING KEY");
+    snowflake_and_generic().verified_stmt("ALTER TABLE tbl SUSPEND RECLUSTER");
+    snowflake_and_generic().verified_stmt("ALTER TABLE tbl RESUME RECLUSTER");
+}
+
+#[test]
+fn test_alter_iceberg_table() {
+    snowflake_and_generic().verified_stmt("ALTER ICEBERG TABLE tbl DROP CLUSTERING KEY");
+    snowflake_and_generic().verified_stmt("ALTER ICEBERG TABLE tbl SUSPEND RECLUSTER");
+    snowflake_and_generic().verified_stmt("ALTER ICEBERG TABLE tbl RESUME RECLUSTER");
+}
+
 #[test]
 fn test_drop_stage() {
     match snowflake_and_generic().verified_stmt("DROP STAGE s1") {
@@ -1512,13 +1800,13 @@ fn parse_snowflake_declare_result_set() {
         (
             "DECLARE res RESULTSET DEFAULT 42",
             "res",
-            Some(DeclareAssignment::Default(Expr::Value(number("42")).into())),
+            Some(DeclareAssignment::Default(Expr::value(number("42")).into())),
         ),
         (
             "DECLARE res RESULTSET := 42",
             "res",
             Some(DeclareAssignment::DuckAssignment(
-                Expr::Value(number("42")).into(),
+                Expr::value(number("42")).into(),
             )),
         ),
         ("DECLARE res RESULTSET", "res", None),
@@ -1568,8 +1856,8 @@ fn parse_snowflake_declare_exception() {
             "ex",
             Some(DeclareAssignment::Expr(
                 Expr::Tuple(vec![
-                    Expr::Value(number("42")),
-                    Expr::Value(Value::SingleQuotedString("ERROR".to_string())),
+                    Expr::value(number("42")),
+                    Expr::Value((Value::SingleQuotedString("ERROR".to_string())).with_empty_span()),
                 ])
                 .into(),
             )),
@@ -1605,13 +1893,13 @@ fn parse_snowflake_declare_variable() {
             "DECLARE profit TEXT DEFAULT 42",
             "profit",
             Some(DataType::Text),
-            Some(DeclareAssignment::Default(Expr::Value(number("42")).into())),
+            Some(DeclareAssignment::Default(Expr::value(number("42")).into())),
         ),
         (
             "DECLARE profit DEFAULT 42",
             "profit",
             None,
-            Some(DeclareAssignment::Default(Expr::Value(number("42")).into())),
+            Some(DeclareAssignment::Default(Expr::value(number("42")).into())),
         ),
         ("DECLARE profit TEXT", "profit", Some(DataType::Text), None),
         ("DECLARE profit", "profit", None, None),
@@ -1764,38 +2052,26 @@ fn test_create_stage_with_stage_params() {
                 "<s3_api_compatible_endpoint>",
                 stage_params.endpoint.unwrap()
             );
-            assert!(stage_params
-                .credentials
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "AWS_KEY_ID".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "1a2b3c".to_string()
-                }));
-            assert!(stage_params
-                .credentials
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "AWS_SECRET_KEY".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "4x5y6z".to_string()
-                }));
-            assert!(stage_params
-                .encryption
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "MASTER_KEY".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "key".to_string()
-                }));
-            assert!(stage_params
-                .encryption
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "TYPE".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "AWS_SSE_KMS".to_string()
-                }));
+            assert!(stage_params.credentials.options.contains(&KeyValueOption {
+                option_name: "AWS_KEY_ID".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "1a2b3c".to_string()
+            }));
+            assert!(stage_params.credentials.options.contains(&KeyValueOption {
+                option_name: "AWS_SECRET_KEY".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "4x5y6z".to_string()
+            }));
+            assert!(stage_params.encryption.options.contains(&KeyValueOption {
+                option_name: "MASTER_KEY".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "key".to_string()
+            }));
+            assert!(stage_params.encryption.options.contains(&KeyValueOption {
+                option_name: "TYPE".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "AWS_SSE_KMS".to_string()
+            }));
         }
         _ => unreachable!(),
     };
@@ -1816,19 +2092,19 @@ fn test_create_stage_with_directory_table_params() {
             directory_table_params,
             ..
         } => {
-            assert!(directory_table_params.options.contains(&DataLoadingOption {
+            assert!(directory_table_params.options.contains(&KeyValueOption {
                 option_name: "ENABLE".to_string(),
-                option_type: DataLoadingOptionType::BOOLEAN,
+                option_type: KeyValueOptionType::BOOLEAN,
                 value: "TRUE".to_string()
             }));
-            assert!(directory_table_params.options.contains(&DataLoadingOption {
+            assert!(directory_table_params.options.contains(&KeyValueOption {
                 option_name: "REFRESH_ON_CREATE".to_string(),
-                option_type: DataLoadingOptionType::BOOLEAN,
+                option_type: KeyValueOptionType::BOOLEAN,
                 value: "FALSE".to_string()
             }));
-            assert!(directory_table_params.options.contains(&DataLoadingOption {
+            assert!(directory_table_params.options.contains(&KeyValueOption {
                 option_name: "NOTIFICATION_INTEGRATION".to_string(),
-                option_type: DataLoadingOptionType::STRING,
+                option_type: KeyValueOptionType::STRING,
                 value: "some-string".to_string()
             }));
         }
@@ -1847,19 +2123,19 @@ fn test_create_stage_with_file_format() {
 
     match snowflake_without_unescape().verified_stmt(sql) {
         Statement::CreateStage { file_format, .. } => {
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "COMPRESSION".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "AUTO".to_string()
             }));
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "BINARY_FORMAT".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "HEX".to_string()
             }));
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "ESCAPE".to_string(),
-                option_type: DataLoadingOptionType::STRING,
+                option_type: KeyValueOptionType::STRING,
                 value: r#"\\"#.to_string()
             }));
         }
@@ -1880,14 +2156,14 @@ fn test_create_stage_with_copy_options() {
     );
     match snowflake().verified_stmt(sql) {
         Statement::CreateStage { copy_options, .. } => {
-            assert!(copy_options.options.contains(&DataLoadingOption {
+            assert!(copy_options.options.contains(&KeyValueOption {
                 option_name: "ON_ERROR".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "CONTINUE".to_string()
             }));
-            assert!(copy_options.options.contains(&DataLoadingOption {
+            assert!(copy_options.options.contains(&KeyValueOption {
                 option_name: "FORCE".to_string(),
-                option_type: DataLoadingOptionType::BOOLEAN,
+                option_type: KeyValueOptionType::BOOLEAN,
                 value: "TRUE".to_string()
             }));
         }
@@ -1904,20 +2180,25 @@ fn test_copy_into() {
     );
     match snowflake().verified_stmt(sql) {
         Statement::CopyIntoSnowflake {
+            kind,
             into,
-            from_stage,
+            from_obj,
             files,
             pattern,
             validation_mode,
             ..
         } => {
+            assert_eq!(kind, CopyIntoSnowflakeKind::Table);
             assert_eq!(
                 into,
-                ObjectName(vec![Ident::new("my_company"), Ident::new("emp_basic")])
+                ObjectName::from(vec![Ident::new("my_company"), Ident::new("emp_basic")])
             );
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::with_quote('\'', "gcs://mybucket/./../a.csv")])
+                from_obj,
+                Some(ObjectName::from(vec![Ident::with_quote(
+                    '\'',
+                    "gcs://mybucket/./../a.csv"
+                )]))
             );
             assert!(files.is_none());
             assert!(pattern.is_none());
@@ -1926,6 +2207,60 @@ fn test_copy_into() {
         _ => unreachable!(),
     };
     assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
+
+    let sql = concat!("COPY INTO 's3://a/b/c/data.parquet' ", "FROM db.sc.tbl ", "PARTITION BY ('date=' || to_varchar(dt, 'YYYY-MM-DD') || '/hour=' || to_varchar(date_part(hour, ts)))");
+    match snowflake().verified_stmt(sql) {
+        Statement::CopyIntoSnowflake {
+            kind,
+            into,
+            from_obj,
+            from_query,
+            partition,
+            ..
+        } => {
+            assert_eq!(kind, CopyIntoSnowflakeKind::Location);
+            assert_eq!(
+                into,
+                ObjectName::from(vec![Ident::with_quote('\'', "s3://a/b/c/data.parquet")])
+            );
+            assert_eq!(
+                from_obj,
+                Some(ObjectName::from(vec![
+                    Ident::new("db"),
+                    Ident::new("sc"),
+                    Ident::new("tbl")
+                ]))
+            );
+            assert!(from_query.is_none());
+            assert!(partition.is_some());
+        }
+        _ => unreachable!(),
+    };
+    assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
+
+    let sql = concat!(
+        "COPY INTO 's3://a/b/c/data.parquet' ",
+        "FROM (SELECT * FROM tbl)"
+    );
+    match snowflake().verified_stmt(sql) {
+        Statement::CopyIntoSnowflake {
+            kind,
+            into,
+            from_obj,
+            from_query,
+            ..
+        } => {
+            assert_eq!(kind, CopyIntoSnowflakeKind::Location);
+            assert_eq!(
+                into,
+                ObjectName::from(vec![Ident::with_quote('\'', "s3://a/b/c/data.parquet")])
+            );
+            assert!(from_query.is_some());
+            assert!(from_obj.is_none());
+        }
+        _ => unreachable!(),
+    };
+    assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
 }
 
 #[test]
@@ -1941,52 +2276,43 @@ fn test_copy_into_with_stage_params() {
 
     match snowflake().verified_stmt(sql) {
         Statement::CopyIntoSnowflake {
-            from_stage,
+            from_obj,
             stage_params,
             ..
         } => {
             //assert_eq!("s3://load/files/", stage_params.url.unwrap());
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::with_quote('\'', "s3://load/files/")])
+                from_obj,
+                Some(ObjectName::from(vec![Ident::with_quote(
+                    '\'',
+                    "s3://load/files/"
+                )]))
             );
             assert_eq!("myint", stage_params.storage_integration.unwrap());
             assert_eq!(
                 "<s3_api_compatible_endpoint>",
                 stage_params.endpoint.unwrap()
             );
-            assert!(stage_params
-                .credentials
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "AWS_KEY_ID".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "1a2b3c".to_string()
-                }));
-            assert!(stage_params
-                .credentials
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "AWS_SECRET_KEY".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "4x5y6z".to_string()
-                }));
-            assert!(stage_params
-                .encryption
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "MASTER_KEY".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "key".to_string()
-                }));
-            assert!(stage_params
-                .encryption
-                .options
-                .contains(&DataLoadingOption {
-                    option_name: "TYPE".to_string(),
-                    option_type: DataLoadingOptionType::STRING,
-                    value: "AWS_SSE_KMS".to_string()
-                }));
+            assert!(stage_params.credentials.options.contains(&KeyValueOption {
+                option_name: "AWS_KEY_ID".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "1a2b3c".to_string()
+            }));
+            assert!(stage_params.credentials.options.contains(&KeyValueOption {
+                option_name: "AWS_SECRET_KEY".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "4x5y6z".to_string()
+            }));
+            assert!(stage_params.encryption.options.contains(&KeyValueOption {
+                option_name: "MASTER_KEY".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "key".to_string()
+            }));
+            assert!(stage_params.encryption.options.contains(&KeyValueOption {
+                option_name: "TYPE".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: "AWS_SSE_KMS".to_string()
+            }));
         }
         _ => unreachable!(),
     };
@@ -2001,13 +2327,16 @@ fn test_copy_into_with_stage_params() {
 
     match snowflake().verified_stmt(sql) {
         Statement::CopyIntoSnowflake {
-            from_stage,
+            from_obj,
             stage_params,
             ..
         } => {
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::with_quote('\'', "s3://load/files/")])
+                from_obj,
+                Some(ObjectName::from(vec![Ident::with_quote(
+                    '\'',
+                    "s3://load/files/"
+                )]))
             );
             assert_eq!("myint", stage_params.storage_integration.unwrap());
         }
@@ -2030,13 +2359,13 @@ fn test_copy_into_with_files_and_pattern_and_verification() {
             files,
             pattern,
             validation_mode,
-            from_stage_alias,
+            from_obj_alias,
             ..
         } => {
             assert_eq!(files.unwrap(), vec!["file1.json", "file2.json"]);
             assert_eq!(pattern.unwrap(), ".*employees0[1-5].csv.gz");
             assert_eq!(validation_mode.unwrap(), "RETURN_7_ROWS");
-            assert_eq!(from_stage_alias.unwrap(), Ident::new("some_alias"));
+            assert_eq!(from_obj_alias.unwrap(), Ident::new("some_alias"));
         }
         _ => unreachable!(),
     }
@@ -2047,7 +2376,7 @@ fn test_copy_into_with_files_and_pattern_and_verification() {
 fn test_copy_into_with_transformations() {
     let sql = concat!(
         "COPY INTO my_company.emp_basic FROM ",
-        "(SELECT t1.$1:st AS st, $1:index, t2.$1 FROM @schema.general_finished AS T) ",
+        "(SELECT t1.$1:st AS st, $1:index, t2.$1, 4, '5' AS const_str FROM @schema.general_finished AS T) ",
         "FILES = ('file1.json', 'file2.json') ",
         "PATTERN = '.*employees0[1-5].csv.gz' ",
         "VALIDATION_MODE = RETURN_7_ROWS"
@@ -2055,45 +2384,68 @@ fn test_copy_into_with_transformations() {
 
     match snowflake().verified_stmt(sql) {
         Statement::CopyIntoSnowflake {
-            from_stage,
+            from_obj,
             from_transformations,
             ..
         } => {
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::new("@schema"), Ident::new("general_finished")])
+                from_obj,
+                Some(ObjectName::from(vec![
+                    Ident::new("@schema"),
+                    Ident::new("general_finished")
+                ]))
             );
             assert_eq!(
                 from_transformations.as_ref().unwrap()[0],
-                StageLoadSelectItem {
+                StageLoadSelectItemKind::StageLoadSelectItem(StageLoadSelectItem {
                     alias: Some(Ident::new("t1")),
                     file_col_num: 1,
                     element: Some(Ident::new("st")),
                     item_as: Some(Ident::new("st"))
-                }
+                })
             );
             assert_eq!(
                 from_transformations.as_ref().unwrap()[1],
-                StageLoadSelectItem {
+                StageLoadSelectItemKind::StageLoadSelectItem(StageLoadSelectItem {
                     alias: None,
                     file_col_num: 1,
                     element: Some(Ident::new("index")),
                     item_as: None
-                }
+                })
             );
             assert_eq!(
                 from_transformations.as_ref().unwrap()[2],
-                StageLoadSelectItem {
+                StageLoadSelectItemKind::StageLoadSelectItem(StageLoadSelectItem {
                     alias: Some(Ident::new("t2")),
                     file_col_num: 1,
                     element: None,
                     item_as: None
-                }
+                })
+            );
+            assert_eq!(
+                from_transformations.as_ref().unwrap()[3],
+                StageLoadSelectItemKind::SelectItem(SelectItem::UnnamedExpr(Expr::Value(
+                    Value::Number("4".parse().unwrap(), false).into()
+                )))
+            );
+            assert_eq!(
+                from_transformations.as_ref().unwrap()[4],
+                StageLoadSelectItemKind::SelectItem(SelectItem::ExprWithAlias {
+                    expr: Expr::Value(Value::SingleQuotedString("5".parse().unwrap()).into()),
+                    alias: Ident::new("const_str".to_string())
+                })
             );
         }
         _ => unreachable!(),
     }
     assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
+
+    // Test optional AS keyword to denote an alias for the stage
+    let sql1 = concat!(
+        "COPY INTO my_company.emp_basic FROM ",
+        "(SELECT t1.$1:st AS st, $1:index, t2.$1, 4, '5' AS const_str FROM @schema.general_finished T) "
+    );
+    snowflake().parse_sql_statements(sql1).unwrap();
 }
 
 #[test]
@@ -2108,19 +2460,19 @@ fn test_copy_into_file_format() {
 
     match snowflake_without_unescape().verified_stmt(sql) {
         Statement::CopyIntoSnowflake { file_format, .. } => {
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "COMPRESSION".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "AUTO".to_string()
             }));
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "BINARY_FORMAT".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "HEX".to_string()
             }));
-            assert!(file_format.options.contains(&DataLoadingOption {
+            assert!(file_format.options.contains(&KeyValueOption {
                 option_name: "ESCAPE".to_string(),
-                option_type: DataLoadingOptionType::STRING,
+                option_type: KeyValueOptionType::STRING,
                 value: r#"\\"#.to_string()
             }));
         }
@@ -2130,6 +2482,41 @@ fn test_copy_into_file_format() {
         snowflake_without_unescape().verified_stmt(sql).to_string(),
         sql
     );
+
+    // Test commas in file format
+    let sql = concat!(
+        "COPY INTO my_company.emp_basic ",
+        "FROM 'gcs://mybucket/./../a.csv' ",
+        "FILES = ('file1.json', 'file2.json') ",
+        "PATTERN = '.*employees0[1-5].csv.gz' ",
+        r#"FILE_FORMAT=(COMPRESSION=AUTO, BINARY_FORMAT=HEX, ESCAPE='\\')"#
+    );
+
+    match snowflake_without_unescape()
+        .parse_sql_statements(sql)
+        .unwrap()
+        .first()
+        .unwrap()
+    {
+        Statement::CopyIntoSnowflake { file_format, .. } => {
+            assert!(file_format.options.contains(&KeyValueOption {
+                option_name: "COMPRESSION".to_string(),
+                option_type: KeyValueOptionType::ENUM,
+                value: "AUTO".to_string()
+            }));
+            assert!(file_format.options.contains(&KeyValueOption {
+                option_name: "BINARY_FORMAT".to_string(),
+                option_type: KeyValueOptionType::ENUM,
+                value: "HEX".to_string()
+            }));
+            assert!(file_format.options.contains(&KeyValueOption {
+                option_name: "ESCAPE".to_string(),
+                option_type: KeyValueOptionType::STRING,
+                value: r#"\\"#.to_string()
+            }));
+        }
+        _ => unreachable!(),
+    }
 }
 
 #[test]
@@ -2144,14 +2531,14 @@ fn test_copy_into_copy_options() {
 
     match snowflake().verified_stmt(sql) {
         Statement::CopyIntoSnowflake { copy_options, .. } => {
-            assert!(copy_options.options.contains(&DataLoadingOption {
+            assert!(copy_options.options.contains(&KeyValueOption {
                 option_name: "ON_ERROR".to_string(),
-                option_type: DataLoadingOptionType::ENUM,
+                option_type: KeyValueOptionType::ENUM,
                 value: "CONTINUE".to_string()
             }));
-            assert!(copy_options.options.contains(&DataLoadingOption {
+            assert!(copy_options.options.contains(&KeyValueOption {
                 option_name: "FORCE".to_string(),
-                option_type: DataLoadingOptionType::BOOLEAN,
+                option_type: KeyValueOptionType::BOOLEAN,
                 value: "TRUE".to_string()
             }));
         }
@@ -2161,37 +2548,55 @@ fn test_copy_into_copy_options() {
 }
 
 #[test]
-fn test_snowflake_stage_object_names() {
-    let allowed_formatted_names = [
-        "my_company.emp_basic",
-        "@namespace.%table_name",
-        "@namespace.%table_name/path",
-        "@namespace.stage_name/path",
-        "@~/path",
-    ];
+fn test_snowflake_stage_object_names_into_location() {
     let mut allowed_object_names = [
-        ObjectName(vec![Ident::new("my_company"), Ident::new("emp_basic")]),
-        ObjectName(vec![Ident::new("@namespace"), Ident::new("%table_name")]),
-        ObjectName(vec![
+        ObjectName::from(vec![Ident::new("@namespace"), Ident::new("%table_name")]),
+        ObjectName::from(vec![
             Ident::new("@namespace"),
             Ident::new("%table_name/path"),
         ]),
-        ObjectName(vec![
+        ObjectName::from(vec![
             Ident::new("@namespace"),
             Ident::new("stage_name/path"),
         ]),
-        ObjectName(vec![Ident::new("@~/path")]),
+        ObjectName::from(vec![Ident::new("@~/path")]),
     ];
 
-    for it in allowed_formatted_names
+    let allowed_names_into_location = [
+        "@namespace.%table_name",
+        "@namespace.%table_name/path",
+        "@namespace.stage_name/path",
+        "@~/path",
+    ];
+    for it in allowed_names_into_location
         .iter()
         .zip(allowed_object_names.iter_mut())
     {
         let (formatted_name, object_name) = it;
-        let sql = format!(
-            "COPY INTO {} FROM 'gcs://mybucket/./../a.csv'",
-            formatted_name
-        );
+        let sql = format!("COPY INTO {formatted_name} FROM 'gcs://mybucket/./../a.csv'");
+        match snowflake().verified_stmt(&sql) {
+            Statement::CopyIntoSnowflake { into, .. } => {
+                assert_eq!(into.0, object_name.0)
+            }
+            _ => unreachable!(),
+        }
+    }
+}
+
+#[test]
+fn test_snowflake_stage_object_names_into_table() {
+    let mut allowed_object_names = [
+        ObjectName::from(vec![Ident::new("my_company"), Ident::new("emp_basic")]),
+        ObjectName::from(vec![Ident::new("emp_basic")]),
+    ];
+
+    let allowed_names_into_table = ["my_company.emp_basic", "emp_basic"];
+    for it in allowed_names_into_table
+        .iter()
+        .zip(allowed_object_names.iter_mut())
+    {
+        let (formatted_name, object_name) = it;
+        let sql = format!("COPY INTO {formatted_name} FROM 'gcs://mybucket/./../a.csv'");
         match snowflake().verified_stmt(&sql) {
             Statement::CopyIntoSnowflake { into, .. } => {
                 assert_eq!(into.0, object_name.0)
@@ -2206,13 +2611,37 @@ fn test_snowflake_copy_into() {
     let sql = "COPY INTO a.b FROM @namespace.stage_name";
     assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
     match snowflake().verified_stmt(sql) {
-        Statement::CopyIntoSnowflake {
-            into, from_stage, ..
-        } => {
-            assert_eq!(into, ObjectName(vec![Ident::new("a"), Ident::new("b")]));
+        Statement::CopyIntoSnowflake { into, from_obj, .. } => {
+            assert_eq!(
+                into,
+                ObjectName::from(vec![Ident::new("a"), Ident::new("b")])
+            );
+            assert_eq!(
+                from_obj,
+                Some(ObjectName::from(vec![
+                    Ident::new("@namespace"),
+                    Ident::new("stage_name")
+                ]))
+            )
+        }
+        _ => unreachable!(),
+    }
+
+    // Test for non-ident characters in stage names
+    let sql = "COPY INTO a.b FROM @namespace.stage_name/x@x~x%x+/20250723_data";
+    assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
+    match snowflake().verified_stmt(sql) {
+        Statement::CopyIntoSnowflake { into, from_obj, .. } => {
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::new("@namespace"), Ident::new("stage_name")])
+                into,
+                ObjectName::from(vec![Ident::new("a"), Ident::new("b")])
+            );
+            assert_eq!(
+                from_obj,
+                Some(ObjectName::from(vec![
+                    Ident::new("@namespace"),
+                    Ident::new("stage_name/x@x~x%x+/20250723_data")
+                ]))
             )
         }
         _ => unreachable!(),
@@ -2224,19 +2653,20 @@ fn test_snowflake_copy_into_stage_name_ends_with_parens() {
     let sql = "COPY INTO SCHEMA.SOME_MONITORING_SYSTEM FROM (SELECT t.$1:st AS st FROM @schema.general_finished)";
     assert_eq!(snowflake().verified_stmt(sql).to_string(), sql);
     match snowflake().verified_stmt(sql) {
-        Statement::CopyIntoSnowflake {
-            into, from_stage, ..
-        } => {
+        Statement::CopyIntoSnowflake { into, from_obj, .. } => {
             assert_eq!(
                 into,
-                ObjectName(vec![
+                ObjectName::from(vec![
                     Ident::new("SCHEMA"),
                     Ident::new("SOME_MONITORING_SYSTEM")
                 ])
             );
             assert_eq!(
-                from_stage,
-                ObjectName(vec![Ident::new("@schema"), Ident::new("general_finished")])
+                from_obj,
+                Some(ObjectName::from(vec![
+                    Ident::new("@schema"),
+                    Ident::new("general_finished")
+                ]))
             )
         }
         _ => unreachable!(),
@@ -2252,10 +2682,14 @@ fn test_snowflake_trim() {
     let select = snowflake().verified_only_select(sql_only_select);
     assert_eq!(
         &Expr::Trim {
-            expr: Box::new(Expr::Value(Value::SingleQuotedString("xyz".to_owned()))),
+            expr: Box::new(Expr::Value(
+                (Value::SingleQuotedString("xyz".to_owned())).with_empty_span()
+            )),
             trim_where: None,
             trim_what: None,
-            trim_characters: Some(vec![Expr::Value(Value::SingleQuotedString("a".to_owned()))]),
+            trim_characters: Some(vec![Expr::Value(
+                (Value::SingleQuotedString("a".to_owned())).with_empty_span()
+            )]),
         },
         expr_from_projection(only(&select.projection))
     );
@@ -2273,7 +2707,7 @@ fn test_number_placeholder() {
     let sql_only_select = "SELECT :1";
     let select = snowflake().verified_only_select(sql_only_select);
     assert_eq!(
-        &Expr::Value(Value::Placeholder(":1".into())),
+        &Expr::Value((Value::Placeholder(":1".into())).with_empty_span()),
         expr_from_projection(only(&select.projection))
     );
 
@@ -2419,7 +2853,7 @@ fn parse_comma_outer_join() {
                 "myudf",
                 [Expr::UnaryOp {
                     op: UnaryOperator::Plus,
-                    expr: Box::new(Expr::Value(number("42")))
+                    expr: Box::new(Expr::value(number("42")))
                 }]
             )),
         })
@@ -2604,6 +3038,20 @@ fn asof_joins() {
               "ON s.state = p.state ",
           "ORDER BY s.observed",
     ));
+
+    // Test without explicit aliases
+    #[rustfmt::skip]
+    snowflake_and_generic().verified_query(concat!(
+        "SELECT * ",
+          "FROM snowtime ",
+            "ASOF JOIN raintime ",
+              "MATCH_CONDITION (snowtime.observed >= raintime.observed) ",
+              "ON snowtime.state = raintime.state ",
+            "ASOF JOIN preciptime ",
+              "MATCH_CONDITION (showtime.observed >= preciptime.observed) ",
+              "ON showtime.state = preciptime.state ",
+          "ORDER BY showtime.observed",
+    ));
 }
 
 #[test]
@@ -2648,17 +3096,17 @@ fn parse_use() {
     let quote_styles = ['\'', '"', '`'];
     for object_name in &valid_object_names {
         // Test single identifier without quotes
-        std::assert_eq!(
-            snowflake().verified_stmt(&format!("USE {}", object_name)),
-            Statement::Use(Use::Object(ObjectName(vec![Ident::new(
+        assert_eq!(
+            snowflake().verified_stmt(&format!("USE {object_name}")),
+            Statement::Use(Use::Object(ObjectName::from(vec![Ident::new(
                 object_name.to_string()
             )])))
         );
         for &quote in &quote_styles {
             // Test single identifier with different type of quotes
-            std::assert_eq!(
-                snowflake().verified_stmt(&format!("USE {}{}{}", quote, object_name, quote)),
-                Statement::Use(Use::Object(ObjectName(vec![Ident::with_quote(
+            assert_eq!(
+                snowflake().verified_stmt(&format!("USE {quote}{object_name}{quote}")),
+                Statement::Use(Use::Object(ObjectName::from(vec![Ident::with_quote(
                     quote,
                     object_name.to_string(),
                 )])))
@@ -2668,18 +3116,20 @@ fn parse_use() {
 
     for &quote in &quote_styles {
         // Test double identifier with different type of quotes
-        std::assert_eq!(
-            snowflake().verified_stmt(&format!("USE {0}CATALOG{0}.{0}my_schema{0}", quote)),
-            Statement::Use(Use::Object(ObjectName(vec![
+        assert_eq!(
+            snowflake().verified_stmt(&format!(
+                "USE {quote}CATALOG{quote}.{quote}my_schema{quote}"
+            )),
+            Statement::Use(Use::Object(ObjectName::from(vec![
                 Ident::with_quote(quote, "CATALOG"),
                 Ident::with_quote(quote, "my_schema")
             ])))
         );
     }
     // Test double identifier without quotes
-    std::assert_eq!(
+    assert_eq!(
         snowflake().verified_stmt("USE mydb.my_schema"),
-        Statement::Use(Use::Object(ObjectName(vec![
+        Statement::Use(Use::Object(ObjectName::from(vec![
             Ident::new("mydb"),
             Ident::new("my_schema")
         ])))
@@ -2687,37 +3137,65 @@ fn parse_use() {
 
     for &quote in &quote_styles {
         // Test single and double identifier with keyword and different type of quotes
-        std::assert_eq!(
-            snowflake().verified_stmt(&format!("USE DATABASE {0}my_database{0}", quote)),
-            Statement::Use(Use::Database(ObjectName(vec![Ident::with_quote(
+        assert_eq!(
+            snowflake().verified_stmt(&format!("USE DATABASE {quote}my_database{quote}")),
+            Statement::Use(Use::Database(ObjectName::from(vec![Ident::with_quote(
                 quote,
                 "my_database".to_string(),
             )])))
         );
-        std::assert_eq!(
-            snowflake().verified_stmt(&format!("USE SCHEMA {0}my_schema{0}", quote)),
-            Statement::Use(Use::Schema(ObjectName(vec![Ident::with_quote(
+        assert_eq!(
+            snowflake().verified_stmt(&format!("USE SCHEMA {quote}my_schema{quote}")),
+            Statement::Use(Use::Schema(ObjectName::from(vec![Ident::with_quote(
                 quote,
                 "my_schema".to_string(),
             )])))
         );
-        std::assert_eq!(
-            snowflake().verified_stmt(&format!("USE SCHEMA {0}CATALOG{0}.{0}my_schema{0}", quote)),
-            Statement::Use(Use::Schema(ObjectName(vec![
+        assert_eq!(
+            snowflake().verified_stmt(&format!(
+                "USE SCHEMA {quote}CATALOG{quote}.{quote}my_schema{quote}"
+            )),
+            Statement::Use(Use::Schema(ObjectName::from(vec![
                 Ident::with_quote(quote, "CATALOG"),
                 Ident::with_quote(quote, "my_schema")
             ])))
         );
+        assert_eq!(
+            snowflake().verified_stmt(&format!("USE ROLE {quote}my_role{quote}")),
+            Statement::Use(Use::Role(ObjectName::from(vec![Ident::with_quote(
+                quote,
+                "my_role".to_string(),
+            )])))
+        );
+        assert_eq!(
+            snowflake().verified_stmt(&format!("USE WAREHOUSE {quote}my_wh{quote}")),
+            Statement::Use(Use::Warehouse(ObjectName::from(vec![Ident::with_quote(
+                quote,
+                "my_wh".to_string(),
+            )])))
+        );
     }
 
     // Test invalid syntax - missing identifier
     let invalid_cases = ["USE SCHEMA", "USE DATABASE", "USE WAREHOUSE"];
     for sql in &invalid_cases {
-        std::assert_eq!(
+        assert_eq!(
             snowflake().parse_sql_statements(sql).unwrap_err(),
             ParserError::ParserError("Expected: identifier, found: EOF".to_string()),
         );
     }
+
+    snowflake().verified_stmt("USE SECONDARY ROLES ALL");
+    snowflake().verified_stmt("USE SECONDARY ROLES NONE");
+    snowflake().verified_stmt("USE SECONDARY ROLES r1, r2, r3");
+
+    // The following is not documented by Snowflake but still works:
+    snowflake().one_statement_parses_to("USE SECONDARY ROLE ALL", "USE SECONDARY ROLES ALL");
+    snowflake().one_statement_parses_to("USE SECONDARY ROLE NONE", "USE SECONDARY ROLES NONE");
+    snowflake().one_statement_parses_to(
+        "USE SECONDARY ROLE r1, r2, r3",
+        "USE SECONDARY ROLES r1, r2, r3",
+    );
 }
 
 #[test]
@@ -2727,7 +3205,7 @@ fn view_comment_option_should_be_after_column_list() {
         "CREATE OR REPLACE VIEW v (a COMMENT 'a comment', b, c COMMENT 'c comment') COMMENT = 'Comment' AS SELECT a FROM t",
         "CREATE OR REPLACE VIEW v (a COMMENT 'a comment', b, c COMMENT 'c comment') WITH (foo = bar) COMMENT = 'Comment' AS SELECT a FROM t",
     ] {
-        snowflake_and_generic()
+        snowflake()
             .verified_stmt(sql);
     }
 }
@@ -2736,7 +3214,7 @@ fn view_comment_option_should_be_after_column_list() {
 fn parse_view_column_descriptions() {
     let sql = "CREATE OR REPLACE VIEW v (a COMMENT 'Comment', b) AS SELECT a, b FROM table1";
 
-    match snowflake_and_generic().verified_stmt(sql) {
+    match snowflake().verified_stmt(sql) {
         Statement::CreateView { name, columns, .. } => {
             assert_eq!(name.to_string(), "v");
             assert_eq!(
@@ -2745,7 +3223,9 @@ fn parse_view_column_descriptions() {
                     ViewColumnDef {
                         name: Ident::new("a"),
                         data_type: None,
-                        options: Some(vec![ColumnOption::Comment("Comment".to_string())]),
+                        options: Some(ColumnOptions::SpaceSeparated(vec![ColumnOption::Comment(
+                            "Comment".to_string()
+                        )])),
                     },
                     ViewColumnDef {
                         name: Ident::new("b"),
@@ -2761,7 +3241,9 @@ fn parse_view_column_descriptions() {
 
 #[test]
 fn test_parentheses_overflow() {
-    let max_nesting_level: usize = 30;
+    // TODO: increase / improve after we fix the recursion limit
+    // for real (see https://github.com/apache/datafusion-sqlparser-rs/issues/984)
+    let max_nesting_level: usize = 25;
 
     // Verify the recursion check is not too wasteful... (num of parentheses - 2 is acceptable)
     let slack = 2;
@@ -2785,6 +3267,7 @@ fn test_parentheses_overflow() {
 #[test]
 fn test_show_databases() {
     snowflake().verified_stmt("SHOW DATABASES");
+    snowflake().verified_stmt("SHOW TERSE DATABASES");
     snowflake().verified_stmt("SHOW DATABASES HISTORY");
     snowflake().verified_stmt("SHOW DATABASES LIKE '%abc%'");
     snowflake().verified_stmt("SHOW DATABASES STARTS WITH 'demo_db'");
@@ -2797,6 +3280,7 @@ fn test_show_databases() {
 #[test]
 fn test_parse_show_schemas() {
     snowflake().verified_stmt("SHOW SCHEMAS");
+    snowflake().verified_stmt("SHOW TERSE SCHEMAS");
     snowflake().verified_stmt("SHOW SCHEMAS IN ACCOUNT");
     snowflake().verified_stmt("SHOW SCHEMAS IN ACCOUNT abc");
     snowflake().verified_stmt("SHOW SCHEMAS IN DATABASE");
@@ -2806,9 +3290,51 @@ fn test_parse_show_schemas() {
     snowflake().verified_stmt("SHOW SCHEMAS IN DATABASE STARTS WITH 'abc' LIMIT 20 FROM 'xyz'");
 }
 
+#[test]
+fn test_parse_show_objects() {
+    snowflake().verified_stmt("SHOW OBJECTS");
+    snowflake().verified_stmt("SHOW OBJECTS IN abc");
+    snowflake().verified_stmt("SHOW OBJECTS LIKE '%test%' IN abc");
+    snowflake().verified_stmt("SHOW OBJECTS IN ACCOUNT");
+    snowflake().verified_stmt("SHOW OBJECTS IN DATABASE");
+    snowflake().verified_stmt("SHOW OBJECTS IN DATABASE abc");
+    snowflake().verified_stmt("SHOW OBJECTS IN SCHEMA");
+    snowflake().verified_stmt("SHOW OBJECTS IN SCHEMA abc");
+    snowflake().verified_stmt("SHOW TERSE OBJECTS");
+    snowflake().verified_stmt("SHOW TERSE OBJECTS IN abc");
+    snowflake().verified_stmt("SHOW TERSE OBJECTS LIKE '%test%' IN abc");
+    snowflake().verified_stmt("SHOW TERSE OBJECTS LIKE '%test%' IN abc STARTS WITH 'b'");
+    snowflake().verified_stmt("SHOW TERSE OBJECTS LIKE '%test%' IN abc STARTS WITH 'b' LIMIT 10");
+    snowflake()
+        .verified_stmt("SHOW TERSE OBJECTS LIKE '%test%' IN abc STARTS WITH 'b' LIMIT 10 FROM 'x'");
+    match snowflake().verified_stmt("SHOW TERSE OBJECTS LIKE '%test%' IN abc") {
+        Statement::ShowObjects(ShowObjects {
+            terse,
+            show_options,
+        }) => {
+            assert!(terse);
+            let name = match show_options.show_in {
+                Some(ShowStatementIn {
+                    parent_name: Some(val),
+                    ..
+                }) => val.to_string(),
+                _ => unreachable!(),
+            };
+            assert_eq!("abc", name);
+            let like = match show_options.filter_position {
+                Some(ShowStatementFilterPosition::Infix(ShowStatementFilter::Like(val))) => val,
+                _ => unreachable!(),
+            };
+            assert_eq!("%test%", like);
+        }
+        _ => unreachable!(),
+    }
+}
+
 #[test]
 fn test_parse_show_tables() {
     snowflake().verified_stmt("SHOW TABLES");
+    snowflake().verified_stmt("SHOW TERSE TABLES");
     snowflake().verified_stmt("SHOW TABLES IN ACCOUNT");
     snowflake().verified_stmt("SHOW TABLES IN DATABASE");
     snowflake().verified_stmt("SHOW TABLES IN DATABASE xyz");
@@ -2831,6 +3357,7 @@ fn test_parse_show_tables() {
 #[test]
 fn test_show_views() {
     snowflake().verified_stmt("SHOW VIEWS");
+    snowflake().verified_stmt("SHOW TERSE VIEWS");
     snowflake().verified_stmt("SHOW VIEWS IN ACCOUNT");
     snowflake().verified_stmt("SHOW VIEWS IN DATABASE");
     snowflake().verified_stmt("SHOW VIEWS IN DATABASE xyz");
@@ -2846,3 +3373,1197 @@ fn test_parse_show_columns_sql() {
     snowflake().verified_stmt("SHOW COLUMNS IN TABLE abc");
     snowflake().verified_stmt("SHOW COLUMNS LIKE '%xyz%' IN TABLE abc");
 }
+
+#[test]
+fn test_projection_with_nested_trailing_commas() {
+    let sql = "SELECT a, FROM b, LATERAL FLATTEN(input => events)";
+    let _ = snowflake().parse_sql_statements(sql).unwrap();
+
+    //Single nesting
+    let sql = "SELECT (SELECT a, FROM b, LATERAL FLATTEN(input => events))";
+    let _ = snowflake().parse_sql_statements(sql).unwrap();
+
+    //Double nesting
+    let sql = "SELECT (SELECT (SELECT a, FROM b, LATERAL FLATTEN(input => events)))";
+    let _ = snowflake().parse_sql_statements(sql).unwrap();
+
+    let sql = "SELECT a, b, FROM c, (SELECT d, e, FROM f, LATERAL FLATTEN(input => events))";
+    let _ = snowflake().parse_sql_statements(sql).unwrap();
+}
+
+#[test]
+fn test_sf_double_dot_notation() {
+    snowflake().verified_stmt("SELECT * FROM db_name..table_name");
+    snowflake().verified_stmt("SELECT * FROM x, y..z JOIN a..b AS b ON x.id = b.id");
+
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("SELECT * FROM X.Y..")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: identifier, found: ."
+    );
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("SELECT * FROM X..Y..Z")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: identifier, found: ."
+    );
+    assert_eq!(
+        // Ensure we don't parse leading token
+        snowflake()
+            .parse_sql_statements("SELECT * FROM .X.Y")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: Expected: identifier, found: ."
+    );
+}
+
+#[test]
+fn test_parse_double_dot_notation_wrong_position() {}
+
+#[test]
+fn parse_insert_overwrite() {
+    let insert_overwrite_into = r#"INSERT OVERWRITE INTO schema.table SELECT a FROM b"#;
+    snowflake().verified_stmt(insert_overwrite_into);
+}
+
+#[test]
+fn test_table_sample() {
+    snowflake_and_generic().verified_stmt("SELECT * FROM testtable SAMPLE (10)");
+    snowflake_and_generic().verified_stmt("SELECT * FROM testtable TABLESAMPLE (10)");
+    snowflake_and_generic()
+        .verified_stmt("SELECT * FROM testtable AS t TABLESAMPLE BERNOULLI (10)");
+    snowflake_and_generic().verified_stmt("SELECT * FROM testtable AS t TABLESAMPLE ROW (10)");
+    snowflake_and_generic().verified_stmt("SELECT * FROM testtable AS t TABLESAMPLE ROW (10 ROWS)");
+    snowflake_and_generic()
+        .verified_stmt("SELECT * FROM testtable TABLESAMPLE BLOCK (3) SEED (82)");
+    snowflake_and_generic()
+        .verified_stmt("SELECT * FROM testtable TABLESAMPLE SYSTEM (3) REPEATABLE (82)");
+    snowflake_and_generic().verified_stmt("SELECT id FROM mytable TABLESAMPLE (10) REPEATABLE (1)");
+    snowflake_and_generic().verified_stmt("SELECT id FROM mytable TABLESAMPLE (10) SEED (1)");
+}
+
+#[test]
+fn parse_ls_and_rm() {
+    snowflake().one_statement_parses_to("LS @~", "LIST @~");
+    snowflake().one_statement_parses_to("RM @~", "REMOVE @~");
+
+    let statement = snowflake()
+        .verified_stmt("LIST @SNOWFLAKE_KAFKA_CONNECTOR_externalDataLakeSnowflakeConnector_STAGE_call_tracker_stream/");
+    match statement {
+        Statement::List(command) => {
+            assert_eq!(command.stage, ObjectName::from(vec!["@SNOWFLAKE_KAFKA_CONNECTOR_externalDataLakeSnowflakeConnector_STAGE_call_tracker_stream/".into()]));
+            assert!(command.pattern.is_none());
+        }
+        _ => unreachable!(),
+    };
+
+    let statement =
+        snowflake().verified_stmt("REMOVE @my_csv_stage/analysis/ PATTERN='.*data_0.*'");
+    match statement {
+        Statement::Remove(command) => {
+            assert_eq!(
+                command.stage,
+                ObjectName::from(vec!["@my_csv_stage/analysis/".into()])
+            );
+            assert_eq!(command.pattern, Some(".*data_0.*".to_string()));
+        }
+        _ => unreachable!(),
+    };
+
+    snowflake().verified_stmt(r#"LIST @"STAGE_WITH_QUOTES""#);
+    // Semi-colon after stage name - should terminate the stage name
+    snowflake()
+        .parse_sql_statements("LIST @db1.schema1.stage1/dir1/;")
+        .unwrap();
+}
+
+#[test]
+fn test_sql_keywords_as_select_item_ident() {
+    // Some keywords that should be parsed as an alias
+    let unreserved_kws = vec!["CLUSTER", "FETCH", "RETURNING", "LIMIT", "EXCEPT", "SORT"];
+    for kw in unreserved_kws {
+        snowflake().verified_stmt(&format!("SELECT 1, {kw}"));
+    }
+
+    // Some keywords that should not be parsed as an alias
+    let reserved_kws = vec![
+        "FROM",
+        "GROUP",
+        "HAVING",
+        "INTERSECT",
+        "INTO",
+        "ORDER",
+        "SELECT",
+        "UNION",
+        "WHERE",
+        "WITH",
+    ];
+    for kw in reserved_kws {
+        assert!(snowflake()
+            .parse_sql_statements(&format!("SELECT 1, {kw}"))
+            .is_err());
+    }
+}
+
+#[test]
+fn test_sql_keywords_as_select_item_aliases() {
+    // Some keywords that should be parsed as an alias
+    let unreserved_kws = vec!["CLUSTER", "FETCH", "RETURNING", "LIMIT", "EXCEPT", "SORT"];
+    for kw in unreserved_kws {
+        snowflake()
+            .one_statement_parses_to(&format!("SELECT 1 {kw}"), &format!("SELECT 1 AS {kw}"));
+    }
+
+    // Some keywords that should not be parsed as an alias
+    let reserved_kws = vec![
+        "FROM",
+        "GROUP",
+        "HAVING",
+        "INTERSECT",
+        "INTO",
+        "ORDER",
+        "SELECT",
+        "UNION",
+        "WHERE",
+        "WITH",
+    ];
+    for kw in reserved_kws {
+        assert!(snowflake()
+            .parse_sql_statements(&format!("SELECT 1 {kw}"))
+            .is_err());
+    }
+
+    // LIMIT is alias
+    snowflake().one_statement_parses_to("SELECT 1 LIMIT", "SELECT 1 AS LIMIT");
+    // LIMIT is not an alias
+    snowflake().verified_stmt("SELECT 1 LIMIT 1");
+    snowflake().verified_stmt("SELECT 1 LIMIT $1");
+    snowflake().verified_stmt("SELECT 1 LIMIT ''");
+    snowflake().verified_stmt("SELECT 1 LIMIT NULL");
+    snowflake().verified_stmt("SELECT 1 LIMIT $$$$");
+}
+
+#[test]
+fn test_sql_keywords_as_table_aliases() {
+    // Some keywords that should be parsed as an alias implicitly
+    let unreserved_kws = vec![
+        "VIEW",
+        "EXPLAIN",
+        "ANALYZE",
+        "SORT",
+        "PIVOT",
+        "UNPIVOT",
+        "TOP",
+        "LIMIT",
+        "OFFSET",
+        "FETCH",
+        "EXCEPT",
+        "CLUSTER",
+        "DISTRIBUTE",
+        "GLOBAL",
+        "ANTI",
+        "SEMI",
+        "RETURNING",
+        "OUTER",
+        "WINDOW",
+        "END",
+        "PARTITION",
+        "PREWHERE",
+        "SETTINGS",
+        "FORMAT",
+        "MATCH_RECOGNIZE",
+        "OPEN",
+    ];
+
+    for kw in unreserved_kws {
+        snowflake().verified_stmt(&format!("SELECT * FROM tbl AS {kw}"));
+        snowflake().one_statement_parses_to(
+            &format!("SELECT * FROM tbl {kw}"),
+            &format!("SELECT * FROM tbl AS {kw}"),
+        );
+    }
+
+    // Some keywords that should not be parsed as an alias implicitly
+    let reserved_kws = vec![
+        "FROM", "GROUP", "HAVING", "ORDER", "SELECT", "UNION", "WHERE", "WITH",
+    ];
+    for kw in reserved_kws {
+        assert!(snowflake()
+            .parse_sql_statements(&format!("SELECT * FROM tbl {kw}"))
+            .is_err());
+    }
+
+    // LIMIT is alias
+    snowflake().one_statement_parses_to("SELECT * FROM tbl LIMIT", "SELECT * FROM tbl AS LIMIT");
+    // LIMIT is not an alias
+    snowflake().verified_stmt("SELECT * FROM tbl LIMIT 1");
+    snowflake().verified_stmt("SELECT * FROM tbl LIMIT $1");
+    snowflake().verified_stmt("SELECT * FROM tbl LIMIT ''");
+    snowflake().verified_stmt("SELECT * FROM tbl LIMIT NULL");
+    snowflake().verified_stmt("SELECT * FROM tbl LIMIT $$$$");
+}
+
+#[test]
+fn test_sql_keywords_as_table_factor() {
+    // LIMIT is a table factor, Snowflake does not reserve it
+    snowflake().one_statement_parses_to("SELECT * FROM tbl, LIMIT", "SELECT * FROM tbl, LIMIT");
+    // LIMIT is not a table factor
+    snowflake().one_statement_parses_to("SELECT * FROM tbl, LIMIT 1", "SELECT * FROM tbl LIMIT 1");
+    // ORDER is reserved
+    assert!(snowflake()
+        .parse_sql_statements("SELECT * FROM tbl, order")
+        .is_err());
+}
+
+#[test]
+fn test_timetravel_at_before() {
+    snowflake().verified_only_select("SELECT * FROM tbl AT(TIMESTAMP => '2024-12-15 00:00:00')");
+    snowflake()
+        .verified_only_select("SELECT * FROM tbl BEFORE(TIMESTAMP => '2024-12-15 00:00:00')");
+}
+
+#[test]
+fn test_grant_account_global_privileges() {
+    let privileges = vec![
+        "ALL",
+        "ALL PRIVILEGES",
+        "ATTACH POLICY",
+        "AUDIT",
+        "BIND SERVICE ENDPOINT",
+        "IMPORT SHARE",
+        "OVERRIDE SHARE RESTRICTIONS",
+        "PURCHASE DATA EXCHANGE LISTING",
+        "RESOLVE ALL",
+        "READ SESSION",
+    ];
+    let with_grant_options = vec!["", " WITH GRANT OPTION"];
+
+    for p in &privileges {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT {p} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+
+    let create_object_types = vec![
+        "ACCOUNT",
+        "APPLICATION",
+        "APPLICATION PACKAGE",
+        "COMPUTE POOL",
+        "DATA EXCHANGE LISTING",
+        "DATABASE",
+        "EXTERNAL VOLUME",
+        "FAILOVER GROUP",
+        "INTEGRATION",
+        "NETWORK POLICY",
+        "ORGANIZATION LISTING",
+        "REPLICATION GROUP",
+        "ROLE",
+        "SHARE",
+        "USER",
+        "WAREHOUSE",
+    ];
+    for t in &create_object_types {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT CREATE {t} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+
+    let apply_types = vec![
+        "AGGREGATION POLICY",
+        "AUTHENTICATION POLICY",
+        "JOIN POLICY",
+        "MASKING POLICY",
+        "PACKAGES POLICY",
+        "PASSWORD POLICY",
+        "PROJECTION POLICY",
+        "ROW ACCESS POLICY",
+        "SESSION POLICY",
+        "TAG",
+    ];
+    for t in &apply_types {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT APPLY {t} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+
+    let execute_types = vec![
+        "ALERT",
+        "DATA METRIC FUNCTION",
+        "MANAGED ALERT",
+        "MANAGED TASK",
+        "TASK",
+    ];
+    for t in &execute_types {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT EXECUTE {t} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+
+    let manage_types = vec![
+        "ACCOUNT SUPPORT CASES",
+        "EVENT SHARING",
+        "GRANTS",
+        "LISTING AUTO FULFILLMENT",
+        "ORGANIZATION SUPPORT CASES",
+        "USER SUPPORT CASES",
+        "WAREHOUSES",
+    ];
+    for t in &manage_types {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT MANAGE {t} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+
+    let monitor_types = vec!["EXECUTION", "SECURITY", "USAGE"];
+    for t in &monitor_types {
+        for wgo in &with_grant_options {
+            let sql = format!("GRANT MONITOR {t} ON ACCOUNT TO ROLE role1{wgo}");
+            snowflake_and_generic().verified_stmt(&sql);
+        }
+    }
+}
+
+#[test]
+fn test_grant_account_object_privileges() {
+    let privileges = vec![
+        "ALL",
+        "ALL PRIVILEGES",
+        "APPLYBUDGET",
+        "MODIFY",
+        "MONITOR",
+        "USAGE",
+        "OPERATE",
+    ];
+
+    let objects_types = vec![
+        "USER",
+        "RESOURCE MONITOR",
+        "WAREHOUSE",
+        "COMPUTE POOL",
+        "DATABASE",
+        "INTEGRATION",
+        "CONNECTION",
+        "FAILOVER GROUP",
+        "REPLICATION GROUP",
+        "EXTERNAL VOLUME",
+    ];
+
+    let with_grant_options = vec!["", " WITH GRANT OPTION"];
+
+    for t in &objects_types {
+        for p in &privileges {
+            for wgo in &with_grant_options {
+                let sql = format!("GRANT {p} ON {t} obj1 TO ROLE role1{wgo}");
+                snowflake_and_generic().verified_stmt(&sql);
+            }
+        }
+    }
+}
+
+#[test]
+fn test_grant_role_to() {
+    snowflake_and_generic().verified_stmt("GRANT ROLE r1 TO ROLE r2");
+    snowflake_and_generic().verified_stmt("GRANT ROLE r1 TO USER u1");
+}
+
+#[test]
+fn test_grant_database_role_to() {
+    snowflake_and_generic().verified_stmt("GRANT DATABASE ROLE r1 TO ROLE r2");
+    snowflake_and_generic().verified_stmt("GRANT DATABASE ROLE db1.sc1.r1 TO ROLE db1.sc1.r2");
+}
+
+#[test]
+fn test_alter_session() {
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("ALTER SESSION SET")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: expected at least one option"
+    );
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("ALTER SESSION UNSET")
+            .unwrap_err()
+            .to_string(),
+        "sql parser error: expected at least one option"
+    );
+
+    snowflake().verified_stmt("ALTER SESSION SET AUTOCOMMIT=TRUE");
+    snowflake().verified_stmt("ALTER SESSION SET AUTOCOMMIT=FALSE QUERY_TAG='tag'");
+    snowflake().verified_stmt("ALTER SESSION UNSET AUTOCOMMIT");
+    snowflake().verified_stmt("ALTER SESSION UNSET AUTOCOMMIT, QUERY_TAG");
+    snowflake().one_statement_parses_to(
+        "ALTER SESSION SET A=false, B='tag';",
+        "ALTER SESSION SET A=FALSE B='tag'",
+    );
+    snowflake().one_statement_parses_to(
+        "ALTER SESSION SET A=true \nB='tag'",
+        "ALTER SESSION SET A=TRUE B='tag'",
+    );
+    snowflake().one_statement_parses_to("ALTER SESSION UNSET a\nB", "ALTER SESSION UNSET a, B");
+}
+
+#[test]
+fn test_alter_session_followed_by_statement() {
+    let stmts = snowflake()
+        .parse_sql_statements("ALTER SESSION SET QUERY_TAG='hello'; SELECT 42")
+        .unwrap();
+    match stmts[..] {
+        [Statement::AlterSession { .. }, Statement::Query { .. }] => {}
+        _ => panic!("Unexpected statements: {stmts:?}"),
+    }
+}
+
+#[test]
+fn test_nested_join_without_parentheses() {
+    let query = "SELECT DISTINCT p.product_id FROM orders AS o INNER JOIN customers AS c INNER JOIN products AS p ON p.customer_id = c.customer_id ON c.order_id = o.order_id";
+    assert_eq!(
+        only(
+            snowflake()
+                .verified_only_select_with_canonical(query, "SELECT DISTINCT p.product_id FROM orders AS o INNER JOIN (customers AS c INNER JOIN products AS p ON p.customer_id = c.customer_id) ON c.order_id = o.order_id")
+                .from
+        )
+        .joins,
+        vec![Join {
+            relation: TableFactor::NestedJoin {
+                table_with_joins: Box::new(TableWithJoins {
+                    relation: TableFactor::Table {
+                        name: ObjectName::from(vec![Ident::new("customers".to_string())]),
+                        alias: Some(TableAlias {
+                            name: Ident {
+                                value: "c".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            },
+                            columns: vec![],
+                        }),
+                        args: None,
+                        with_hints: vec![],
+                        version: None,
+                        partitions: vec![],
+                        with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
+                    },
+                    joins: vec![Join {
+                        relation: TableFactor::Table {
+                            name: ObjectName::from(vec![Ident::new("products".to_string())]),
+                            alias: Some(TableAlias {
+                                name: Ident {
+                                    value: "p".to_string(),
+                                    quote_style: None,
+                                    span: Span::empty(),
+                                },
+                                columns: vec![],
+                            }),
+                            args: None,
+                            with_hints: vec![],
+                            version: None,
+                            partitions: vec![],
+                            with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
+                        },
+                        global: false,
+                        join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+                            left: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("p".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                            op: BinaryOperator::Eq,
+                            right: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("c".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                        })),
+                    }]
+                }),
+                alias: None
+            },
+            global: false,
+            join_operator: JoinOperator::Inner(JoinConstraint::On(Expr::BinaryOp {
+                left: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("c".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+                op: BinaryOperator::Eq,
+                right: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("o".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+            }))
+        }],
+    );
+
+    let query = "SELECT DISTINCT p.product_id FROM orders AS o JOIN customers AS c JOIN products AS p ON p.customer_id = c.customer_id ON c.order_id = o.order_id";
+    assert_eq!(
+        only(
+            snowflake()
+                .verified_only_select_with_canonical(query, "SELECT DISTINCT p.product_id FROM orders AS o JOIN (customers AS c JOIN products AS p ON p.customer_id = c.customer_id) ON c.order_id = o.order_id")
+                .from
+        )
+        .joins,
+        vec![Join {
+            relation: TableFactor::NestedJoin {
+                table_with_joins: Box::new(TableWithJoins {
+                    relation: TableFactor::Table {
+                        name: ObjectName::from(vec![Ident::new("customers".to_string())]),
+                        alias: Some(TableAlias {
+                            name: Ident {
+                                value: "c".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            },
+                            columns: vec![],
+                        }),
+                        args: None,
+                        with_hints: vec![],
+                        version: None,
+                        partitions: vec![],
+                        with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
+                    },
+                    joins: vec![Join {
+                        relation: TableFactor::Table {
+                            name: ObjectName::from(vec![Ident::new("products".to_string())]),
+                            alias: Some(TableAlias {
+                                name: Ident {
+                                    value: "p".to_string(),
+                                    quote_style: None,
+                                    span: Span::empty(),
+                                },
+                                columns: vec![],
+                            }),
+                            args: None,
+                            with_hints: vec![],
+                            version: None,
+                            partitions: vec![],
+                            with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
+                        },
+                        global: false,
+                        join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
+                            left: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("p".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                            op: BinaryOperator::Eq,
+                            right: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("c".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                        })),
+                    }]
+                }),
+                alias: None
+            },
+            global: false,
+            join_operator: JoinOperator::Join(JoinConstraint::On(Expr::BinaryOp {
+                left: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("c".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+                op: BinaryOperator::Eq,
+                right: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("o".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+            }))
+        }],
+    );
+
+    let query = "SELECT DISTINCT p.product_id FROM orders AS o LEFT JOIN customers AS c LEFT JOIN products AS p ON p.customer_id = c.customer_id ON c.order_id = o.order_id";
+    assert_eq!(
+        only(
+            snowflake()
+                .verified_only_select_with_canonical(query, "SELECT DISTINCT p.product_id FROM orders AS o LEFT JOIN (customers AS c LEFT JOIN products AS p ON p.customer_id = c.customer_id) ON c.order_id = o.order_id")
+                .from
+        )
+        .joins,
+        vec![Join {
+            relation: TableFactor::NestedJoin {
+                table_with_joins: Box::new(TableWithJoins {
+                    relation: TableFactor::Table {
+                        name: ObjectName::from(vec![Ident::new("customers".to_string())]),
+                        alias: Some(TableAlias {
+                            name: Ident {
+                                value: "c".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            },
+                            columns: vec![],
+                        }),
+                        args: None,
+                        with_hints: vec![],
+                        version: None,
+                        partitions: vec![],
+                        with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
+                    },
+                    joins: vec![Join {
+                        relation: TableFactor::Table {
+                            name: ObjectName::from(vec![Ident::new("products".to_string())]),
+                            alias: Some(TableAlias {
+                                name: Ident {
+                                    value: "p".to_string(),
+                                    quote_style: None,
+                                    span: Span::empty(),
+                                },
+                                columns: vec![],
+                            }),
+                            args: None,
+                            with_hints: vec![],
+                            version: None,
+                            partitions: vec![],
+                            with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
+                        },
+                        global: false,
+                        join_operator: JoinOperator::Left(JoinConstraint::On(Expr::BinaryOp {
+                            left: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("p".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                            op: BinaryOperator::Eq,
+                            right: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("c".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                        })),
+                    }]
+                }),
+                alias: None
+            },
+            global: false,
+            join_operator: JoinOperator::Left(JoinConstraint::On(Expr::BinaryOp {
+                left: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("c".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+                op: BinaryOperator::Eq,
+                right: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("o".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+            }))
+        }],
+    );
+
+    let query = "SELECT DISTINCT p.product_id FROM orders AS o RIGHT JOIN customers AS c RIGHT JOIN products AS p ON p.customer_id = c.customer_id ON c.order_id = o.order_id";
+    assert_eq!(
+        only(
+            snowflake()
+                .verified_only_select_with_canonical(query, "SELECT DISTINCT p.product_id FROM orders AS o RIGHT JOIN (customers AS c RIGHT JOIN products AS p ON p.customer_id = c.customer_id) ON c.order_id = o.order_id")
+                .from
+        )
+        .joins,
+        vec![Join {
+            relation: TableFactor::NestedJoin {
+                table_with_joins: Box::new(TableWithJoins {
+                    relation: TableFactor::Table {
+                        name: ObjectName::from(vec![Ident::new("customers".to_string())]),
+                        alias: Some(TableAlias {
+                            name: Ident {
+                                value: "c".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            },
+                            columns: vec![],
+                        }),
+                        args: None,
+                        with_hints: vec![],
+                        version: None,
+                        partitions: vec![],
+                        with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
+                    },
+                    joins: vec![Join {
+                        relation: TableFactor::Table {
+                            name: ObjectName::from(vec![Ident::new("products".to_string())]),
+                            alias: Some(TableAlias {
+                                name: Ident {
+                                    value: "p".to_string(),
+                                    quote_style: None,
+                                    span: Span::empty(),
+                                },
+                                columns: vec![],
+                            }),
+                            args: None,
+                            with_hints: vec![],
+                            version: None,
+                            partitions: vec![],
+                            with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
+                        },
+                        global: false,
+                        join_operator: JoinOperator::Right(JoinConstraint::On(Expr::BinaryOp {
+                            left: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("p".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                            op: BinaryOperator::Eq,
+                            right: Box::new(Expr::CompoundIdentifier(vec![
+                                Ident::new("c".to_string()),
+                                Ident::new("customer_id".to_string())
+                            ])),
+                        })),
+                    }]
+                }),
+                alias: None
+            },
+            global: false,
+            join_operator: JoinOperator::Right(JoinConstraint::On(Expr::BinaryOp {
+                left: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("c".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+                op: BinaryOperator::Eq,
+                right: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("o".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+            }))
+        }],
+    );
+
+    let query = "SELECT DISTINCT p.product_id FROM orders AS o FULL JOIN customers AS c FULL JOIN products AS p ON p.customer_id = c.customer_id ON c.order_id = o.order_id";
+    assert_eq!(
+        only(
+            snowflake()
+                .verified_only_select_with_canonical(query, "SELECT DISTINCT p.product_id FROM orders AS o FULL JOIN (customers AS c FULL JOIN products AS p ON p.customer_id = c.customer_id) ON c.order_id = o.order_id")
+                .from
+        )
+        .joins,
+        vec![Join {
+            relation: TableFactor::NestedJoin {
+                table_with_joins: Box::new(TableWithJoins {
+                    relation: TableFactor::Table {
+                        name: ObjectName::from(vec![Ident::new("customers".to_string())]),
+                        alias: Some(TableAlias {
+                            name: Ident {
+                                value: "c".to_string(),
+                                quote_style: None,
+                                span: Span::empty(),
+                            },
+                            columns: vec![],
+                        }),
+                        args: None,
+                        with_hints: vec![],
+                        version: None,
+                        partitions: vec![],
+                        with_ordinality: false,
+                        json_path: None,
+                        sample: None,
+                        index_hints: vec![],
+                    },
+                    joins: vec![Join {
+                        relation: TableFactor::Table {
+                            name: ObjectName::from(vec![Ident::new("products".to_string())]),
+                            alias: Some(TableAlias {
+                                name: Ident {
+                                    value: "p".to_string(),
+                                    quote_style: None,
+                                    span: Span::empty(),
+                                },
+                                columns: vec![],
+                            }),
+                            args: None,
+                            with_hints: vec![],
+                            version: None,
+                            partitions: vec![],
+                            with_ordinality: false,
+                            json_path: None,
+                            sample: None,
+                            index_hints: vec![],
+                        },
+                        global: false,
+                        join_operator: JoinOperator::FullOuter(JoinConstraint::On(
+                            Expr::BinaryOp {
+                                left: Box::new(Expr::CompoundIdentifier(vec![
+                                    Ident::new("p".to_string()),
+                                    Ident::new("customer_id".to_string())
+                                ])),
+                                op: BinaryOperator::Eq,
+                                right: Box::new(Expr::CompoundIdentifier(vec![
+                                    Ident::new("c".to_string()),
+                                    Ident::new("customer_id".to_string())
+                                ])),
+                            }
+                        )),
+                    }]
+                }),
+                alias: None
+            },
+            global: false,
+            join_operator: JoinOperator::FullOuter(JoinConstraint::On(Expr::BinaryOp {
+                left: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("c".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+                op: BinaryOperator::Eq,
+                right: Box::new(Expr::CompoundIdentifier(vec![
+                    Ident::new("o".to_string()),
+                    Ident::new("order_id".to_string())
+                ])),
+            }))
+        }],
+    );
+}
+
+#[test]
+fn parse_connect_by_root_operator() {
+    let sql = "SELECT CONNECT_BY_ROOT name AS root_name FROM Tbl1";
+
+    match snowflake().verified_stmt(sql) {
+        Statement::Query(query) => {
+            assert_eq!(
+                query.body.as_select().unwrap().projection[0],
+                SelectItem::ExprWithAlias {
+                    expr: Expr::Prefixed {
+                        prefix: Ident::new("CONNECT_BY_ROOT"),
+                        value: Box::new(Expr::Identifier(Ident::new("name")))
+                    },
+                    alias: Ident::new("root_name"),
+                }
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    let sql = "SELECT CONNECT_BY_ROOT name FROM Tbl2";
+    match snowflake().verified_stmt(sql) {
+        Statement::Query(query) => {
+            assert_eq!(
+                query.body.as_select().unwrap().projection[0],
+                SelectItem::UnnamedExpr(Expr::Prefixed {
+                    prefix: Ident::new("CONNECT_BY_ROOT"),
+                    value: Box::new(Expr::Identifier(Ident::new("name")))
+                })
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    let sql = "SELECT CONNECT_BY_ROOT FROM Tbl2";
+    let res = snowflake().parse_sql_statements(sql);
+    assert_eq!(
+        res.unwrap_err().to_string(),
+        "sql parser error: Expected an expression, found: FROM"
+    );
+}
+
+#[test]
+fn test_begin_exception_end() {
+    for sql in [
+        "BEGIN SELECT 1; EXCEPTION WHEN OTHER THEN SELECT 2; RAISE; END",
+        "BEGIN SELECT 1; EXCEPTION WHEN OTHER THEN SELECT 2; RAISE EX_1; END",
+        "BEGIN SELECT 1; EXCEPTION WHEN FOO THEN SELECT 2; WHEN OTHER THEN SELECT 3; RAISE; END",
+        "BEGIN BEGIN SELECT 1; EXCEPTION WHEN OTHER THEN SELECT 2; RAISE; END; END",
+    ] {
+        snowflake().verified_stmt(sql);
+    }
+
+    let sql = r#"
+DECLARE
+  EXCEPTION_1 EXCEPTION (-20001, 'I caught the expected exception.');
+  EXCEPTION_2 EXCEPTION (-20002, 'Not the expected exception!');
+  EXCEPTION_3 EXCEPTION (-20003, 'The worst exception...');
+BEGIN
+    BEGIN
+        SELECT 1;
+    EXCEPTION
+        WHEN EXCEPTION_1 THEN
+            SELECT 1;
+        WHEN EXCEPTION_2 OR EXCEPTION_3 THEN
+            SELECT 2;
+            SELECT 3;
+        WHEN OTHER THEN
+            SELECT 4;
+    RAISE;
+    END;
+END
+"#;
+
+    // Outer `BEGIN` of the two nested `BEGIN` statements.
+    let Statement::StartTransaction { mut statements, .. } = snowflake()
+        .parse_sql_statements(sql)
+        .unwrap()
+        .pop()
+        .unwrap()
+    else {
+        unreachable!();
+    };
+
+    // Inner `BEGIN` of the two nested `BEGIN` statements.
+    let Statement::StartTransaction {
+        statements,
+        exception,
+        has_end_keyword,
+        ..
+    } = statements.pop().unwrap()
+    else {
+        unreachable!();
+    };
+
+    assert_eq!(1, statements.len());
+    assert!(has_end_keyword);
+
+    let exception = exception.unwrap();
+    assert_eq!(3, exception.len());
+    assert_eq!(1, exception[0].idents.len());
+    assert_eq!(1, exception[0].statements.len());
+    assert_eq!(2, exception[1].idents.len());
+    assert_eq!(2, exception[1].statements.len());
+}
+
+#[test]
+fn test_snowflake_fetch_clause_syntax() {
+    let canonical = "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS ONLY";
+    snowflake().verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2", canonical);
+
+    snowflake()
+        .verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH FIRST 2", canonical);
+    snowflake()
+        .verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH NEXT 2", canonical);
+
+    snowflake()
+        .verified_only_select_with_canonical("SELECT c1 FROM fetch_test FETCH 2 ROW", canonical);
+
+    snowflake().verified_only_select_with_canonical(
+        "SELECT c1 FROM fetch_test FETCH FIRST 2 ROWS",
+        canonical,
+    );
+}
+
+#[test]
+fn test_snowflake_create_view_with_multiple_column_options() {
+    let create_view_with_tag =
+        r#"CREATE VIEW X (COL WITH TAG (pii='email') COMMENT 'foobar') AS SELECT * FROM Y"#;
+    snowflake().verified_stmt(create_view_with_tag);
+}
+
+#[test]
+fn test_snowflake_create_view_with_composite_tag() {
+    let create_view_with_tag =
+        r#"CREATE VIEW X (COL WITH TAG (foo.bar.baz.pii='email')) AS SELECT * FROM Y"#;
+    snowflake().verified_stmt(create_view_with_tag);
+}
+
+#[test]
+fn test_snowflake_create_view_with_composite_policy_name() {
+    let create_view_with_tag =
+        r#"CREATE VIEW X (COL WITH MASKING POLICY foo.bar.baz) AS SELECT * FROM Y"#;
+    snowflake().verified_stmt(create_view_with_tag);
+}
+
+#[test]
+fn test_snowflake_identifier_function() {
+    // Using IDENTIFIER to reference a column
+    match &snowflake()
+        .verified_only_select("SELECT identifier('email') FROM customers")
+        .projection[0]
+    {
+        SelectItem::UnnamedExpr(Expr::Function(Function { name, args, .. })) => {
+            assert_eq!(*name, ObjectName::from(vec![Ident::new("identifier")]));
+            assert_eq!(
+                *args,
+                FunctionArguments::List(FunctionArgumentList {
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        Value::SingleQuotedString("email".to_string()).into()
+                    )))],
+                    clauses: vec![],
+                    duplicate_treatment: None
+                })
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Using IDENTIFIER to reference a case-sensitive column
+    match &snowflake()
+        .verified_only_select(r#"SELECT identifier('"Email"') FROM customers"#)
+        .projection[0]
+    {
+        SelectItem::UnnamedExpr(Expr::Function(Function { name, args, .. })) => {
+            assert_eq!(*name, ObjectName::from(vec![Ident::new("identifier")]));
+            assert_eq!(
+                *args,
+                FunctionArguments::List(FunctionArgumentList {
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        Value::SingleQuotedString("\"Email\"".to_string()).into()
+                    )))],
+                    clauses: vec![],
+                    duplicate_treatment: None
+                })
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Using IDENTIFIER to reference an alias of a table
+    match &snowflake()
+        .verified_only_select("SELECT identifier('alias1').* FROM tbl AS alias1")
+        .projection[0]
+    {
+        SelectItem::QualifiedWildcard(
+            SelectItemQualifiedWildcardKind::Expr(Expr::Function(Function { name, args, .. })),
+            _,
+        ) => {
+            assert_eq!(*name, ObjectName::from(vec![Ident::new("identifier")]));
+            assert_eq!(
+                *args,
+                FunctionArguments::List(FunctionArgumentList {
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        Value::SingleQuotedString("alias1".to_string()).into()
+                    )))],
+                    clauses: vec![],
+                    duplicate_treatment: None
+                })
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Using IDENTIFIER to reference a database
+    match snowflake().verified_stmt("CREATE DATABASE IDENTIFIER('tbl')") {
+        Statement::CreateDatabase { db_name, .. } => {
+            assert_eq!(
+                db_name,
+                ObjectName(vec![ObjectNamePart::Function(ObjectNamePartFunction {
+                    name: Ident::new("IDENTIFIER"),
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        Value::SingleQuotedString("tbl".to_string()).into()
+                    )))]
+                })])
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Using IDENTIFIER to reference a schema
+    match snowflake().verified_stmt("CREATE SCHEMA IDENTIFIER('db1.sc1')") {
+        Statement::CreateSchema { schema_name, .. } => {
+            assert_eq!(
+                schema_name,
+                SchemaName::Simple(ObjectName(vec![ObjectNamePart::Function(
+                    ObjectNamePartFunction {
+                        name: Ident::new("IDENTIFIER"),
+                        args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                            Value::SingleQuotedString("db1.sc1".to_string()).into()
+                        )))]
+                    }
+                )]))
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Using IDENTIFIER to reference a table
+    match snowflake().verified_stmt("CREATE TABLE IDENTIFIER('tbl') (id INT)") {
+        Statement::CreateTable(CreateTable { name, .. }) => {
+            assert_eq!(
+                name,
+                ObjectName(vec![ObjectNamePart::Function(ObjectNamePartFunction {
+                    name: Ident::new("IDENTIFIER"),
+                    args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(Expr::Value(
+                        Value::SingleQuotedString("tbl".to_string()).into()
+                    )))]
+                })])
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // Cannot have more than one IDENTIFIER part in an object name
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements(
+                "CREATE TABLE IDENTIFIER('db1').IDENTIFIER('sc1').IDENTIFIER('tbl') (id INT)"
+            )
+            .is_err(),
+        true
+    );
+    assert_eq!(
+        snowflake()
+            .parse_sql_statements("CREATE TABLE IDENTIFIER('db1')..IDENTIFIER('tbl') (id INT)")
+            .is_err(),
+        true
+    );
+
+    snowflake().verified_stmt("GRANT ROLE IDENTIFIER('AAA') TO USER IDENTIFIER('AAA')");
+    snowflake().verified_stmt("REVOKE ROLE IDENTIFIER('AAA') FROM USER IDENTIFIER('AAA')");
+}
+
+#[test]
+fn test_create_database() {
+    snowflake().verified_stmt("CREATE DATABASE my_db");
+    snowflake().verified_stmt("CREATE OR REPLACE DATABASE my_db");
+    snowflake().verified_stmt("CREATE TRANSIENT DATABASE IF NOT EXISTS my_db");
+    snowflake().verified_stmt("CREATE DATABASE my_db CLONE src_db");
+    snowflake().verified_stmt(
+        "CREATE OR REPLACE DATABASE my_db CLONE src_db DATA_RETENTION_TIME_IN_DAYS = 1",
+    );
+    snowflake().one_statement_parses_to(
+        r#"
+        CREATE OR REPLACE TRANSIENT DATABASE IF NOT EXISTS my_db
+        CLONE src_db
+        DATA_RETENTION_TIME_IN_DAYS = 1
+        MAX_DATA_EXTENSION_TIME_IN_DAYS = 5
+        EXTERNAL_VOLUME = 'volume1'
+        CATALOG = 'my_catalog'
+        REPLACE_INVALID_CHARACTERS = TRUE
+        DEFAULT_DDL_COLLATION = 'en-ci'
+        STORAGE_SERIALIZATION_POLICY = COMPATIBLE
+        COMMENT = 'This is my database'
+        CATALOG_SYNC = 'sync_integration'
+        CATALOG_SYNC_NAMESPACE_MODE = NEST
+        CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER = '/'
+        WITH TAG (env = 'prod', team = 'data')
+        WITH CONTACT (owner = 'admin', dpo = 'compliance')
+    "#,
+        "CREATE OR REPLACE TRANSIENT DATABASE IF NOT EXISTS \
+        my_db CLONE src_db DATA_RETENTION_TIME_IN_DAYS = 1 MAX_DATA_EXTENSION_TIME_IN_DAYS = 5 \
+        EXTERNAL_VOLUME = 'volume1' CATALOG = 'my_catalog' \
+        REPLACE_INVALID_CHARACTERS = TRUE DEFAULT_DDL_COLLATION = 'en-ci' \
+        STORAGE_SERIALIZATION_POLICY = COMPATIBLE COMMENT = 'This is my database' \
+        CATALOG_SYNC = 'sync_integration' CATALOG_SYNC_NAMESPACE_MODE = NEST \
+        CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER = '/' \
+        WITH TAG (env='prod', team='data') \
+        WITH CONTACT (owner = admin, dpo = compliance)",
+    );
+
+    let err = snowflake()
+        .parse_sql_statements("CREATE DATABASE")
+        .unwrap_err()
+        .to_string();
+    assert!(err.contains("Expected"), "Unexpected error: {err}");
+
+    let err = snowflake()
+        .parse_sql_statements("CREATE DATABASE my_db CLONE")
+        .unwrap_err()
+        .to_string();
+    assert!(err.contains("Expected"), "Unexpected error: {err}");
+}
diff --git a/tests/sqlparser_sqlite.rs b/tests/sqlparser_sqlite.rs
index 6f8e654dc..06496f0ce 100644
--- a/tests/sqlparser_sqlite.rs
+++ b/tests/sqlparser_sqlite.rs
@@ -214,7 +214,6 @@ fn parse_create_table_auto_increment() {
                 vec![ColumnDef {
                     name: "bar".into(),
                     data_type: DataType::Int(None),
-                    collation: None,
                     options: vec![
                         ColumnOptionDef {
                             name: None,
@@ -243,7 +242,6 @@ fn parse_create_table_primary_key_asc_desc() {
     let expected_column_def = |kind| ColumnDef {
         name: "bar".into(),
         data_type: DataType::Int(None),
-        collation: None,
         options: vec![
             ColumnOptionDef {
                 name: None,
@@ -286,13 +284,11 @@ fn parse_create_sqlite_quote() {
                     ColumnDef {
                         name: Ident::with_quote('"', "KEY"),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                     ColumnDef {
                         name: Ident::with_quote('[', "INDEX"),
                         data_type: DataType::Int(None),
-                        collation: None,
                         options: vec![],
                     },
                 ],
@@ -328,7 +324,7 @@ fn parse_create_table_on_conflict_col() {
         Keyword::IGNORE,
         Keyword::REPLACE,
     ] {
-        let sql = format!("CREATE TABLE t1 (a INT, b INT ON CONFLICT {:?})", keyword);
+        let sql = format!("CREATE TABLE t1 (a INT, b INT ON CONFLICT {keyword:?})");
         match sqlite_and_generic().verified_stmt(&sql) {
             Statement::CreateTable(CreateTable { columns, .. }) => {
                 assert_eq!(
@@ -373,7 +369,9 @@ fn test_placeholder() {
     let ast = sqlite().verified_only_select(sql);
     assert_eq!(
         ast.projection[0],
-        UnnamedExpr(Expr::Value(Value::Placeholder("@xxx".into()))),
+        UnnamedExpr(Expr::Value(
+            (Value::Placeholder("@xxx".into())).with_empty_span()
+        )),
     );
 }
 
@@ -412,13 +410,14 @@ fn parse_window_function_with_filter() {
         "count",
         "user_defined_function",
     ] {
-        let sql = format!("SELECT {}(x) FILTER (WHERE y) OVER () FROM t", func_name);
+        let sql = format!("SELECT {func_name}(x) FILTER (WHERE y) OVER () FROM t");
         let select = sqlite().verified_only_select(&sql);
         assert_eq!(select.to_string(), sql);
         assert_eq!(
             select.projection,
             vec![SelectItem::UnnamedExpr(Expr::Function(Function {
-                name: ObjectName(vec![Ident::new(func_name)]),
+                name: ObjectName::from(vec![Ident::new(func_name)]),
+                uses_odbc_syntax: false,
                 parameters: FunctionArguments::None,
                 args: FunctionArguments::List(FunctionArgumentList {
                     duplicate_treatment: None,
@@ -445,11 +444,15 @@ fn parse_window_function_with_filter() {
 fn parse_attach_database() {
     let sql = "ATTACH DATABASE 'test.db' AS test";
     let verified_stmt = sqlite().verified_stmt(sql);
-    assert_eq!(sql, format!("{}", verified_stmt));
+    assert_eq!(sql, format!("{verified_stmt}"));
     match verified_stmt {
         Statement::AttachDatabase {
             schema_name,
-            database_file_name: Expr::Value(Value::SingleQuotedString(literal_name)),
+            database_file_name:
+                Expr::Value(ValueWithSpan {
+                    value: Value::SingleQuotedString(literal_name),
+                    span: _,
+                }),
             database: true,
         } => {
             assert_eq!(schema_name.value, "test");
@@ -468,25 +471,17 @@ fn parse_update_tuple_row_values() {
             or: None,
             assignments: vec![Assignment {
                 target: AssignmentTarget::Tuple(vec![
-                    ObjectName(vec![Ident::new("a"),]),
-                    ObjectName(vec![Ident::new("b"),]),
+                    ObjectName::from(vec![Ident::new("a"),]),
+                    ObjectName::from(vec![Ident::new("b"),]),
                 ]),
                 value: Expr::Tuple(vec![
-                    Expr::Value(Value::Number("1".parse().unwrap(), false)),
-                    Expr::Value(Value::Number("2".parse().unwrap(), false))
+                    Expr::Value((Value::Number("1".parse().unwrap(), false)).with_empty_span()),
+                    Expr::Value((Value::Number("2".parse().unwrap(), false)).with_empty_span())
                 ])
             }],
             selection: None,
             table: TableWithJoins {
-                relation: TableFactor::Table {
-                    name: ObjectName(vec![Ident::new("x")]),
-                    alias: None,
-                    args: None,
-                    with_hints: vec![],
-                    version: None,
-                    partitions: vec![],
-                    with_ordinality: false,
-                },
+                relation: table_from_name(ObjectName::from(vec![Ident::new("x")])),
                 joins: vec![],
             },
             from: None,
@@ -526,32 +521,9 @@ fn parse_start_transaction_with_modifier() {
     sqlite_and_generic().verified_stmt("BEGIN DEFERRED TRANSACTION");
     sqlite_and_generic().verified_stmt("BEGIN IMMEDIATE TRANSACTION");
     sqlite_and_generic().verified_stmt("BEGIN EXCLUSIVE TRANSACTION");
-    sqlite_and_generic().one_statement_parses_to("BEGIN DEFERRED", "BEGIN DEFERRED TRANSACTION");
-    sqlite_and_generic().one_statement_parses_to("BEGIN IMMEDIATE", "BEGIN IMMEDIATE TRANSACTION");
-    sqlite_and_generic().one_statement_parses_to("BEGIN EXCLUSIVE", "BEGIN EXCLUSIVE TRANSACTION");
-
-    let unsupported_dialects = TestedDialects::new(
-        all_dialects()
-            .dialects
-            .into_iter()
-            .filter(|x| !(x.is::<SQLiteDialect>() || x.is::<GenericDialect>()))
-            .collect(),
-    );
-    let res = unsupported_dialects.parse_sql_statements("BEGIN DEFERRED");
-    assert_eq!(
-        ParserError::ParserError("Expected: end of statement, found: DEFERRED".to_string()),
-        res.unwrap_err(),
-    );
-    let res = unsupported_dialects.parse_sql_statements("BEGIN IMMEDIATE");
-    assert_eq!(
-        ParserError::ParserError("Expected: end of statement, found: IMMEDIATE".to_string()),
-        res.unwrap_err(),
-    );
-    let res = unsupported_dialects.parse_sql_statements("BEGIN EXCLUSIVE");
-    assert_eq!(
-        ParserError::ParserError("Expected: end of statement, found: EXCLUSIVE".to_string()),
-        res.unwrap_err(),
-    );
+    sqlite_and_generic().verified_stmt("BEGIN DEFERRED");
+    sqlite_and_generic().verified_stmt("BEGIN IMMEDIATE");
+    sqlite_and_generic().verified_stmt("BEGIN EXCLUSIVE");
 }
 
 #[test]
@@ -564,12 +536,62 @@ fn test_dollar_identifier_as_placeholder() {
         Expr::BinaryOp { op, left, right } => {
             assert_eq!(op, BinaryOperator::Eq);
             assert_eq!(left, Box::new(Expr::Identifier(Ident::new("id"))));
-            assert_eq!(right, Box::new(Expr::Value(Placeholder("$id".to_string()))));
+            assert_eq!(
+                right,
+                Box::new(Expr::Value(
+                    (Placeholder("$id".to_string())).with_empty_span()
+                ))
+            );
+        }
+        _ => unreachable!(),
+    }
+
+    // $$ is a valid placeholder in SQLite
+    match sqlite().verified_expr("id = $$") {
+        Expr::BinaryOp { op, left, right } => {
+            assert_eq!(op, BinaryOperator::Eq);
+            assert_eq!(left, Box::new(Expr::Identifier(Ident::new("id"))));
+            assert_eq!(
+                right,
+                Box::new(Expr::Value(
+                    (Placeholder("$$".to_string())).with_empty_span()
+                ))
+            );
         }
         _ => unreachable!(),
     }
 }
 
+#[test]
+fn test_match_operator() {
+    assert_eq!(
+        sqlite().verified_expr("col MATCH 'pattern'"),
+        Expr::BinaryOp {
+            op: BinaryOperator::Match,
+            left: Box::new(Expr::Identifier(Ident::new("col"))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("pattern".to_string())).with_empty_span()
+            ))
+        }
+    );
+    sqlite().verified_only_select("SELECT * FROM email WHERE email MATCH 'fts5'");
+}
+
+#[test]
+fn test_regexp_operator() {
+    assert_eq!(
+        sqlite().verified_expr("col REGEXP 'pattern'"),
+        Expr::BinaryOp {
+            op: BinaryOperator::Regexp,
+            left: Box::new(Expr::Identifier(Ident::new("col"))),
+            right: Box::new(Expr::Value(
+                (Value::SingleQuotedString("pattern".to_string())).with_empty_span()
+            ))
+        }
+    );
+    sqlite().verified_only_select(r#"SELECT count(*) FROM messages WHERE msg_text REGEXP '\d+'"#);
+}
+
 fn sqlite() -> TestedDialects {
     TestedDialects::new(vec![Box::new(SQLiteDialect {})])
 }
